| #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); |
| } |