/* origin: FreeBSD /usr/src/lib/msun/src/e_exp.c */
/*
 * ====================================================
 * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */
/* exp(x)
 * Returns the exponential of x.
 *
 * Method
 *   1. Argument reduction:
 *      Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
 *      Given x, find r and integer k such that
 *
 *               x = k*ln2 + r,  |r| <= 0.5*ln2.
 *
 *      Here r will be represented as r = hi-lo for better
 *      accuracy.
 *
 *   2. Approximation of exp(r) by a special rational function on
 *      the interval [0,0.34658]:
 *      Write
 *          R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
 *      We use a special Remez algorithm on [0,0.34658] to generate
 *      a polynomial of degree 5 to approximate R. The maximum error
 *      of this polynomial approximation is bounded by 2**-59. In
 *      other words,
 *          R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
 *      (where z=r*r, and the values of P1 to P5 are listed below)
 *      and
 *          |                  5          |     -59
 *          | 2.0+P1*z+...+P5*z   -  R(z) | <= 2
 *          |                             |
 *      The computation of exp(r) thus becomes
 *                              2*r
 *              exp(r) = 1 + ----------
 *                            R(r) - r
 *                                 r*c(r)
 *                     = 1 + r + ----------- (for better accuracy)
 *                                2 - c(r)
 *      where
 *                              2       4             10
 *              c(r) = r - (P1*r  + P2*r  + ... + P5*r   ).
 *
 *   3. Scale back to obtain exp(x):
 *      From step 1, we have
 *         exp(x) = 2^k * exp(r)
 *
 * Special cases:
 *      exp(INF) is INF, exp(NaN) is NaN;
 *      exp(-INF) is 0, and
 *      for finite argument, only exp(0)=1 is exact.
 *
 * Accuracy:
 *      according to an error analysis, the error is always less than
 *      1 ulp (unit in the last place).
 *
 * Misc. info.
 *      For IEEE double
 *          if x >  709.782712893383973096 then exp(x) overflows
 *          if x < -745.133219101941108420 then exp(x) underflows
 */

#include "libm.h"

static const double half[2] = {0.5, -0.5},
                    ln2hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
    ln2lo = 1.90821492927058770002e-10,                 /* 0x3dea39ef, 0x35793c76 */
    invln2 = 1.44269504088896338700e+00,                /* 0x3ff71547, 0x652b82fe */
    P1 = 1.66666666666666019037e-01,                    /* 0x3FC55555, 0x5555553E */
    P2 = -2.77777777770155933842e-03,                   /* 0xBF66C16C, 0x16BEBD93 */
    P3 = 6.61375632143793436117e-05,                    /* 0x3F11566A, 0xAF25DE2C */
    P4 = -1.65339022054652515390e-06,                   /* 0xBEBBBD41, 0xC5D26BF1 */
    P5 = 4.13813679705723846039e-08;                    /* 0x3E663769, 0x72BEA4D0 */

double exp(double x) {
  double_t hi, lo, c, xx, y;
  int k, sign;
  uint32_t hx;

  GET_HIGH_WORD(hx, x);
  sign = hx >> 31;
  hx &= 0x7fffffff; /* high word of |x| */

  /* special cases */
  if (hx >= 0x4086232b) { /* if |x| >= 708.39... */
    if (isnan(x))
      return x;
    if (x > 709.782712893383973096) {
      /* overflow if x!=inf */
      x *= 0x1p1023;
      return x;
    }
    if (x < -708.39641853226410622) {
      /* underflow if x!=-inf */
      FORCE_EVAL((float)(-0x1p-149 / x));
      if (x < -745.13321910194110842)
        return 0;
    }
  }

  /* argument reduction */
  if (hx > 0x3fd62e42) {  /* if |x| > 0.5 ln2 */
    if (hx >= 0x3ff0a2b2) /* if |x| >= 1.5 ln2 */
      k = (int)(invln2 * x + half[sign]);
    else
      k = 1 - sign - sign;
    hi = x - k * ln2hi; /* k*ln2hi is exact here */
    lo = k * ln2lo;
    x = hi - lo;
  } else if (hx > 0x3e300000) { /* if |x| > 2**-28 */
    k = 0;
    hi = x;
    lo = 0;
  } else {
    /* inexact if x!=0 */
    FORCE_EVAL(0x1p1023 + x);
    return 1 + x;
  }

  /* x is now in primary range */
  xx = x * x;
  c = x - xx * (P1 + xx * (P2 + xx * (P3 + xx * (P4 + xx * P5))));
  y = 1 + (x * c / (2 - c) - lo + hi);
  if (k == 0)
    return y;
  return scalbn(y, k);
}
