1#include <math.h>
2#include <stdint.h>
3
4float 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