Index: fusl/src/math/frexp.c |
diff --git a/fusl/src/math/frexp.c b/fusl/src/math/frexp.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..27b6266ed0c1d7c5dadd06ecc186a994fdcd1c52 |
--- /dev/null |
+++ b/fusl/src/math/frexp.c |
@@ -0,0 +1,23 @@ |
+#include <math.h> |
+#include <stdint.h> |
+ |
+double frexp(double x, int *e) |
+{ |
+ union { double d; uint64_t i; } y = { x }; |
+ int ee = y.i>>52 & 0x7ff; |
+ |
+ if (!ee) { |
+ if (x) { |
+ x = frexp(x*0x1p64, e); |
+ *e -= 64; |
+ } else *e = 0; |
+ return x; |
+ } else if (ee == 0x7ff) { |
+ return x; |
+ } |
+ |
+ *e = ee - 0x3fe; |
+ y.i &= 0x800fffffffffffffull; |
+ y.i |= 0x3fe0000000000000ull; |
+ return y.d; |
+} |