/*							pow.c
 *
 *	Power function
 *
 *
 *
 * SYNOPSIS:
 *
 * double x, y, z, pow();
 *
 * z = pow( x, y );
 *
 *
 *
 * DESCRIPTION:
 *
 * Computes x raised to the yth power.  Analytically,
 *
 *      x**y  =  exp( y log(x) ).
 *
 * Following Cody and Waite, this program uses a lookup table
 * of 2**-i/16 and pseudo extended precision arithmetic to
 * obtain an extra three bits of accuracy in both the logarithm
 * and the exponential.
 *
 *
 *
 * ACCURACY:
 *
 *                      Relative error:
 * arithmetic   domain     # trials      peak         rms
 *    IEEE     -26,26       30000      4.2e-16      7.7e-17
 *    IEEE     0,8700       30000      1.5e-14      2.1e-15
 * 0.99 < x < 1.01, 0 < y < 8700, uniformly distributed.
 *
 *
 * ERROR MESSAGES:
 *
 *   message         condition      value returned
 * pow overflow     x**y > MAXNUM      INFINITY
 * pow underflow   x**y < 1/MAXNUM       0.0
 * pow domain      x<0 and y noninteger  0.0
 *
 */

/*
Cephes Math Library Release 2.8:  June, 2000
Copyright 1984, 1995, 2000 by Stephen L. Moshier
*/

/*
Modified for mingw
2002-09-27 Danny Smith <dannysmith@users.sourceforge.net>
*/

#ifdef __MINGW32__
#include "cephes_mconf.h"
#else
#include "mconf.h"
static char fname[] = {"pow"};
#endif

#ifndef _SET_ERRNO
#define _SET_ERRNO(x)
#endif

#define SQRTH 0.70710678118654752440

#ifdef UNK
static uD P[4] = {
  { { 4.97778295871696322025E-1 } },
  { { 3.73336776063286838734E0 } },
  { { 7.69994162726912503298E0 } },
  { { 4.66651806774358464979E0 } }
};
static uD Q[4] = {
  { { 9.33340916416696166113E0 } },
  { { 2.79999886606328401649E1 } },
  { { 3.35994905342304405431E1 } },
  { { 1.39995542032307539578E1 } }
};
/* 2^(-i/16), IEEE precision */
static uD A[17] = {
  { { 1.00000000000000000000E0 } },
  { { 9.57603280698573700036E-1 } },
  { { 9.17004043204671215328E-1 } },
  { { 8.78126080186649726755E-1 } },
  { { 8.40896415253714502036E-1 } },
  { { 8.05245165974627141736E-1 } },
  { { 7.71105412703970372057E-1 } },
  { { 7.38413072969749673113E-1 } },
  { { 7.07106781186547572737E-1 } },
  { { 6.77127773468446325644E-1 } },
  { { 6.48419777325504820276E-1 } },
  { { 6.20928906036742001007E-1 } },
  { { 5.94603557501360513449E-1 } },
  { { 5.69394317378345782288E-1 } },
  { { 5.45253866332628844837E-1 } },
  { { 5.22136891213706877402E-1 } },
  { { 5.00000000000000000000E-1 } }
};
static uD B[9] = {
  { { 0.00000000000000000000E0 } },
  { { 1.64155361212281360176E-17 } },
  { { 4.09950501029074826006E-17 } },
  { { 3.97491740484881042808E-17 } },
  { { -4.83364665672645672553E-17 } },
  { { 1.26912513974441574796E-17 } },
  { { 1.99100761573282305549E-17 } },
  { { -1.52339103990623557348E-17 } },
  { { 0.00000000000000000000E0 } }
};
static uD R[7] = {
  { { 1.49664108433729301083E-5 } },
  { { 1.54010762792771901396E-4 } },
  { { 1.33335476964097721140E-3 } },
  { { 9.61812908476554225149E-3 } },
  { { 5.55041086645832347466E-2 } },
  { { 2.40226506959099779976E-1 } },
  { { 6.93147180559945308821E-1 } }
};

#define douba(k) A[k].d
#define doubb(k) B[k].d
#define MEXP 16383.0
#ifdef DENORMAL
#define MNEXP -17183.0
#else
#define MNEXP -16383.0
#endif
#endif

