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