1 #include <math.h>
2 #include <stdint.h>
3 
frexp(double x,int * e)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 }
24