OLD | NEW |
1 #include <math.h> | 1 #include <math.h> |
2 #include <stdint.h> | 2 #include <stdint.h> |
3 | 3 |
4 float frexpf(float x, int *e) | 4 float frexpf(float x, int* e) { |
5 { | 5 union { |
6 » union { float f; uint32_t i; } y = { x }; | 6 float f; |
7 » int ee = y.i>>23 & 0xff; | 7 uint32_t i; |
| 8 } y = {x}; |
| 9 int ee = y.i >> 23 & 0xff; |
8 | 10 |
9 » if (!ee) { | 11 if (!ee) { |
10 » » if (x) { | 12 if (x) { |
11 » » » x = frexpf(x*0x1p64, e); | 13 x = frexpf(x * 0x1p64, e); |
12 » » » *e -= 64; | 14 *e -= 64; |
13 » » } else *e = 0; | 15 } else |
14 » » return x; | 16 *e = 0; |
15 » } else if (ee == 0xff) { | 17 return x; |
16 » » return x; | 18 } else if (ee == 0xff) { |
17 » } | 19 return x; |
| 20 } |
18 | 21 |
19 » *e = ee - 0x7e; | 22 *e = ee - 0x7e; |
20 » y.i &= 0x807ffffful; | 23 y.i &= 0x807ffffful; |
21 » y.i |= 0x3f000000ul; | 24 y.i |= 0x3f000000ul; |
22 » return y.f; | 25 return y.f; |
23 } | 26 } |
OLD | NEW |