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