#ifdef IBMPC
static const uD P[4] = {
  { { 0x5cf0,0x7f5b,0xdb99,0x3fdf } },
  { { 0xdf15,0xea9e,0xddef,0x400d } },
  { { 0xeb6f,0x7f78,0xccbd,0x401e } },
  { { 0x9b74,0xb65c,0xaa83,0x4012 } }
};
static const uD Q[4] = {
  { { 0x914e,0x9b20,0xaab4,0x4022 } },
  { { 0xc9f5,0x41c1,0xffff,0x403b } },
  { { 0x6402,0x1b17,0xccbc,0x4040 } },
  { { 0xe92e,0x918a,0xffc5,0x402b } }
};
static const uD A[17] = {
  { { 0x0000,0x0000,0x0000,0x3ff0 } },
  { { 0x90da,0xa2a4,0xa4af,0x3fee } },
  { { 0xa487,0xdcfb,0x5818,0x3fed } },
  { { 0x529c,0xdd85,0x199b,0x3fec } },
  { { 0xd3ad,0x995a,0xe89f,0x3fea } },
  { { 0xf090,0x82a3,0xc491,0x3fe9 } },
  { { 0xa0db,0x422a,0xace5,0x3fe8 } },
  { { 0x0187,0x73eb,0xa114,0x3fe7 } },
  { { 0x3bcd,0x667f,0xa09e,0x3fe6 } },
  { { 0x5429,0xdd48,0xab07,0x3fe5 } },
  { { 0x2a27,0xd536,0xbfda,0x3fe4 } },
  { { 0x3422,0x4c12,0xdea6,0x3fe3 } },
  { { 0xb715,0x0a31,0x06fe,0x3fe3 } },
  { { 0x6238,0x6e75,0x387a,0x3fe2 } },
  { { 0x517b,0x3c7d,0x72b8,0x3fe1 } },
  { { 0x890f,0x6cf9,0xb558,0x3fe0 } },
  { { 0x0000,0x0000,0x0000,0x3fe0 } }
};
static const uD B[9] = {
  { { 0x0000,0x0000,0x0000,0x0000 } },
  { { 0x3707,0xd75b,0xed02,0x3c72 } },
  { { 0xcc81,0x345d,0xa1cd,0x3c87 } },
  { { 0x4b27,0x5686,0xe9f1,0x3c86 } },
  { { 0x6456,0x13b2,0xdd34,0xbc8b } },
  { { 0x42e2,0xafec,0x4397,0x3c6d } },
  { { 0x82e4,0xd231,0xf46a,0x3c76 } },
  { { 0x8a76,0xb9d7,0x9041,0xbc71 } },
  { { 0x0000,0x0000,0x0000,0x0000 } }
};
static const uD R[7] = {
  { { 0x937f,0xd7f2,0x6307,0x3eef } },
  { { 0x9259,0x60fc,0x2fbe,0x3f24 } },
  { { 0xef1d,0xc84a,0xd87e,0x3f55 } },
  { { 0x33b7,0x6ef1,0xb2ab,0x3f83 } },
  { { 0x1a92,0xd704,0x6b08,0x3fac } },
  { { 0xc56d,0xff82,0xbfbd,0x3fce } },
  { { 0x39ef,0xfefa,0x2e42,0x3fe6 } }
};

#define douba(k) (A[(k)].d)
#define doubb(k) (B[(k)].d)
#define MEXP 16383.0
#ifdef DENORMAL
#define MNEXP -17183.0
#else
#define MNEXP -16383.0
#endif
#endif

