/* Complex math module */

/* much code borrowed from mathmodule.c */

#include "Python.h"
/* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from
   float.h.  We assume that FLT_RADIX is either 2 or 16. */
#include <float.h>

#if (FLT_RADIX != 2 && FLT_RADIX != 16)
#error "Modules/cmathmodule.c expects FLT_RADIX to be 2 or 16"
#endif

#ifndef M_LN2
#define M_LN2 (0.6931471805599453094) /* natural log of 2 */
#endif

#ifndef M_LN10
#define M_LN10 (2.302585092994045684) /* natural log of 10 */
#endif

/*
   CM_LARGE_DOUBLE is used to avoid spurious overflow in the sqrt, log,
   inverse trig and inverse hyperbolic trig functions.  Its log is used in the
   evaluation of exp, cos, cosh, sin, sinh, tan, and tanh to avoid unecessary
   overflow.
 */

#define CM_LARGE_DOUBLE (DBL_MAX/4.)
#define CM_SQRT_LARGE_DOUBLE (sqrt(CM_LARGE_DOUBLE))
#define CM_LOG_LARGE_DOUBLE (log(CM_LARGE_DOUBLE))
#define CM_SQRT_DBL_MIN (sqrt(DBL_MIN))

/* 
   CM_SCALE_UP is an odd integer chosen such that multiplication by
   2**CM_SCALE_UP is sufficient to turn a subnormal into a normal.
   CM_SCALE_DOWN is (-(CM_SCALE_UP+1)/2).  These scalings are used to compute
   square roots accurately when the real and imaginary parts of the argument
   are subnormal.
*/

#if FLT_RADIX==2
#define CM_SCALE_UP (2*(DBL_MANT_DIG/2) + 1)
#elif FLT_RADIX==16
#define CM_SCALE_UP (4*DBL_MANT_DIG+1)
#endif
#define CM_SCALE_DOWN (-(CM_SCALE_UP+1)/2)

/* forward declarations */
static Py_complex c_asinh(Py_complex);
static Py_complex c_atanh(Py_complex);
static Py_complex c_cosh(Py_complex);
static Py_complex c_sinh(Py_complex);
static Py_complex c_sqrt(Py_complex);
static Py_complex c_tanh(Py_complex);
static PyObject * math_error(void);

/* Code to deal with special values (infinities, NaNs, etc.). */

/* special_type takes a double and returns an integer code indicating
   the type of the double as follows:
*/

enum special_types {
	ST_NINF,	/* 0, negative infinity */
	ST_NEG,		/* 1, negative finite number (nonzero) */
	ST_NZERO,	/* 2, -0. */
	ST_PZERO,	/* 3, +0. */
	ST_POS,		/* 4, positive finite number (nonzero) */
	ST_PINF,	/* 5, positive infinity */
	ST_NAN,		/* 6, Not a Number */
};

static enum special_types
special_type(double d)
{
	if (Py_IS_FINITE(d)) {
		if (d != 0) {
			if (copysign(1., d) == 1.)
				return ST_POS;
			else
				return ST_NEG;
		}
		else {
			if (copysign(1., d) == 1.)
				return ST_PZERO;
			else
				return ST_NZERO;
		}
	}
	if (Py_IS_NAN(d))
		return ST_NAN;
	if (copysign(1., d) == 1.)
		return ST_PINF;
	else
		return ST_NINF;
}

#define SPECIAL_VALUE(z, table)						\
	if (!Py_IS_FINITE((z).real) || !Py_IS_FINITE((z).imag)) {	\
		errno = 0;                                              \
		return table[special_type((z).real)]	                \
			    [special_type((z).imag)];			\
	}

#define P Py_MATH_PI
#define P14 0.25*Py_MATH_PI
#define P12 0.5*Py_MATH_PI
#define P34 0.75*Py_MATH_PI
#define INF Py_HUGE_VAL
#define N Py_NAN
#define U -9.5426319407711027e33 /* unlikely value, used as placeholder */

/* First, the C functions that do the real work.  Each of the c_*
   functions computes and returns the C99 Annex G recommended result
   and also sets errno as follows: errno = 0 if no floating-point
   exception is associated with the result; errno = EDOM if C99 Annex
   G recommends raising divide-by-zero or invalid for this result; and
   errno = ERANGE where the overflow floating-point signal should be
   raised.
*/

static Py_complex acos_special_values[7][7];

static Py_complex
c_acos(Py_complex z)
{
	Py_complex s1, s2, r;

	SPECIAL_VALUE(z, acos_special_values);

	if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
		/* avoid unnecessary overflow for large arguments */
		r.real = atan2(fabs(z.imag), z.real);
		/* split into cases to make sure that the branch cut has the
		   correct continuity on systems with unsigned zeros */
		if (z.real < 0.) {
			r.imag = -copysign(log(hypot(z.real/2., z.imag/2.)) +
					   M_LN2*2., z.imag);
		} else {
			r.imag = copysign(log(hypot(z.real/2., z.imag/2.)) +
					  M_LN2*2., -z.imag);
		}
	} else {
		s1.real = 1.-z.real;
		s1.imag = -z.imag;
		s1 = c_sqrt(s1);
		s2.real = 1.+z.real;
		s2.imag = z.imag;
		s2 = c_sqrt(s2);
		r.real = 2.*atan2(s1.real, s2.real);
		r.imag = asinh(s2.real*s1.imag - s2.imag*s1.real);
	}
	errno = 0;
	return r;
}

PyDoc_STRVAR(c_acos_doc,
"acos(x)\n"
"\n"
"Return the arc cosine of x.");


static Py_complex acosh_special_values[7][7];

