blob: 27b6266ed0c1d7c5dadd06ecc186a994fdcd1c52 [file] [log] [blame]
Rich Felker0b44a032011-02-12 00:22:29 -05001#include <math.h>
Rich Felkerb69f6952012-03-13 01:17:53 -04002#include <stdint.h>
Rich Felker0b44a032011-02-12 00:22:29 -05003
4double 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}