#ifdef MIEEE
static uD P[4] = {
  { { 0x3fdf,0xdb99,0x7f5b,0x5cf0 } },
  { { 0x400d,0xddef,0xea9e,0xdf15 } },
  { { 0x401e,0xccbd,0x7f78,0xeb6f } },
  { { 0x4012,0xaa83,0xb65c,0x9b74 } }
};
static uD Q[4] = {
  { { 0x4022,0xaab4,0x9b20,0x914e } },
  { { 0x403b,0xffff,0x41c1,0xc9f5 } },
  { { 0x4040,0xccbc,0x1b17,0x6402 } },
  { { 0x402b,0xffc5,0x918a,0xe92e } }
};
static unsigned short A[17] = {
  { { 0x3ff0,0x0000,0x0000,0x0000 } },
  { { 0x3fee,0xa4af,0xa2a4,0x90da } },
  { { 0x3fed,0x5818,0xdcfb,0xa487 } },
  { { 0x3fec,0x199b,0xdd85,0x529c } },
  { { 0x3fea,0xe89f,0x995a,0xd3ad } },
  { { 0x3fe9,0xc491,0x82a3,0xf090 } },
  { { 0x3fe8,0xace5,0x422a,0xa0db } },
  { { 0x3fe7,0xa114,0x73eb,0x0187 } },
  { { 0x3fe6,0xa09e,0x667f,0x3bcd } },
  { { 0x3fe5,0xab07,0xdd48,0x5429 } },
  { { 0x3fe4,0xbfda,0xd536,0x2a27 } },
  { { 0x3fe3,0xdea6,0x4c12,0x3422 } },
  { { 0x3fe3,0x06fe,0x0a31,0xb715 } },
  { { 0x3fe2,0x387a,0x6e75,0x6238 } },
  { { 0x3fe1,0x72b8,0x3c7d,0x517b } },
  { { 0x3fe0,0xb558,0x6cf9,0x890f } },
  { { 0x3fe0,0x0000,0x0000,0x0000 } }
};
static uD B[9] = {
  { { 0x0000,0x0000,0x0000,0x0000 } },
  { { 0x3c72,0xed02,0xd75b,0x3707 } },
  { { 0x3c87,0xa1cd,0x345d,0xcc81 } },
  { { 0x3c86,0xe9f1,0x5686,0x4b27 } },
  { { 0xbc8b,0xdd34,0x13b2,0x6456 } },
  { { 0x3c6d,0x4397,0xafec,0x42e2 } },
  { { 0x3c76,0xf46a,0xd231,0x82e4 } },
  { { 0xbc71,0x9041,0xb9d7,0x8a76 } },
  { { 0x0000,0x0000,0x0000,0x0000 } }
};
static uD R[7] = {
  { { 0x3eef,0x6307,0xd7f2,0x937f } },
  { { 0x3f24,0x2fbe,0x60fc,0x9259 } },
  { { 0x3f55,0xd87e,0xc84a,0xef1d } },
  { { 0x3f83,0xb2ab,0x6ef1,0x33b7 } },
  { { 0x3fac,0x6b08,0xd704,0x1a92 } },
  { { 0x3fce,0xbfbd,0xff82,0xc56d } },
  { { 0x3fe6,0x2e42,0xfefa,0x39ef } }
};

#define douba(k) (A[(k)].d)
#define doubb(k) (B[(k)].d)
#define MEXP 16383.0
#ifdef DENORMAL
#define MNEXP -17183.0
#else
#define MNEXP -16383.0
#endif
#endif

/* log2(e) - 1 */
#define LOG2EA 0.44269504088896340736

#define F W
#define Fa Wa
#define Fb Wb
#define G W
#define Ga Wa
#define Gb u
#define H W
#define Ha Wb
#define Hb Wb

#ifdef __MINGW32__
static __inline__ double reduc( double );
extern double __powi ( double, int );
extern double pow ( double x,  double y);

#else /* __MINGW32__ */

extern double floor ( double );
extern double fabs ( double );
extern double frexp ( double, int * );
extern double ldexp ( double, int );
extern double polevl ( double, void *, int );
extern double p1evl ( double, void *, int );
extern double __powi ( double, int );
extern int signbit ( double );
extern int isnan ( double );
extern int isfinite ( double );
static double reduc ( double );
extern double MAXNUM;
#ifdef INFINITIES
extern double INFINITY;
#endif
#ifdef NANS
extern double NAN;
#endif
#ifdef MINUSZERO
extern double NEGZERO;
#endif

#endif /* __MINGW32__ */