static Py_complex
c_acosh(Py_complex z)
{
	Py_complex s1, s2, r;

	SPECIAL_VALUE(z, acosh_special_values);

	if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
		/* avoid unnecessary overflow for large arguments */
		r.real = log(hypot(z.real/2., z.imag/2.)) + M_LN2*2.;
		r.imag = atan2(z.imag, z.real);
	} else {
		s1.real = z.real - 1.;
		s1.imag = z.imag;
		s1 = c_sqrt(s1);
		s2.real = z.real + 1.;
		s2.imag = z.imag;
		s2 = c_sqrt(s2);
		r.real = asinh(s1.real*s2.real + s1.imag*s2.imag);
		r.imag = 2.*atan2(s1.imag, s2.real);
	}
	errno = 0;
	return r;
}

PyDoc_STRVAR(c_acosh_doc,
"acosh(x)\n"
"\n"
"Return the hyperbolic arccosine of x.");


static Py_complex
c_asin(Py_complex z)
{
	/* asin(z) = -i asinh(iz) */
	Py_complex s, r;
	s.real = -z.imag;
	s.imag = z.real;
	s = c_asinh(s);
	r.real = s.imag;
	r.imag = -s.real;
	return r;
}

PyDoc_STRVAR(c_asin_doc,
"asin(x)\n"
"\n"
"Return the arc sine of x.");


static Py_complex asinh_special_values[7][7];

static Py_complex
c_asinh(Py_complex z)
{
	Py_complex s1, s2, r;

	SPECIAL_VALUE(z, asinh_special_values);

	if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
		if (z.imag >= 0.) {
			r.real = copysign(log(hypot(z.real/2., z.imag/2.)) +
					  M_LN2*2., z.real);
		} else {
			r.real = -copysign(log(hypot(z.real/2., z.imag/2.)) +
					   M_LN2*2., -z.real);
		}
		r.imag = atan2(z.imag, fabs(z.real));
	} else {
		s1.real = 1.+z.imag;
		s1.imag = -z.real;
		s1 = c_sqrt(s1);
		s2.real = 1.-z.imag;
		s2.imag = z.real;
		s2 = c_sqrt(s2);
		r.real = asinh(s1.real*s2.imag-s2.real*s1.imag);
		r.imag = atan2(z.imag, s1.real*s2.real-s1.imag*s2.imag);
	}
	errno = 0;
	return r;
}

PyDoc_STRVAR(c_asinh_doc,
"asinh(x)\n"
"\n"
"Return the hyperbolic arc sine of x.");


static Py_complex
c_atan(Py_complex z)
{
	/* atan(z) = -i atanh(iz) */
	Py_complex s, r;
	s.real = -z.imag;
	s.imag = z.real;
	s = c_atanh(s);
	r.real = s.imag;
	r.imag = -s.real;
	return r;
}

/* Windows screws up atan2 for inf and nan, and alpha Tru64 5.1 doesn't follow
   C99 for atan2(0., 0.). */
static double
c_atan2(Py_complex z)
{
	if (Py_IS_NAN(z.real) || Py_IS_NAN(z.imag))
		return Py_NAN;
	if (Py_IS_INFINITY(z.imag)) {
		if (Py_IS_INFINITY(z.real)) {
			if (copysign(1., z.real) == 1.)
				/* atan2(+-inf, +inf) == +-pi/4 */
				return copysign(0.25*Py_MATH_PI, z.imag);
			else
				/* atan2(+-inf, -inf) == +-pi*3/4 */
				return copysign(0.75*Py_MATH_PI, z.imag);
		}
		/* atan2(+-inf, x) == +-pi/2 for finite x */
		return copysign(0.5*Py_MATH_PI, z.imag);
	}
	if (Py_IS_INFINITY(z.real) || z.imag == 0.) {
		if (copysign(1., z.real) == 1.)
			/* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
			return copysign(0., z.imag);
		else
			/* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
			return copysign(Py_MATH_PI, z.imag);
	}
	return atan2(z.imag, z.real);
}

PyDoc_STRVAR(c_atan_doc,
"atan(x)\n"
"\n"
"Return the arc tangent of x.");


static Py_complex atanh_special_values[7][7];

static Py_complex
c_atanh(Py_complex z)
{
	Py_complex r;
	double ay, h;

	SPECIAL_VALUE(z, atanh_special_values);

	/* Reduce to case where z.real >= 0., using atanh(z) = -atanh(-z). */
	if (z.real < 0.) {
		return c_neg(c_atanh(c_neg(z)));
	}

	ay = fabs(z.imag);
	if (z.real > CM_SQRT_LARGE_DOUBLE || ay > CM_SQRT_LARGE_DOUBLE) {
		/*
		   if abs(z) is large then we use the approximation
		   atanh(z) ~ 1/z +/- i*pi/2 (+/- depending on the sign
		   of z.imag)
		*/
		h = hypot(z.real/2., z.imag/2.);  /* safe from overflow */
		r.real = z.real/4./h/h;
		/* the two negations in the next line cancel each other out
		   except when working with unsigned zeros: they're there to
		   ensure that the branch cut has the correct continuity on
		   systems that don't support signed zeros */
		r.imag = -copysign(Py_MATH_PI/2., -z.imag);
		errno = 0;
	} else if (z.real == 1. && ay < CM_SQRT_DBL_MIN) {
		/* C99 standard says:  atanh(1+/-0.) should be inf +/- 0i */
		if (ay == 0.) {
			r.real = INF;
			r.imag = z.imag;
			errno = EDOM;
		} else {
			r.real = -log(sqrt(ay)/sqrt(hypot(ay, 2.)));
			r.imag = copysign(atan2(2., -ay)/2, z.imag);
			errno = 0;
		}
	} else {
		r.real = log1p(4.*z.real/((1-z.real)*(1-z.real) + ay*ay))/4.;
		r.imag = -atan2(-2.*z.imag, (1-z.real)*(1+z.real) - ay*ay)/2.;
		errno = 0;
	}
	return r;
}

PyDoc_STRVAR(c_atanh_doc,
"atanh(x)\n"
"\n"
"Return the hyperbolic arc tangent of x.");


static Py_complex
c_cos(Py_complex z)
{
	/* cos(z) = cosh(iz) */
	Py_complex r;
	r.real = -z.imag;
	r.imag = z.real;
	r = c_cosh(r);
	return r;
}

PyDoc_STRVAR(c_cos_doc,
"cos(x)\n"
"n"
"Return the cosine of x.");


/* cosh(infinity + i*y) needs to be dealt with specially */
static Py_complex cosh_special_values[7][7];

static Py_complex
c_cosh(Py_complex z)
{
	Py_complex r;
	double x_minus_one;

	/* special treatment for cosh(+/-inf + iy) if y is not a NaN */
	if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
		if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag) &&
		    (z.imag != 0.)) {
			if (z.real > 0) {
				r.real = copysign(INF, cos(z.imag));
				r.imag = copysign(INF, sin(z.imag));
			}
			else {
				r.real = copysign(INF, cos(z.imag));
				r.imag = -copysign(INF, sin(z.imag));
			}
		}
		else {
			r = cosh_special_values[special_type(z.real)]
				               [special_type(z.imag)];
		}
		/* need to set errno = EDOM if y is +/- infinity and x is not
		   a NaN */
		if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))
			errno = EDOM;
		else
			errno = 0;
		return r;
	}

	if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
		/* deal correctly with cases where cosh(z.real) overflows but
		   cosh(z) does not. */
		x_minus_one = z.real - copysign(1., z.real);
		r.real = cos(z.imag) * cosh(x_minus_one) * Py_MATH_E;
		r.imag = sin(z.imag) * sinh(x_minus_one) * Py_MATH_E;
	} else {
		r.real = cos(z.imag) * cosh(z.real);
		r.imag = sin(z.imag) * sinh(z.real);
	}
	/* detect overflow, and set errno accordingly */
	if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
		errno = ERANGE;
	else
		errno = 0;
	return r;
}

