1 #include <math.h>
2 #include <stdint.h>
3 
hypotf(float x,float y)4 float hypotf(float x, float y) {
5     union {
6         float f;
7         uint32_t i;
8     } ux = {x}, uy = {y}, ut;
9     float_t z;
10 
11     ux.i &= -1U >> 1;
12     uy.i &= -1U >> 1;
13     if (ux.i < uy.i) {
14         ut = ux;
15         ux = uy;
16         uy = ut;
17     }
18 
19     x = ux.f;
20     y = uy.f;
21     if (uy.i == 0xff << 23)
22         return y;
23     if (ux.i >= 0xff << 23 || uy.i == 0 || ux.i - uy.i >= 25 << 23)
24         return x + y;
25 
26     z = 1;
27     if (ux.i >= (0x7f + 60) << 23) {
28         z = 0x1p90f;
29         x *= 0x1p-90f;
30         y *= 0x1p-90f;
31     } else if (uy.i < (0x7f - 60) << 23) {
32         z = 0x1p-90f;
33         x *= 0x1p90f;
34         y *= 0x1p90f;
35     }
36     return z * sqrtf((double)x * x + (double)y * y);
37 }
38