double pow(double x, double y)
{
	double w, z, W, Wa, Wb, ya, yb, u;
/*	double F, Fa, Fb, G, Ga, Gb, H, Ha, Hb */
	double aw, ay, wy;
	int e, i, nflg, iyflg, yoddint;

	if (y == 0.0)
		return (1.0);
#ifdef NANS
	if (isnan(x) || isnan(y))
	{
		_SET_ERRNO (EDOM);
		return (x + y);
	}
#endif
	if (y == 1.0)
		return (x);

#ifdef INFINITIES
	if (!isfinite(y) && (x == 1.0 || x == -1.0))
	{
		mtherr( "pow", DOMAIN );
#ifdef NANS
		return( NAN );
#else
		return( INFINITY );
#endif
	}
#endif

	if (x == 1.0)
		return (1.0);

	if (y >= MAXNUM)
	{
		_SET_ERRNO (ERANGE);
#ifdef INFINITIES
		if (x > 1.0)
			return (INFINITY);
#else
		if (x > 1.0)
			return (MAXNUM);
#endif
		if (x > 0.0 && x < 1.0)
			return (0.0);
		if (x < -1.0)
		{
#ifdef INFINITIES
			return (INFINITY);
#else
			return (MAXNUM);
#endif
		}
		if (x > -1.0 && x < 0.0)
			return (0.0);
	}
	if (y <= -MAXNUM)
	{
		_SET_ERRNO (ERANGE);
		if (x > 1.0)
		return (0.0);
#ifdef INFINITIES
		if (x > 0.0 && x < 1.0)
			return (INFINITY);
#else
		if (x > 0.0 && x < 1.0)
			return (MAXNUM);
#endif
		if (x < -1.0)
			return (0.0);
#ifdef INFINITIES
		if (x > -1.0 && x < 0.0)
			return (INFINITY);
#else
		if (x > -1.0 && x < 0.0)
			return (MAXNUM);
#endif
	}
	if (x >= MAXNUM)
	{
#if INFINITIES
		if (y > 0.0)
			return (INFINITY);
#else
		if (y > 0.0)
			return (MAXNUM);
#endif
		return (0.0);
	}
	/* Set iyflg to 1 if y is an integer.  */
	iyflg = 0;
	w = floor(y);
	if (w == y)
		iyflg = 1;

/* Test for odd integer y.  */
	yoddint = 0;
	if (iyflg)
	{
		ya = fabs(y);
		ya = floor(0.5 * ya);
		yb = 0.5 * fabs(w);
		if (ya != yb)
			yoddint = 1;
	}

	if (x <= -MAXNUM)
	{
		if (y > 0.0)
		{
#ifdef INFINITIES
			if (yoddint)
				return (-INFINITY);
			return (INFINITY);
#else
			if (yoddint)
				return (-MAXNUM);
			return (MAXNUM);
#endif
		}
		if (y < 0.0)
		{
#ifdef MINUSZERO
			if (yoddint)
				return (NEGZERO);
#endif
			return (0.0);
		}
 	}

	nflg = 0;	/* flag = 1 if x<0 raised to integer power */
	if (x <= 0.0)
	{
		if (x == 0.0)
		{
			if (y < 0.0)
			{
#ifdef MINUSZERO
				if (signbit(x) && yoddint)
					return (-INFINITY);
#endif
#ifdef INFINITIES
				return (INFINITY);
#else
				return (MAXNUM);
#endif
			}
			if (y > 0.0)
			{
#ifdef MINUSZERO
				if (signbit(x) && yoddint)
					return (NEGZERO);
#endif
				return (0.0);
			}
			return (1.0);
		}
		else
		{
			if (iyflg == 0)
			{ /* noninteger power of negative number */
				mtherr(fname, DOMAIN);
				_SET_ERRNO (EDOM);
#ifdef NANS
				return (NAN);
#else
				return (0.0L);
#endif
			}
			nflg = 1;
		}
	}

	/* Integer power of an integer.  */

	if (iyflg)
	{
		i = w;
		w = floor(x);
		if( (w == x) && (fabs(y) < 32768.0) )
		{
			w = __powi(x, (int) y);
			return (w);
		}
	}

	if (nflg)
		x = fabs(x);

	/* For results close to 1, use a series expansion.  */
	w = x - 1.0;
	aw = fabs(w);
	ay = fabs(y);
	wy = w * y;
	ya = fabs(wy);
	if ((aw <= 1.0e-3 && ay <= 1.0)
	   || (ya <= 1.0e-3 && ay >= 1.0))
	{
		z = (((((w*(y-5.)/720. + 1./120.)*w*(y-4.) + 1./24.)*w*(y-3.)
			+ 1./6.)*w*(y-2.) + 0.5)*w*(y-1.) )*wy + wy + 1.;
		goto done;
	}
	/* These are probably too much trouble.  */
#if 0
	w = y * log(x);
	if (aw > 1.0e-3 && fabs(w) < 1.0e-3)
	{
		z = ((((((w/7. + 1.)*w/6. + 1.)*w/5. + 1.)*w/4. + 1.)*w/3. + 1.)*w/2. + 1.)*w + 1.;
		goto done;
	}

	if (ya <= 1.0e-3 && aw <= 1.0e-4)
	{
		z = (((((wy*1./720.
				    + (-w*1./48. + 1./120.) )*wy
				   + ((w*17./144. - 1./12.)*w + 1./24.) )*wy
				  + (((-w*5./16. + 7./24.)*w - 1./4.)*w + 1./6.) )*wy
				 + ((((w*137./360. - 5./12.)*w + 11./24.)*w - 1./2.)*w + 1./2.) )*wy
				+ (((((-w*1./6. + 1./5.)*w - 1./4)*w + 1./3.)*w -1./2.)*w ) )*wy
				+ wy + 1.0;
		goto done;
	}
#endif

	/* separate significand from exponent */
	x = frexp(x, &e);

#if 0
	/* For debugging, check for gross overflow. */
	if ((e * y)  > (MEXP + 1024))
		goto overflow;
#endif

	/* Find significand of x in antilog table A[]. */
	i = 1;
	if (x <= douba(9))
		i = 9;
	if (x <= douba(i + 4))
		i += 4;
	if (x <= douba(i + 2))
		i += 2;
	if (x >= douba(1))
		i = -1;
	i += 1;

	/* Find (x - A[i])/A[i]
	 * in order to compute log(x/A[i]):
	 *
	 * log(x) = log( a x/a ) = log(a) + log(x/a)
	 *
	 * log(x/a) = log(1+v),  v = x/a - 1 = (x-a)/a
	 */
	x -= douba(i);
	x -= doubb(i/2);
	x /= douba(i);

	/* rational approximation for log(1+v):
	 *
	 * log(1+v)  =  v  -  v**2/2  +  v**3 P(v) / Q(v)
	 */
	z = x*x;
	w = x * ( z * polevl( x, P, 3 ) / p1evl( x, Q, 4 ) );
	w = w - ldexp( z, -1 );   /*  w - 0.5 * z  */

	/* Convert to base 2 logarithm:
	 * multiply by log2(e)
	 */
	w = w + LOG2EA * w;
	/* Note x was not yet added in
	 * to above rational approximation,
	 * so do it now, while multiplying
	 * by log2(e).
	 */
	z = w + LOG2EA * x;
	z = z + x;

	/* Compute exponent term of the base 2 logarithm. */
	w = -i;
	w = ldexp( w, -4 );	/* divide by 16 */
	w += e;
	/* Now base 2 log of x is w + z. */

	/* Multiply base 2 log by y, in extended precision. */

	/* separate y into large part ya
	 * and small part yb less than 1/16
	 */
	ya = reduc(y);
	yb = y - ya;

	F = z * y  +  w * yb;
	Fa = reduc(F);
	Fb = F - Fa;

	G = Fa + w * ya;
	Ga = reduc(G);
	Gb = G - Ga;

	H = Fb + Gb;
	Ha = reduc(H);
	w = ldexp(Ga + Ha, 4);

	/* Test the power of 2 for overflow */
	if (w > MEXP)
	{
#ifndef INFINITIES
		mtherr(fname, OVERFLOW);
#endif
#ifdef INFINITIES
		if (nflg && yoddint)
			return (-INFINITY);
		return (INFINITY);
#else
		if (nflg && yoddint)
			return (-MAXNUM);
		return (MAXNUM);
#endif
	}

	if (w < (MNEXP - 1))
	{
#ifndef DENORMAL
		mtherr(fname, UNDERFLOW);
#endif
#ifdef MINUSZERO
		if (nflg && yoddint)
			return (NEGZERO);
#endif
		return (0.0);
	}

	e = w;
	Hb = H - Ha;

	if (Hb > 0.0)
	{
		e += 1;
		Hb -= 0.0625;
	}

	/* Now the product y * log2(x)  =  Hb + e/16.0.
	 *
	 * Compute base 2 exponential of Hb,
	 * where -0.0625 <= Hb <= 0.
	 */
	z = Hb * polevl(Hb, R, 6);  /*    z  =  2**Hb - 1    */

	/* Express e/16 as an integer plus a negative number of 16ths.
	 * Find lookup table entry for the fractional power of 2.
	 */
	if (e < 0)
		i = 0;
	else
		i = 1;
	i = e/16 + i;
	e = 16*i - e;
	w = douba(e);
	z = w + w * z;      /*    2**-e * ( 1 + (2**Hb-1) )    */
	z = ldexp(z, i);  /* multiply by integer power of 2 */

done:
	/* Negate if odd integer power of negative number */
	if (nflg && yoddint)
	{
#ifdef MINUSZERO
		if (z == 0.0)
			z = NEGZERO;
		else
#endif
			z = -z;
	}
	return (z);
}


/* Find a multiple of 1/16 that is within 1/16 of x. */
static double reduc(double x)
{
	double t;

	t = ldexp(x, 4);
	t = floor(t);
	t = ldexp(t, -4);
	return (t);
}

