Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 1 | #include <math.h> |
Rich Felker | b69f695 | 2012-03-13 01:17:53 -0400 | [diff] [blame] | 2 | #include <stdint.h> |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 3 | |
| 4 | double frexp(double x, int *e) |
| 5 | { |
| 6 | union { double d; uint64_t i; } y = { x }; |
| 7 | int ee = y.i>>52 & 0x7ff; |
| 8 | |
| 9 | if (!ee) { |
| 10 | if (x) { |
| 11 | x = frexp(x*0x1p64, e); |
| 12 | *e -= 64; |
| 13 | } else *e = 0; |
| 14 | return x; |
| 15 | } else if (ee == 0x7ff) { |
| 16 | return x; |
| 17 | } |
| 18 | |
| 19 | *e = ee - 0x3fe; |
| 20 | y.i &= 0x800fffffffffffffull; |
| 21 | y.i |= 0x3fe0000000000000ull; |
| 22 | return y.d; |
| 23 | } |