#include <math.h> | |
#include <stdint.h> | |
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); | |
} |