/*							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, uD *, 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);
}