PyDoc_STRVAR(c_cosh_doc,
"cosh(x)\n"
"n"
"Return the hyperbolic cosine of x.");


/* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for
   finite y */
static Py_complex exp_special_values[7][7];

static Py_complex
c_exp(Py_complex z)
{
	Py_complex r;
	double l;

	if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
		if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
		    && (z.imag != 0.)) {
			if (z.real > 0) {
				r.real = copysign(INF, cos(z.imag));
				r.imag = copysign(INF, sin(z.imag));
			}
			else {
				r.real = copysign(0., cos(z.imag));
				r.imag = copysign(0., sin(z.imag));
			}
		}
		else {
			r = exp_special_values[special_type(z.real)]
				              [special_type(z.imag)];
		}
		/* need to set errno = EDOM if y is +/- infinity and x is not
		   a NaN and not -infinity */
		if (Py_IS_INFINITY(z.imag) &&
		    (Py_IS_FINITE(z.real) ||
		     (Py_IS_INFINITY(z.real) && z.real > 0)))
			errno = EDOM;
		else
			errno = 0;
		return r;
	}

	if (z.real > CM_LOG_LARGE_DOUBLE) {
		l = exp(z.real-1.);
		r.real = l*cos(z.imag)*Py_MATH_E;
		r.imag = l*sin(z.imag)*Py_MATH_E;
	} else {
		l = exp(z.real);
		r.real = l*cos(z.imag);
		r.imag = l*sin(z.imag);
	}
	/* detect overflow, and set errno accordingly */
	if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
		errno = ERANGE;
	else
		errno = 0;
	return r;
}

PyDoc_STRVAR(c_exp_doc,
"exp(x)\n"
"\n"
"Return the exponential value e**x.");


static Py_complex log_special_values[7][7];

static Py_complex
c_log(Py_complex z)
{
	/*
	   The usual formula for the real part is log(hypot(z.real, z.imag)).
	   There are four situations where this formula is potentially
	   problematic:

	   (1) the absolute value of z is subnormal.  Then hypot is subnormal,
	   so has fewer than the usual number of bits of accuracy, hence may
	   have large relative error.  This then gives a large absolute error
	   in the log.  This can be solved by rescaling z by a suitable power
	   of 2.

	   (2) the absolute value of z is greater than DBL_MAX (e.g. when both
	   z.real and z.imag are within a factor of 1/sqrt(2) of DBL_MAX)
	   Again, rescaling solves this.

	   (3) the absolute value of z is close to 1.  In this case it's
	   difficult to achieve good accuracy, at least in part because a
	   change of 1ulp in the real or imaginary part of z can result in a
	   change of billions of ulps in the correctly rounded answer.

	   (4) z = 0.  The simplest thing to do here is to call the
	   floating-point log with an argument of 0, and let its behaviour
	   (returning -infinity, signaling a floating-point exception, setting
	   errno, or whatever) determine that of c_log.  So the usual formula
	   is fine here.

	 */

	Py_complex r;
	double ax, ay, am, an, h;

	SPECIAL_VALUE(z, log_special_values);

	ax = fabs(z.real);
	ay = fabs(z.imag);

	if (ax > CM_LARGE_DOUBLE || ay > CM_LARGE_DOUBLE) {
		r.real = log(hypot(ax/2., ay/2.)) + M_LN2;
	} else if (ax < DBL_MIN && ay < DBL_MIN) {
		if (ax > 0. || ay > 0.) {
			/* catch cases where hypot(ax, ay) is subnormal */
			r.real = log(hypot(ldexp(ax, DBL_MANT_DIG),
				 ldexp(ay, DBL_MANT_DIG))) - DBL_MANT_DIG*M_LN2;
		}
		else {
			/* log(+/-0. +/- 0i) */
			r.real = -INF;
			r.imag = atan2(z.imag, z.real);
			errno = EDOM;
			return r;
		}
	} else {
		h = hypot(ax, ay);
		if (0.71 <= h && h <= 1.73) {
			am = ax > ay ? ax : ay;  /* max(ax, ay) */
			an = ax > ay ? ay : ax;  /* min(ax, ay) */
			r.real = log1p((am-1)*(am+1)+an*an)/2.;
		} else {
			r.real = log(h);
		}
	}
	r.imag = atan2(z.imag, z.real);
	errno = 0;
	return r;
}


