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