// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package math


// The original C code, the long comment, and the constants
// below are from FreeBSD's /usr/src/lib/msun/src/e_exp.c
// and came with this notice.  The go code is a simplified
// version of the original 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 Remes 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*R1(r)
//                     = 1 + r + ----------- (for better accuracy)
//                                2 - R1(r)
//      where
//                               2       4             10
//              R1(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 >  7.09782712893383973096e+02 then exp(x) overflow
//          if x < -7.45133219101941108420e+02 then exp(x) underflow
//
// Constants:
// The hexadecimal values are the intended ones for the following
// constants. The decimal values may be used, provided that the
// compiler will convert from decimal to binary accurately enough
// to produce the hexadecimal values shown.

// Exp returns e^x, the base-e exponential of x.
//
// Special cases are:
//	Exp(+Inf) = +Inf
//	Exp(NaN) = NaN
// Very large values overflow to -Inf or +Inf.
// Very small values underflow to 1.
func Exp(x float64) float64 {
	const (
		Ln2Hi	= 6.93147180369123816490e-01;
		Ln2Lo	= 1.90821492927058770002e-10;
		Log2e	= 1.44269504088896338700e+00;

		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 */

		Overflow	= 7.09782712893383973096e+02;
		Underflow	= -7.45133219101941108420e+02;
		NearZero	= 1.0/(1<<28);		// 2^-28
	)

	// special cases
	switch {
	case IsNaN(x) || IsInf(x, 1):
		return x;
	case IsInf(x, -1):
		return 0;
	case x > Overflow:
		return Inf(1);
	case x < Underflow:
		return 0;
	case -NearZero < x && x < NearZero:
		return 1;
	}

	// reduce; computed as r = hi - lo for extra precision.
	var k int;
	switch {
	case x < 0:
		k = int(Log2e*x - 0.5);
	case x > 0:
		k = int(Log2e*x + 0.5);
	}
	hi := x - float64(k)*Ln2Hi;
	lo := float64(k)*Ln2Lo;
	r := hi - lo;

	// compute
	t := r * r;
	c := r - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
	y := 1 - ((lo - (r*c)/(2-c)) - hi);
	// TODO(rsc): make sure Ldexp can handle boundary k
	return Ldexp(y, k);
}