static Py_complex
c_log10(Py_complex z)
{
	Py_complex r;
	int errno_save;

	r = c_log(z);
	errno_save = errno; /* just in case the divisions affect errno */
	r.real = r.real / M_LN10;
	r.imag = r.imag / M_LN10;
	errno = errno_save;
	return r;
}

PyDoc_STRVAR(c_log10_doc,
"log10(x)\n"
"\n"
"Return the base-10 logarithm of x.");


static Py_complex
c_sin(Py_complex z)
{
	/* sin(z) = -i sin(iz) */
	Py_complex s, r;
	s.real = -z.imag;
	s.imag = z.real;
	s = c_sinh(s);
	r.real = s.imag;
	r.imag = -s.real;
	return r;
}

PyDoc_STRVAR(c_sin_doc,
"sin(x)\n"
"\n"
"Return the sine of x.");


/* sinh(infinity + i*y) needs to be dealt with specially */
static Py_complex sinh_special_values[7][7];

static Py_complex
c_sinh(Py_complex z)
{
	Py_complex r;
	double x_minus_one;

	/* special treatment for sinh(+/-inf + iy) if y is finite and
	   nonzero */
	if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
		if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
		    && (z.imag != 0.)) {
			if (z.real > 0) {
				r.real = copysign(INF, cos(z.imag));
				r.imag = copysign(INF, sin(z.imag));
			}
			else {
				r.real = -copysign(INF, cos(z.imag));
				r.imag = copysign(INF, sin(z.imag));
			}
		}
		else {
			r = sinh_special_values[special_type(z.real)]
				               [special_type(z.imag)];
		}
		/* need to set errno = EDOM if y is +/- infinity and x is not
		   a NaN */
		if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))
			errno = EDOM;
		else
			errno = 0;
		return r;
	}

	if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
		x_minus_one = z.real - copysign(1., z.real);
		r.real = cos(z.imag) * sinh(x_minus_one) * Py_MATH_E;
		r.imag = sin(z.imag) * cosh(x_minus_one) * Py_MATH_E;
	} else {
		r.real = cos(z.imag) * sinh(z.real);
		r.imag = sin(z.imag) * cosh(z.real);
	}
	/* detect overflow, and set errno accordingly */
	if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
		errno = ERANGE;
	else
		errno = 0;
	return r;
}

PyDoc_STRVAR(c_sinh_doc,
"sinh(x)\n"
"\n"
"Return the hyperbolic sine of x.");


static Py_complex sqrt_special_values[7][7];

static Py_complex
c_sqrt(Py_complex z)
{
	/*
	   Method: use symmetries to reduce to the case when x = z.real and y
	   = z.imag are nonnegative.  Then the real part of the result is
	   given by

	     s = sqrt((x + hypot(x, y))/2)

	   and the imaginary part is

	     d = (y/2)/s

	   If either x or y is very large then there's a risk of overflow in
	   computation of the expression x + hypot(x, y).  We can avoid this
	   by rewriting the formula for s as:

	     s = 2*sqrt(x/8 + hypot(x/8, y/8))

	   This costs us two extra multiplications/divisions, but avoids the
	   overhead of checking for x and y large.

	   If both x and y are subnormal then hypot(x, y) may also be
	   subnormal, so will lack full precision.  We solve this by rescaling
	   x and y by a sufficiently large power of 2 to ensure that x and y
	   are normal.
	*/


	Py_complex r;
	double s,d;
	double ax, ay;

	SPECIAL_VALUE(z, sqrt_special_values);

	if (z.real == 0. && z.imag == 0.) {
		r.real = 0.;
		r.imag = z.imag;
		return r;
	}

	ax = fabs(z.real);
	ay = fabs(z.imag);

	if (ax < DBL_MIN && ay < DBL_MIN && (ax > 0. || ay > 0.)) {
		/* here we catch cases where hypot(ax, ay) is subnormal */
		ax = ldexp(ax, CM_SCALE_UP);
		s = ldexp(sqrt(ax + hypot(ax, ldexp(ay, CM_SCALE_UP))),
			  CM_SCALE_DOWN);
	} else {
		ax /= 8.;
		s = 2.*sqrt(ax + hypot(ax, ay/8.));
	}
	d = ay/(2.*s);

	if (z.real >= 0.) {
		r.real = s;
		r.imag = copysign(d, z.imag);
	} else {
		r.real = d;
		r.imag = copysign(s, z.imag);
	}
	errno = 0;
	return r;
}

PyDoc_STRVAR(c_sqrt_doc,
"sqrt(x)\n"
"\n"
"Return the square root of x.");


