use scalbn or *2.0 instead of ldexp, fix fmal
[musl] / src / math / expl.c
index 898cf1a..b289ffe 100644 (file)
@@ -74,12 +74,12 @@ long double expl(long double x)
 }
 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
 
-static long double P[3] = {
+static const long double P[3] = {
  1.2617719307481059087798E-4L,
  3.0299440770744196129956E-2L,
  9.9999999999999999991025E-1L,
 };
-static long double Q[4] = {
+static const long double Q[4] = {
  3.0019850513866445504159E-6L,
  2.5244834034968410419224E-3L,
  2.2726554820815502876593E-1L,
@@ -102,13 +102,13 @@ long double expl(long double x)
        if (x > MAXLOGL)
                return INFINITY;
        if (x < MINLOGL)
-               return 0.0L;
+               return 0.0;
 
        /* Express e**x = e**g 2**n
         *   = e**g e**(n loge(2))
         *   = e**(g + n loge(2))
         */
-       px = floorl(LOG2EL * x + 0.5L); /* floor() truncates toward -infinity. */
+       px = floorl(LOG2EL * x + 0.5); /* floor() truncates toward -infinity. */
        n = px;
        x -= px * C1;
        x -= px * C2;
@@ -120,8 +120,8 @@ long double expl(long double x)
        xx = x * x;
        px = x * __polevll(xx, P, 2);
        x =  px/(__polevll(xx, Q, 3) - px);
-       x = 1.0L + ldexpl(x, 1);
-       x = ldexpl(x, n);
+       x = 1.0 + 2.0 * x;
+       x = scalbnl(x, n);
        return x;
 }
 #endif