Index: fusl/src/math/scalbnl.c |
diff --git a/fusl/src/math/scalbnl.c b/fusl/src/math/scalbnl.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..08a4c58754d8a237f4441f10b1cce610ef885e43 |
--- /dev/null |
+++ b/fusl/src/math/scalbnl.c |
@@ -0,0 +1,36 @@ |
+#include "libm.h" |
+ |
+#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 |
+long double scalbnl(long double x, int n) |
+{ |
+ return scalbn(x, n); |
+} |
+#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384 |
+long double scalbnl(long double x, int n) |
+{ |
+ union ldshape u; |
+ |
+ if (n > 16383) { |
+ x *= 0x1p16383L; |
+ n -= 16383; |
+ if (n > 16383) { |
+ x *= 0x1p16383L; |
+ n -= 16383; |
+ if (n > 16383) |
+ n = 16383; |
+ } |
+ } else if (n < -16382) { |
+ x *= 0x1p-16382L; |
+ n += 16382; |
+ if (n < -16382) { |
+ x *= 0x1p-16382L; |
+ n += 16382; |
+ if (n < -16382) |
+ n = -16382; |
+ } |
+ } |
+ u.f = 1.0; |
+ u.i.se = 0x3fff + n; |
+ return x * u.f; |
+} |
+#endif |