static Py_complex
c_tan(Py_complex z)
{
	/* tan(z) = -i tanh(iz) */
	Py_complex s, r;
	s.real = -z.imag;
	s.imag = z.real;
	s = c_tanh(s);
	r.real = s.imag;
	r.imag = -s.real;
	return r;
}

PyDoc_STRVAR(c_tan_doc,
"tan(x)\n"
"\n"
"Return the tangent of x.");


/* tanh(infinity + i*y) needs to be dealt with specially */
static Py_complex tanh_special_values[7][7];

static Py_complex
c_tanh(Py_complex z)
{
	/* Formula:

	   tanh(x+iy) = (tanh(x)(1+tan(y)^2) + i tan(y)(1-tanh(x))^2) /
	   (1+tan(y)^2 tanh(x)^2)

	   To avoid excessive roundoff error, 1-tanh(x)^2 is better computed
	   as 1/cosh(x)^2.  When abs(x) is large, we approximate 1-tanh(x)^2
	   by 4 exp(-2*x) instead, to avoid possible overflow in the
	   computation of cosh(x).

	*/

	Py_complex r;
	double tx, ty, cx, txty, denom;

	/* special treatment for tanh(+/-inf + iy) if y is finite and
	   nonzero */
	if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
		if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
		    && (z.imag != 0.)) {
			if (z.real > 0) {
				r.real = 1.0;
				r.imag = copysign(0.,
						  2.*sin(z.imag)*cos(z.imag));
			}
			else {
				r.real = -1.0;
				r.imag = copysign(0.,
						  2.*sin(z.imag)*cos(z.imag));
			}
		}
		else {
			r = tanh_special_values[special_type(z.real)]
				               [special_type(z.imag)];
		}
		/* need to set errno = EDOM if z.imag is +/-infinity and
		   z.real is finite */
		if (Py_IS_INFINITY(z.imag) && Py_IS_FINITE(z.real))
			errno = EDOM;
		else
			errno = 0;
		return r;
	}

	/* danger of overflow in 2.*z.imag !*/
	if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
		r.real = copysign(1., z.real);
		r.imag = 4.*sin(z.imag)*cos(z.imag)*exp(-2.*fabs(z.real));
	} else {
		tx = tanh(z.real);
		ty = tan(z.imag);
		cx = 1./cosh(z.real);
		txty = tx*ty;
		denom = 1. + txty*txty;
		r.real = tx*(1.+ty*ty)/denom;
		r.imag = ((ty/denom)*cx)*cx;
	}
	errno = 0;
	return r;
}

PyDoc_STRVAR(c_tanh_doc,
"tanh(x)\n"
"\n"
"Return the hyperbolic tangent of x.");


static PyObject *
cmath_log(PyObject *self, PyObject *args)
{
	Py_complex x;
	Py_complex y;

	if (!PyArg_ParseTuple(args, "D|D", &x, &y))
		return NULL;

	errno = 0;
	PyFPE_START_PROTECT("complex function", return 0)
	x = c_log(x);
	if (PyTuple_GET_SIZE(args) == 2)
		x = c_quot(x, c_log(y));
	PyFPE_END_PROTECT(x)
	if (errno != 0)
		return math_error();
	return PyComplex_FromCComplex(x);
}

PyDoc_STRVAR(cmath_log_doc,
"log(x[, base]) -> the logarithm of x to the given base.\n\
If the base not specified, returns the natural logarithm (base e) of x.");


/* And now the glue to make them available from Python: */

static PyObject *
math_error(void)
{
	if (errno == EDOM)
		PyErr_SetString(PyExc_ValueError, "math domain error");
	else if (errno == ERANGE)
		PyErr_SetString(PyExc_OverflowError, "math range error");
	else    /* Unexpected math error */
		PyErr_SetFromErrno(PyExc_ValueError);
	return NULL;
}

static PyObject *
math_1(PyObject *args, Py_complex (*func)(Py_complex))
{
	Py_complex x,r ;
	if (!PyArg_ParseTuple(args, "D", &x))
		return NULL;
	errno = 0;
	PyFPE_START_PROTECT("complex function", return 0);
	r = (*func)(x);
	PyFPE_END_PROTECT(r);
	if (errno == EDOM) {
		PyErr_SetString(PyExc_ValueError, "math domain error");
		return NULL;
	}
	else if (errno == ERANGE) {
		PyErr_SetString(PyExc_OverflowError, "math range error");
		return NULL;
	}
	else {
		return PyComplex_FromCComplex(r);
	}
}

#define FUNC1(stubname, func) \
	static PyObject * stubname(PyObject *self, PyObject *args) { \
		return math_1(args, func); \
	}

FUNC1(cmath_acos, c_acos)
FUNC1(cmath_acosh, c_acosh)
FUNC1(cmath_asin, c_asin)
FUNC1(cmath_asinh, c_asinh)
FUNC1(cmath_atan, c_atan)
FUNC1(cmath_atanh, c_atanh)
FUNC1(cmath_cos, c_cos)
FUNC1(cmath_cosh, c_cosh)
FUNC1(cmath_exp, c_exp)
FUNC1(cmath_log10, c_log10)
FUNC1(cmath_sin, c_sin)
FUNC1(cmath_sinh, c_sinh)
FUNC1(cmath_sqrt, c_sqrt)
FUNC1(cmath_tan, c_tan)
FUNC1(cmath_tanh, c_tanh)

