signal.h: add new sa_flags from linux v5.11
[musl.git] / src / math / frexp.c
blob27b6266ed0c1d7c5dadd06ecc186a994fdcd1c52
1 #include <math.h>
2 #include <stdint.h>
4 double frexp(double x, int *e)
6 union { double d; uint64_t i; } y = { x };
7 int ee = y.i>>52 & 0x7ff;
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;
19 *e = ee - 0x3fe;
20 y.i &= 0x800fffffffffffffull;
21 y.i |= 0x3fe0000000000000ull;
22 return y.d;