| OLD | NEW |
| 1 #include <math.h> | 1 #include <math.h> |
| 2 #include <stdint.h> | 2 #include <stdint.h> |
| 3 | 3 |
| 4 double frexp(double x, int *e) | 4 double frexp(double x, int* e) { |
| 5 { | 5 union { |
| 6 » union { double d; uint64_t i; } y = { x }; | 6 double d; |
| 7 » int ee = y.i>>52 & 0x7ff; | 7 uint64_t i; |
| 8 } y = {x}; |
| 9 int ee = y.i >> 52 & 0x7ff; |
| 8 | 10 |
| 9 » if (!ee) { | 11 if (!ee) { |
| 10 » » if (x) { | 12 if (x) { |
| 11 » » » x = frexp(x*0x1p64, e); | 13 x = frexp(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 == 0x7ff) { | 17 return x; |
| 16 » » return x; | 18 } else if (ee == 0x7ff) { |
| 17 » } | 19 return x; |
| 20 } |
| 18 | 21 |
| 19 » *e = ee - 0x3fe; | 22 *e = ee - 0x3fe; |
| 20 » y.i &= 0x800fffffffffffffull; | 23 y.i &= 0x800fffffffffffffull; |
| 21 » y.i |= 0x3fe0000000000000ull; | 24 y.i |= 0x3fe0000000000000ull; |
| 22 » return y.d; | 25 return y.d; |
| 23 } | 26 } |
| OLD | NEW |