static PyObject *
cmath_phase(PyObject *self, PyObject *args)
{
	Py_complex z;
	double phi;
	if (!PyArg_ParseTuple(args, "D:phase", &z))
		return NULL;
	errno = 0;
	PyFPE_START_PROTECT("arg function", return 0)
	phi = c_atan2(z);
	PyFPE_END_PROTECT(r)
	if (errno != 0)
		return math_error();
	else
		return PyFloat_FromDouble(phi);
}

PyDoc_STRVAR(cmath_phase_doc,
"phase(z) -> float\n\n\
Return argument, also known as the phase angle, of a complex.");

static PyObject *
cmath_polar(PyObject *self, PyObject *args)
{
	Py_complex z;
	double r, phi;
	if (!PyArg_ParseTuple(args, "D:polar", &z))
		return NULL;
	PyFPE_START_PROTECT("polar function", return 0)
	phi = c_atan2(z); /* should not cause any exception */
	r = c_abs(z); /* sets errno to ERANGE on overflow;  otherwise 0 */
	PyFPE_END_PROTECT(r)
	if (errno != 0)
		return math_error();
	else
		return Py_BuildValue("dd", r, phi);
}

PyDoc_STRVAR(cmath_polar_doc,
"polar(z) -> r: float, phi: float\n\n\
Convert a complex from rectangular coordinates to polar coordinates. r is\n\
the distance from 0 and phi the phase angle.");

/*
  rect() isn't covered by the C99 standard, but it's not too hard to
  figure out 'spirit of C99' rules for special value handing:

    rect(x, t) should behave like exp(log(x) + it) for positive-signed x
    rect(x, t) should behave like -exp(log(-x) + it) for negative-signed x
    rect(nan, t) should behave like exp(nan + it), except that rect(nan, 0)
      gives nan +- i0 with the sign of the imaginary part unspecified.

*/

static Py_complex rect_special_values[7][7];

static PyObject *
cmath_rect(PyObject *self, PyObject *args)
{
	Py_complex z;
	double r, phi;
	if (!PyArg_ParseTuple(args, "dd:rect", &r, &phi))
		return NULL;
	errno = 0;
	PyFPE_START_PROTECT("rect function", return 0)

	/* deal with special values */
	if (!Py_IS_FINITE(r) || !Py_IS_FINITE(phi)) {
		/* if r is +/-infinity and phi is finite but nonzero then
		   result is (+-INF +-INF i), but we need to compute cos(phi)
		   and sin(phi) to figure out the signs. */
		if (Py_IS_INFINITY(r) && (Py_IS_FINITE(phi)
					  && (phi != 0.))) {
			if (r > 0) {
				z.real = copysign(INF, cos(phi));
				z.imag = copysign(INF, sin(phi));
			}
			else {
				z.real = -copysign(INF, cos(phi));
				z.imag = -copysign(INF, sin(phi));
			}
		}
		else {
			z = rect_special_values[special_type(r)]
				               [special_type(phi)];
		}
		/* need to set errno = EDOM if r is a nonzero number and phi
		   is infinite */
		if (r != 0. && !Py_IS_NAN(r) && Py_IS_INFINITY(phi))
			errno = EDOM;
		else
			errno = 0;
	}
	else {
		z.real = r * cos(phi);
		z.imag = r * sin(phi);
		errno = 0;
	}

	PyFPE_END_PROTECT(z)
	if (errno != 0)
		return math_error();
	else
		return PyComplex_FromCComplex(z);
}

PyDoc_STRVAR(cmath_rect_doc,
"rect(r, phi) -> z: complex\n\n\
Convert from polar coordinates to rectangular coordinates.");

static PyObject *
cmath_isnan(PyObject *self, PyObject *args)
{
	Py_complex z;
	if (!PyArg_ParseTuple(args, "D:isnan", &z))
		return NULL;
	return PyBool_FromLong(Py_IS_NAN(z.real) || Py_IS_NAN(z.imag));
}

PyDoc_STRVAR(cmath_isnan_doc,
"isnan(z) -> bool\n\
Checks if the real or imaginary part of z not a number (NaN)");

static PyObject *
cmath_isinf(PyObject *self, PyObject *args)
{
	Py_complex z;
	if (!PyArg_ParseTuple(args, "D:isnan", &z))
		return NULL;
	return PyBool_FromLong(Py_IS_INFINITY(z.real) ||
			       Py_IS_INFINITY(z.imag));
}

PyDoc_STRVAR(cmath_isinf_doc,
"isinf(z) -> bool\n\
Checks if the real or imaginary part of z is infinite.");


PyDoc_STRVAR(module_doc,
"This module is always available. It provides access to mathematical\n"
"functions for complex numbers.");

static PyMethodDef cmath_methods[] = {
	{"acos",   cmath_acos,  METH_VARARGS, c_acos_doc},
	{"acosh",  cmath_acosh, METH_VARARGS, c_acosh_doc},
	{"asin",   cmath_asin,  METH_VARARGS, c_asin_doc},
	{"asinh",  cmath_asinh, METH_VARARGS, c_asinh_doc},
	{"atan",   cmath_atan,  METH_VARARGS, c_atan_doc},
	{"atanh",  cmath_atanh, METH_VARARGS, c_atanh_doc},
	{"cos",    cmath_cos,   METH_VARARGS, c_cos_doc},
	{"cosh",   cmath_cosh,  METH_VARARGS, c_cosh_doc},
	{"exp",    cmath_exp,   METH_VARARGS, c_exp_doc},
	{"isinf",  cmath_isinf, METH_VARARGS, cmath_isinf_doc},
	{"isnan",  cmath_isnan, METH_VARARGS, cmath_isnan_doc},
	{"log",    cmath_log,   METH_VARARGS, cmath_log_doc},
	{"log10",  cmath_log10, METH_VARARGS, c_log10_doc},
	{"phase",  cmath_phase, METH_VARARGS, cmath_phase_doc},
	{"polar",  cmath_polar, METH_VARARGS, cmath_polar_doc},
	{"rect",   cmath_rect,  METH_VARARGS, cmath_rect_doc},
	{"sin",    cmath_sin,   METH_VARARGS, c_sin_doc},
	{"sinh",   cmath_sinh,  METH_VARARGS, c_sinh_doc},
	{"sqrt",   cmath_sqrt,  METH_VARARGS, c_sqrt_doc},
	{"tan",    cmath_tan,   METH_VARARGS, c_tan_doc},
	{"tanh",   cmath_tanh,  METH_VARARGS, c_tanh_doc},
	{NULL,		NULL}		/* sentinel */
};

