#include // for hypotf, sqrtf, float_t #include // for uint32_t float hypotf(float x, float y) { union { float f; uint32_t i; } ux = { x }, uy = { y }, ut; float_t z; ux.i &= -1U >> 1; uy.i &= -1U >> 1; if (ux.i < uy.i) { ut = ux; ux = uy; uy = ut; } x = ux.f; y = uy.f; if (uy.i == 0xff << 23) return y; if (ux.i >= 0xff << 23 || uy.i == 0 || ux.i - uy.i >= 25 << 23) return x + y; z = 1; if (ux.i >= (0x7f + 60) << 23) { z = 0x1p90f; x *= 0x1p-90f; y *= 0x1p-90f; } else if (uy.i < (0x7f - 60) << 23) { z = 0x1p-90f; x *= 0x1p90f; y *= 0x1p90f; } return z * sqrtf((double)x * x + (double)y * y); }