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