PyMODINIT_FUNC
initcmath(void)
{
	PyObject *m;

	m = Py_InitModule3("cmath", cmath_methods, module_doc);
	if (m == NULL)
		return;

	PyModule_AddObject(m, "pi",
                           PyFloat_FromDouble(Py_MATH_PI));
	PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));

	/* initialize special value tables */

#define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY }
#define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p;

	INIT_SPECIAL_VALUES(acos_special_values, {
	  C(P34,INF) C(P,INF)  C(P,INF)  C(P,-INF)  C(P,-INF)  C(P34,-INF) C(N,INF)
	  C(P12,INF) C(U,U)    C(U,U)    C(U,U)     C(U,U)     C(P12,-INF) C(N,N)
	  C(P12,INF) C(U,U)    C(P12,0.) C(P12,-0.) C(U,U)     C(P12,-INF) C(P12,N)
	  C(P12,INF) C(U,U)    C(P12,0.) C(P12,-0.) C(U,U)     C(P12,-INF) C(P12,N)
	  C(P12,INF) C(U,U)    C(U,U)    C(U,U)     C(U,U)     C(P12,-INF) C(N,N)
	  C(P14,INF) C(0.,INF) C(0.,INF) C(0.,-INF) C(0.,-INF) C(P14,-INF) C(N,INF)
	  C(N,INF)   C(N,N)    C(N,N)    C(N,N)     C(N,N)     C(N,-INF)   C(N,N)
	})

	INIT_SPECIAL_VALUES(acosh_special_values, {
	  C(INF,-P34) C(INF,-P)  C(INF,-P)  C(INF,P)  C(INF,P)  C(INF,P34) C(INF,N)
	  C(INF,-P12) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,P12) C(N,N)
	  C(INF,-P12) C(U,U)     C(0.,-P12) C(0.,P12) C(U,U)    C(INF,P12) C(N,N)
	  C(INF,-P12) C(U,U)     C(0.,-P12) C(0.,P12) C(U,U)    C(INF,P12) C(N,N)
	  C(INF,-P12) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,P12) C(N,N)
	  C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N)
	  C(INF,N)    C(N,N)     C(N,N)     C(N,N)    C(N,N)    C(INF,N)   C(N,N)
	})

	INIT_SPECIAL_VALUES(asinh_special_values, {
	  C(-INF,-P14) C(-INF,-0.) C(-INF,-0.) C(-INF,0.) C(-INF,0.) C(-INF,P14) C(-INF,N)
	  C(-INF,-P12) C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(-INF,P12) C(N,N)
	  C(-INF,-P12) C(U,U)      C(-0.,-0.)  C(-0.,0.)  C(U,U)     C(-INF,P12) C(N,N)
	  C(INF,-P12)  C(U,U)      C(0.,-0.)   C(0.,0.)   C(U,U)     C(INF,P12)  C(N,N)
	  C(INF,-P12)  C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(INF,P12)  C(N,N)
	  C(INF,-P14)  C(INF,-0.)  C(INF,-0.)  C(INF,0.)  C(INF,0.)  C(INF,P14)  C(INF,N)
	  C(INF,N)     C(N,N)      C(N,-0.)    C(N,0.)    C(N,N)     C(INF,N)    C(N,N)
	})

	INIT_SPECIAL_VALUES(atanh_special_values, {
	  C(-0.,-P12) C(-0.,-P12) C(-0.,-P12) C(-0.,P12) C(-0.,P12) C(-0.,P12) C(-0.,N)
	  C(-0.,-P12) C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(-0.,P12) C(N,N)
	  C(-0.,-P12) C(U,U)      C(-0.,-0.)  C(-0.,0.)  C(U,U)     C(-0.,P12) C(-0.,N)
	  C(0.,-P12)  C(U,U)      C(0.,-0.)   C(0.,0.)   C(U,U)     C(0.,P12)  C(0.,N)
	  C(0.,-P12)  C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(0.,P12)  C(N,N)
	  C(0.,-P12)  C(0.,-P12)  C(0.,-P12)  C(0.,P12)  C(0.,P12)  C(0.,P12)  C(0.,N)
	  C(0.,-P12)  C(N,N)      C(N,N)      C(N,N)     C(N,N)     C(0.,P12)  C(N,N)
	})

	INIT_SPECIAL_VALUES(cosh_special_values, {
	  C(INF,N) C(U,U) C(INF,0.)  C(INF,-0.) C(U,U) C(INF,N) C(INF,N)
	  C(N,N)   C(U,U) C(U,U)     C(U,U)     C(U,U) C(N,N)   C(N,N)
	  C(N,0.)  C(U,U) C(1.,0.)   C(1.,-0.)  C(U,U) C(N,0.)  C(N,0.)
	  C(N,0.)  C(U,U) C(1.,-0.)  C(1.,0.)   C(U,U) C(N,0.)  C(N,0.)
	  C(N,N)   C(U,U) C(U,U)     C(U,U)     C(U,U) C(N,N)   C(N,N)
	  C(INF,N) C(U,U) C(INF,-0.) C(INF,0.)  C(U,U) C(INF,N) C(INF,N)
	  C(N,N)   C(N,N) C(N,0.)    C(N,0.)    C(N,N) C(N,N)   C(N,N)
	})

	INIT_SPECIAL_VALUES(exp_special_values, {
	  C(0.,0.) C(U,U) C(0.,-0.)  C(0.,0.)  C(U,U) C(0.,0.) C(0.,0.)
	  C(N,N)   C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)   C(N,N)
	  C(N,N)   C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(N,N)   C(N,N)
	  C(N,N)   C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(N,N)   C(N,N)
	  C(N,N)   C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)   C(N,N)
	  C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N)
	  C(N,N)   C(N,N) C(N,-0.)   C(N,0.)   C(N,N) C(N,N)   C(N,N)
	})

	INIT_SPECIAL_VALUES(log_special_values, {
	  C(INF,-P34) C(INF,-P)  C(INF,-P)   C(INF,P)   C(INF,P)  C(INF,P34)  C(INF,N)
	  C(INF,-P12) C(U,U)     C(U,U)      C(U,U)     C(U,U)    C(INF,P12)  C(N,N)
	  C(INF,-P12) C(U,U)     C(-INF,-P)  C(-INF,P)  C(U,U)    C(INF,P12)  C(N,N)
	  C(INF,-P12) C(U,U)     C(-INF,-0.) C(-INF,0.) C(U,U)    C(INF,P12)  C(N,N)
	  C(INF,-P12) C(U,U)     C(U,U)      C(U,U)     C(U,U)    C(INF,P12)  C(N,N)
	  C(INF,-P14) C(INF,-0.) C(INF,-0.)  C(INF,0.)  C(INF,0.) C(INF,P14)  C(INF,N)
	  C(INF,N)    C(N,N)     C(N,N)      C(N,N)     C(N,N)    C(INF,N)    C(N,N)
	})

	INIT_SPECIAL_VALUES(sinh_special_values, {
	  C(INF,N) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,N) C(INF,N)
	  C(N,N)   C(U,U) C(U,U)      C(U,U)     C(U,U) C(N,N)   C(N,N)
	  C(0.,N)  C(U,U) C(-0.,-0.)  C(-0.,0.)  C(U,U) C(0.,N)  C(0.,N)
	  C(0.,N)  C(U,U) C(0.,-0.)   C(0.,0.)   C(U,U) C(0.,N)  C(0.,N)
	  C(N,N)   C(U,U) C(U,U)      C(U,U)     C(U,U) C(N,N)   C(N,N)
	  C(INF,N) C(U,U) C(INF,-0.)  C(INF,0.)  C(U,U) C(INF,N) C(INF,N)
	  C(N,N)   C(N,N) C(N,-0.)    C(N,0.)    C(N,N) C(N,N)   C(N,N)
	})

	INIT_SPECIAL_VALUES(sqrt_special_values, {
	  C(INF,-INF) C(0.,-INF) C(0.,-INF) C(0.,INF) C(0.,INF) C(INF,INF) C(N,INF)
	  C(INF,-INF) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,INF) C(N,N)
	  C(INF,-INF) C(U,U)     C(0.,-0.)  C(0.,0.)  C(U,U)    C(INF,INF) C(N,N)
	  C(INF,-INF) C(U,U)     C(0.,-0.)  C(0.,0.)  C(U,U)    C(INF,INF) C(N,N)
	  C(INF,-INF) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,INF) C(N,N)
	  C(INF,-INF) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,INF) C(INF,N)
	  C(INF,-INF) C(N,N)     C(N,N)     C(N,N)    C(N,N)    C(INF,INF) C(N,N)
	})

	INIT_SPECIAL_VALUES(tanh_special_values, {
	  C(-1.,0.) C(U,U) C(-1.,-0.) C(-1.,0.) C(U,U) C(-1.,0.) C(-1.,0.)
	  C(N,N)    C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)    C(N,N)
	  C(N,N)    C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(N,N)    C(N,N)
	  C(N,N)    C(U,U) C(0.,-0.)  C(0.,0.)  C(U,U) C(N,N)    C(N,N)
	  C(N,N)    C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)    C(N,N)
	  C(1.,0.)  C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(1.,0.)  C(1.,0.)
	  C(N,N)    C(N,N) C(N,-0.)   C(N,0.)   C(N,N) C(N,N)    C(N,N)
	})

	INIT_SPECIAL_VALUES(rect_special_values, {
	  C(INF,N) C(U,U) C(-INF,0.) C(-INF,-0.) C(U,U) C(INF,N) C(INF,N)
	  C(N,N)   C(U,U) C(U,U)     C(U,U)      C(U,U) C(N,N)   C(N,N)
	  C(0.,0.) C(U,U) C(-0.,0.)  C(-0.,-0.)  C(U,U) C(0.,0.) C(0.,0.)
	  C(0.,0.) C(U,U) C(0.,-0.)  C(0.,0.)    C(U,U) C(0.,0.) C(0.,0.)
	  C(N,N)   C(U,U) C(U,U)     C(U,U)      C(U,U) C(N,N)   C(N,N)
	  C(INF,N) C(U,U) C(INF,-0.) C(INF,0.)   C(U,U) C(INF,N) C(INF,N)
	  C(N,N)   C(N,N) C(N,0.)    C(N,0.)     C(N,N) C(N,N)   C(N,N)
	})
}
