mathmodule.c 30.4 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2
/* Math module -- standard C math library functions, pi and e */

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
/* Here are some comments from Tim Peters, extracted from the
   discussion attached to http://bugs.python.org/issue1640.  They
   describe the general aims of the math module with respect to
   special values, IEEE-754 floating-point exceptions, and Python
   exceptions.

These are the "spirit of 754" rules:

1. If the mathematical result is a real number, but of magnitude too
large to approximate by a machine float, overflow is signaled and the
result is an infinity (with the appropriate sign).

2. If the mathematical result is a real number, but of magnitude too
small to approximate by a machine float, underflow is signaled and the
result is a zero (with the appropriate sign).

3. At a singularity (a value x such that the limit of f(y) as y
approaches x exists and is an infinity), "divide by zero" is signaled
and the result is an infinity (with the appropriate sign).  This is
complicated a little by that the left-side and right-side limits may
not be the same; e.g., 1/x approaches +inf or -inf as x approaches 0
from the positive or negative directions.  In that specific case, the
sign of the zero determines the result of 1/0.

4. At a point where a function has no defined result in the extended
reals (i.e., the reals plus an infinity or two), invalid operation is
signaled and a NaN is returned.

And these are what Python has historically /tried/ to do (but not
always successfully, as platform libm behavior varies a lot):

For #1, raise OverflowError.

For #2, return a zero (with the appropriate sign if that happens by
accident ;-)).

For #3 and #4, raise ValueError.  It may have made sense to raise
Python's ZeroDivisionError in #3, but historically that's only been
raised for division by zero and mod by zero.

*/

/*
   In general, on an IEEE-754 platform the aim is to follow the C99
   standard, including Annex 'F', whenever possible.  Where the
   standard recommends raising the 'divide-by-zero' or 'invalid'
   floating-point exceptions, Python should raise a ValueError.  Where
   the standard recommends raising 'overflow', Python should raise an
   OverflowError.  In all other circumstances a value should be
   returned.
 */

Barry Warsaw's avatar
Barry Warsaw committed
55
#include "Python.h"
56
#include "longintrepr.h" /* just for SHIFT */
Guido van Rossum's avatar
Guido van Rossum committed
57

58 59 60 61 62
#ifdef _OSF_SOURCE
/* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
extern double copysign(double, double);
#endif

63 64 65 66 67 68
/* Call is_error when errno != 0, and where x is the result libm
 * returned.  is_error will usually set up an exception and return
 * true (1), but may return false (0) without setting up an exception.
 */
static int
is_error(double x)
69
{
70
	int result = 1;	/* presumption of guilt */
71
	assert(errno);	/* non-zero errno is a precondition for calling */
72
	if (errno == EDOM)
Barry Warsaw's avatar
Barry Warsaw committed
73
		PyErr_SetString(PyExc_ValueError, "math domain error");
74

75 76 77 78
	else if (errno == ERANGE) {
		/* ANSI C generally requires libm functions to set ERANGE
		 * on overflow, but also generally *allows* them to set
		 * ERANGE on underflow too.  There's no consistency about
79 80 81 82 83 84
		 * the latter across platforms.
		 * Alas, C99 never requires that errno be set.
		 * Here we suppress the underflow errors (libm functions
		 * should return a zero on underflow, and +- HUGE_VAL on
		 * overflow, so testing the result for zero suffices to
		 * distinguish the cases).
85 86 87 88 89
		 *
		 * On some platforms (Ubuntu/ia64) it seems that errno can be
		 * set to ERANGE for subnormal results that do *not* underflow
		 * to zero.  So to be safe, we'll ignore ERANGE whenever the
		 * function result is less than one in absolute value.
90
		 */
91 92 93
		if (fabs(x) < 1.0)
			result = 0;
		else
94
			PyErr_SetString(PyExc_OverflowError,
95 96
					"math range error");
	}
97
	else
Barry Warsaw's avatar
Barry Warsaw committed
98 99
                /* Unexpected math error */
		PyErr_SetFromErrno(PyExc_ValueError);
100
	return result;
101 102
}

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
/*
   wrapper for atan2 that deals directly with special cases before
   delegating to the platform libm for the remaining cases.  This
   is necessary to get consistent behaviour across platforms.
   Windows, FreeBSD and alpha Tru64 are amongst platforms that don't
   always follow C99.
*/

static double
m_atan2(double y, double x)
{
	if (Py_IS_NAN(x) || Py_IS_NAN(y))
		return Py_NAN;
	if (Py_IS_INFINITY(y)) {
		if (Py_IS_INFINITY(x)) {
			if (copysign(1., x) == 1.)
				/* atan2(+-inf, +inf) == +-pi/4 */
				return copysign(0.25*Py_MATH_PI, y);
			else
				/* atan2(+-inf, -inf) == +-pi*3/4 */
				return copysign(0.75*Py_MATH_PI, y);
		}
		/* atan2(+-inf, x) == +-pi/2 for finite x */
		return copysign(0.5*Py_MATH_PI, y);
	}
	if (Py_IS_INFINITY(x) || y == 0.) {
		if (copysign(1., x) == 1.)
			/* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
			return copysign(0., y);
		else
			/* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
			return copysign(Py_MATH_PI, y);
	}
	return atan2(y, x);
}

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
/*
   math_1 is used to wrap a libm function f that takes a double
   arguments and returns a double.

   The error reporting follows these rules, which are designed to do
   the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
   platforms.

   - a NaN result from non-NaN inputs causes ValueError to be raised
   - an infinite result from finite inputs causes OverflowError to be
     raised if can_overflow is 1, or raises ValueError if can_overflow
     is 0.
   - if the result is finite and errno == EDOM then ValueError is
     raised
   - if the result is finite and nonzero and errno == ERANGE then
     OverflowError is raised

   The last rule is used to catch overflow on platforms which follow
   C89 but for which HUGE_VAL is not an infinity.

   For the majority of one-argument functions these rules are enough
   to ensure that Python's functions behave as specified in 'Annex F'
   of the C99 standard, with the 'invalid' and 'divide-by-zero'
   floating-point exceptions mapping to Python's ValueError and the
   'overflow' floating-point exception mapping to OverflowError.
   math_1 only works for functions that don't have singularities *and*
   the possibility of overflow; fortunately, that covers everything we
   care about right now.
*/

Barry Warsaw's avatar
Barry Warsaw committed
169
static PyObject *
170
math_1(PyObject *arg, double (*func) (double), int can_overflow)
Guido van Rossum's avatar
Guido van Rossum committed
171
{
172 173
	double x, r;
	x = PyFloat_AsDouble(arg);
174
	if (x == -1.0 && PyErr_Occurred())
Guido van Rossum's avatar
Guido van Rossum committed
175 176
		return NULL;
	errno = 0;
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
	PyFPE_START_PROTECT("in math_1", return 0);
	r = (*func)(x);
	PyFPE_END_PROTECT(r);
	if (Py_IS_NAN(r)) {
		if (!Py_IS_NAN(x))
			errno = EDOM;
		else
			errno = 0;
	}
	else if (Py_IS_INFINITY(r)) {
		if (Py_IS_FINITE(x))
			errno = can_overflow ? ERANGE : EDOM;
		else
			errno = 0;
	}
	if (errno && is_error(r))
193
		return NULL;
Guido van Rossum's avatar
Guido van Rossum committed
194
	else
195
		return PyFloat_FromDouble(r);
Guido van Rossum's avatar
Guido van Rossum committed
196 197
}

198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
/*
   math_2 is used to wrap a libm function f that takes two double
   arguments and returns a double.

   The error reporting follows these rules, which are designed to do
   the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
   platforms.

   - a NaN result from non-NaN inputs causes ValueError to be raised
   - an infinite result from finite inputs causes OverflowError to be
     raised.
   - if the result is finite and errno == EDOM then ValueError is
     raised
   - if the result is finite and nonzero and errno == ERANGE then
     OverflowError is raised

   The last rule is used to catch overflow on platforms which follow
   C89 but for which HUGE_VAL is not an infinity.

   For most two-argument functions (copysign, fmod, hypot, atan2)
   these rules are enough to ensure that Python's functions behave as
   specified in 'Annex F' of the C99 standard, with the 'invalid' and
   'divide-by-zero' floating-point exceptions mapping to Python's
   ValueError and the 'overflow' floating-point exception mapping to
   OverflowError.
*/

Barry Warsaw's avatar
Barry Warsaw committed
225
static PyObject *
226
math_2(PyObject *args, double (*func) (double, double), char *funcname)
Guido van Rossum's avatar
Guido van Rossum committed
227
{
228
	PyObject *ox, *oy;
229
	double x, y, r;
230 231 232 233 234
	if (! PyArg_UnpackTuple(args, funcname, 2, 2, &ox, &oy))
		return NULL;
	x = PyFloat_AsDouble(ox);
	y = PyFloat_AsDouble(oy);
	if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
Guido van Rossum's avatar
Guido van Rossum committed
235 236
		return NULL;
	errno = 0;
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
	PyFPE_START_PROTECT("in math_2", return 0);
	r = (*func)(x, y);
	PyFPE_END_PROTECT(r);
	if (Py_IS_NAN(r)) {
		if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
			errno = EDOM;
		else
			errno = 0;
	}
	else if (Py_IS_INFINITY(r)) {
		if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
			errno = ERANGE;
		else
			errno = 0;
	}
	if (errno && is_error(r))
253
		return NULL;
Guido van Rossum's avatar
Guido van Rossum committed
254
	else
255
		return PyFloat_FromDouble(r);
Guido van Rossum's avatar
Guido van Rossum committed
256 257
}

258
#define FUNC1(funcname, func, can_overflow, docstring)			\
259
	static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
260
		return math_1(args, func, can_overflow);		    \
261
	}\
262
        PyDoc_STRVAR(math_##funcname##_doc, docstring);
Guido van Rossum's avatar
Guido van Rossum committed
263

264 265
#define FUNC2(funcname, func, docstring) \
	static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
266
		return math_2(args, func, #funcname); \
267
	}\
268
        PyDoc_STRVAR(math_##funcname##_doc, docstring);
269

270
FUNC1(acos, acos, 0,
271
      "acos(x)\n\nReturn the arc cosine (measured in radians) of x.")
272 273 274
FUNC1(acosh, acosh, 0,
      "acosh(x)\n\nReturn the hyperbolic arc cosine (measured in radians) of x.")
FUNC1(asin, asin, 0,
275
      "asin(x)\n\nReturn the arc sine (measured in radians) of x.")
276 277 278
FUNC1(asinh, asinh, 0,
      "asinh(x)\n\nReturn the hyperbolic arc sine (measured in radians) of x.")
FUNC1(atan, atan, 0,
279
      "atan(x)\n\nReturn the arc tangent (measured in radians) of x.")
280
FUNC2(atan2, m_atan2,
281 282
      "atan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\n"
      "Unlike atan(y/x), the signs of both x and y are considered.")
283 284 285
FUNC1(atanh, atanh, 0,
      "atanh(x)\n\nReturn the hyperbolic arc tangent (measured in radians) of x.")
FUNC1(ceil, ceil, 0,
286 287
      "ceil(x)\n\nReturn the ceiling of x as a float.\n"
      "This is the smallest integral value >= x.")
288 289 290
FUNC2(copysign, copysign,
      "copysign(x,y)\n\nReturn x with the sign of y.")
FUNC1(cos, cos, 0,
291
      "cos(x)\n\nReturn the cosine of x (measured in radians).")
292
FUNC1(cosh, cosh, 1,
293
      "cosh(x)\n\nReturn the hyperbolic cosine of x.")
294
FUNC1(exp, exp, 1,
295
      "exp(x)\n\nReturn e raised to the power of x.")
296
FUNC1(fabs, fabs, 0,
297
      "fabs(x)\n\nReturn the absolute value of the float x.")
298
FUNC1(floor, floor, 0,
299 300
      "floor(x)\n\nReturn the floor of x as a float.\n"
      "This is the largest integral value <= x.")
301 302 303 304
FUNC1(log1p, log1p, 1,
      "log1p(x)\n\nReturn the natural logarithm of 1+x (base e).\n\
      The result is computed in a way which is accurate for x near zero.")
FUNC1(sin, sin, 0,
305
      "sin(x)\n\nReturn the sine of x (measured in radians).")
306
FUNC1(sinh, sinh, 1,
307
      "sinh(x)\n\nReturn the hyperbolic sine of x.")
308
FUNC1(sqrt, sqrt, 0,
309
      "sqrt(x)\n\nReturn the square root of x.")
310
FUNC1(tan, tan, 0,
311
      "tan(x)\n\nReturn the tangent of x (measured in radians).")
312
FUNC1(tanh, tanh, 0,
313
      "tanh(x)\n\nReturn the hyperbolic tangent of x.")
Guido van Rossum's avatar
Guido van Rossum committed
314

315 316 317 318
/* Precision summation function as msum() by Raymond Hettinger in
   <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393090>,
   enhanced with the exact partials sum and roundoff from Mark
   Dickinson's post at <http://bugs.python.org/file10357/msum4.py>.
319 320 321 322 323 324 325
   See those links for more details, proofs and other references.

   Note 1: IEEE 754R floating point semantics are assumed,
   but the current implementation does not re-establish special
   value semantics across iterations (i.e. handling -Inf + Inf).

   Note 2:  No provision is made for intermediate overflow handling;
Raymond Hettinger's avatar
Raymond Hettinger committed
326
   therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while
327 328 329
   sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
   overflow of the first partial sum.

Andrew M. Kuchling's avatar
Andrew M. Kuchling committed
330
   Note 3: The intermediate values lo, yr, and hi are declared volatile so
331
   aggressive compilers won't algebraically reduce lo to always be exactly 0.0.
332 333
   Also, the volatile declaration forces the values to be stored in memory as
   regular doubles instead of extended long precision (80-bit) values.  This
Andrew M. Kuchling's avatar
Andrew M. Kuchling committed
334
   prevents double rounding because any addition or subtraction of two doubles
335 336 337 338 339 340 341 342
   can be resolved exactly into double-sized hi and lo values.  As long as the 
   hi value gets forced into a double before yr and lo are computed, the extra
   bits in downstream extended precision operations (x87 for example) will be
   exactly zero and therefore can be losslessly stored back into a double,
   thereby preventing double rounding.

   Note 4: A similar implementation is in Modules/cmathmodule.c.
   Be sure to update both when making changes.
343

344
   Note 5: The signature of math.fsum() differs from __builtin__.sum()
345 346 347 348
   because the start argument doesn't make sense in the context of
   accurate summation.  Since the partials table is collapsed before
   returning a result, sum(seq2, start=sum(seq1)) may not equal the
   accurate result returned by sum(itertools.chain(seq1, seq2)).
349 350 351 352
*/

#define NUM_PARTIALS  32  /* initial partials array size, on stack */

353 354
/* Extend the partials array p[] by doubling its size. */
static int                          /* non-zero on error */
355
_fsum_realloc(double **p_ptr, Py_ssize_t  n,
356
             double  *ps,    Py_ssize_t *m_ptr)
357 358 359 360
{
	void *v = NULL;
	Py_ssize_t m = *m_ptr;

361 362 363
	m += m;  /* double */
	if (n < m && m < (PY_SSIZE_T_MAX / sizeof(double))) {
		double *p = *p_ptr;
364
		if (p == ps) {
365
			v = PyMem_Malloc(sizeof(double) * m);
366
			if (v != NULL)
367
				memcpy(v, ps, sizeof(double) * n);
368 369
		}
		else
370
			v = PyMem_Realloc(p, sizeof(double) * m);
371
	}
372
	if (v == NULL) {        /* size overflow or no memory */
373
		PyErr_SetString(PyExc_MemoryError, "math.fsum partials");
374 375
		return 1;
	}
376
	*p_ptr = (double*) v;
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
	*m_ptr = m;
	return 0;
}

/* Full precision summation of a sequence of floats.

   def msum(iterable):
       partials = []  # sorted, non-overlapping partial sums
       for x in iterable:
           i = 0
           for y in partials:
               if abs(x) < abs(y):
                   x, y = y, x
               hi = x + y
               lo = y - (hi - x)
               if lo:
                   partials[i] = lo
                   i += 1
               x = hi
           partials[i:] = [x]
       return sum_exact(partials)

   Rounded x+y stored in hi with the roundoff stored in lo.  Together hi+lo
   are exactly equal to x+y.  The inner loop applies hi/lo summation to each
   partial so that the list of partial sums remains exact.

   Sum_exact() adds the partial sums exactly and correctly rounds the final
   result (using the round-half-to-even rule).  The items in partials remain
   non-zero, non-special, non-overlapping and strictly increasing in
   magnitude, but possibly not all having the same sign.

408 409 410
   Depends on IEEE 754 arithmetic guarantees and half-even rounding.
*/

411
static PyObject*
412
math_fsum(PyObject *self, PyObject *seq)
413 414 415
{
	PyObject *item, *iter, *sum = NULL;
	Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;
416
	double x, y, t, ps[NUM_PARTIALS], *p = ps;
417
	double xsave, special_sum = 0.0, inf_sum = 0.0;
418
	volatile double hi, yr, lo;
419 420 421 422 423

	iter = PyObject_GetIter(seq);
	if (iter == NULL)
		return NULL;

424
	PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)
425

426
	for(;;) {           /* for x in iterable */
427 428 429 430 431 432 433
		assert(0 <= n && n <= m);
		assert((m == NUM_PARTIALS && p == ps) ||
		       (m >  NUM_PARTIALS && p != NULL));

		item = PyIter_Next(iter);
		if (item == NULL) {
			if (PyErr_Occurred())
434
				goto _fsum_error;
435
			break;
436
		}
437
		x = PyFloat_AsDouble(item);
438 439
		Py_DECREF(item);
		if (PyErr_Occurred())
440
			goto _fsum_error;
441

442
		xsave = x;
443
		for (i = j = 0; j < n; j++) {       /* for y in partials */
444
			y = p[j];
445
			if (fabs(x) < fabs(y)) {
446
				t = x; x = y; y = t;
447
			}
448
			hi = x + y;
449 450
			yr = hi - x;
			lo = y - yr;
451 452 453 454
			if (lo != 0.0)
				p[i++] = lo;
			x = hi;
		}
455 456

		n = i;                              /* ps[i:] = [x] */
457
		if (x != 0.0) {
458 459 460 461 462 463 464
			if (! Py_IS_FINITE(x)) {
				/* a nonfinite x could arise either as
				   a result of intermediate overflow, or
				   as a result of a nan or inf in the
				   summands */
				if (Py_IS_FINITE(xsave)) {
					PyErr_SetString(PyExc_OverflowError,
465 466
					      "intermediate overflow in fsum");
					goto _fsum_error;
467 468 469 470 471
				}
				if (Py_IS_INFINITY(xsave))
					inf_sum += xsave;
				special_sum += xsave;
				/* reset partials */
472
				n = 0;
473
			}
474 475
			else if (n >= m && _fsum_realloc(&p, n, ps, &m))
				goto _fsum_error;
476 477
			else
				p[n++] = x;
478 479 480
		}
	}

481 482 483
	if (special_sum != 0.0) {
		if (Py_IS_NAN(inf_sum))
			PyErr_SetString(PyExc_ValueError,
484
					"-inf + inf in fsum");
485 486
		else
			sum = PyFloat_FromDouble(special_sum);
487
		goto _fsum_error;
488 489
	}

490
	hi = 0.0;
491 492
	if (n > 0) {
		hi = p[--n];
493 494 495 496 497 498 499 500 501 502 503
		/* sum_exact(ps, hi) from the top, stop when the sum becomes
		   inexact. */
		while (n > 0) {
			x = hi;
			y = p[--n];
			assert(fabs(y) < fabs(x));
			hi = x + y;
			yr = hi - x;
			lo = y - yr;
			if (lo != 0.0)
				break;
504
		}
505 506 507 508
		/* Make half-even rounding work across multiple partials.
		   Needed so that sum([1e-16, 1, 1e16]) will round-up the last
		   digit to two instead of down to zero (the 1e-16 makes the 1
		   slightly closer to two).  With a potential 1 ULP rounding
509
		   error fixed-up, math.fsum() can guarantee commutativity. */
510 511 512 513 514 515 516
		if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
			      (lo > 0.0 && p[n-1] > 0.0))) {
			y = lo * 2.0;
			x = hi + y;
			yr = x - hi;
			if (y == yr)
				hi = x;
517 518
		}
	}
519
	sum = PyFloat_FromDouble(hi);
520

521
_fsum_error:
522 523 524 525 526 527 528 529 530
	PyFPE_END_PROTECT(hi)
	Py_DECREF(iter);
	if (p != ps)
		PyMem_Free(p);
	return sum;
}

#undef NUM_PARTIALS

531
PyDoc_STRVAR(math_fsum_doc,
532 533 534
"sum(iterable)\n\n\
Return an accurate floating point sum of values in the iterable.\n\
Assumes IEEE-754 floating point arithmetic.");
535

536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
static PyObject *
math_factorial(PyObject *self, PyObject *arg)
{
	long i, x;
	PyObject *result, *iobj, *newresult;

	if (PyFloat_Check(arg)) {
		double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);
		if (dx != floor(dx)) {
			PyErr_SetString(PyExc_ValueError, 
				"factorial() only accepts integral values");
			return NULL;
		}
	}

	x = PyInt_AsLong(arg);
	if (x == -1 && PyErr_Occurred())
		return NULL;
	if (x < 0) {
		PyErr_SetString(PyExc_ValueError, 
			"factorial() not defined for negative values");
		return NULL;
	}

	result = (PyObject *)PyInt_FromLong(1);
	if (result == NULL)
		return NULL;
	for (i=1 ; i<=x ; i++) {
		iobj = (PyObject *)PyInt_FromLong(i);
		if (iobj == NULL)
			goto error;
		newresult = PyNumber_Multiply(result, iobj);
		Py_DECREF(iobj);
		if (newresult == NULL)
			goto error;
		Py_DECREF(result);
		result = newresult;
	}
	return result;

error:
	Py_DECREF(result);
	return NULL;
}

PyDoc_STRVAR(math_factorial_doc, "Return n!");

583 584 585 586 587 588 589 590 591
static PyObject *
math_trunc(PyObject *self, PyObject *number)
{
	return PyObject_CallMethod(number, "__trunc__", NULL);
}

PyDoc_STRVAR(math_trunc_doc,
"trunc(x:Real) -> Integral\n"
"\n"
Raymond Hettinger's avatar
Raymond Hettinger committed
592
"Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");
593

Barry Warsaw's avatar
Barry Warsaw committed
594
static PyObject *
595
math_frexp(PyObject *self, PyObject *arg)
596 597
{
	int i;
598 599
	double x = PyFloat_AsDouble(arg);
	if (x == -1.0 && PyErr_Occurred())
600
		return NULL;
601 602 603 604 605 606 607 608 609 610 611
	/* deal with special cases directly, to sidestep platform
	   differences */
	if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
		i = 0;
	}
	else {
		PyFPE_START_PROTECT("in math_frexp", return 0);
		x = frexp(x, &i);
		PyFPE_END_PROTECT(x);
	}
	return Py_BuildValue("(di)", x, i);
612 613
}

614
PyDoc_STRVAR(math_frexp_doc,
615 616 617 618
"frexp(x)\n"
"\n"
"Return the mantissa and exponent of x, as pair (m, e).\n"
"m is a float and e is an int, such that x = m * 2.**e.\n"
619
"If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.");
620

Barry Warsaw's avatar
Barry Warsaw committed
621
static PyObject *
622
math_ldexp(PyObject *self, PyObject *args)
623
{
624
	double x, r;
625 626 627
	PyObject *oexp;
	long exp;
	if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp))
628
		return NULL;
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666

	if (PyLong_Check(oexp)) {
		/* on overflow, replace exponent with either LONG_MAX
		   or LONG_MIN, depending on the sign. */
		exp = PyLong_AsLong(oexp);
		if (exp == -1 && PyErr_Occurred()) {
			if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
				if (Py_SIZE(oexp) < 0) {
					exp = LONG_MIN;
				}
				else {
					exp = LONG_MAX;
				}
				PyErr_Clear();
			}
			else {
				/* propagate any unexpected exception */
				return NULL;
			}
		}
	}
	else if (PyInt_Check(oexp)) {
		exp = PyInt_AS_LONG(oexp);
	}
	else {
		PyErr_SetString(PyExc_TypeError,
				"Expected an int or long as second argument "
				"to ldexp.");
		return NULL;
	}

	if (x == 0. || !Py_IS_FINITE(x)) {
		/* NaNs, zeros and infinities are returned unchanged */
		r = x;
		errno = 0;
	} else if (exp > INT_MAX) {
		/* overflow */
		r = copysign(Py_HUGE_VAL, x);
667
		errno = ERANGE;
668 669 670
	} else if (exp < INT_MIN) {
		/* underflow to +-0 */
		r = copysign(0., x);
671
		errno = 0;
672 673 674 675 676 677 678 679 680
	} else {
		errno = 0;
		PyFPE_START_PROTECT("in math_ldexp", return 0);
		r = ldexp(x, (int)exp);
		PyFPE_END_PROTECT(r);
		if (Py_IS_INFINITY(r))
			errno = ERANGE;
	}

681
	if (errno && is_error(r))
682
		return NULL;
683
	return PyFloat_FromDouble(r);
684 685
}

686 687
PyDoc_STRVAR(math_ldexp_doc,
"ldexp(x, i) -> x * (2**i)");
688

Barry Warsaw's avatar
Barry Warsaw committed
689
static PyObject *
690
math_modf(PyObject *self, PyObject *arg)
691
{
692 693
	double y, x = PyFloat_AsDouble(arg);
	if (x == -1.0 && PyErr_Occurred())
694
		return NULL;
695 696 697 698 699 700 701 702 703
	/* some platforms don't do the right thing for NaNs and
	   infinities, so we take care of special cases directly. */
	if (!Py_IS_FINITE(x)) {
		if (Py_IS_INFINITY(x))
			return Py_BuildValue("(dd)", copysign(0., x), x);
		else if (Py_IS_NAN(x))
			return Py_BuildValue("(dd)", x, x);
	}          

704
	errno = 0;
705
	PyFPE_START_PROTECT("in math_modf", return 0);
706
	x = modf(x, &y);
707 708
	PyFPE_END_PROTECT(x);
	return Py_BuildValue("(dd)", x, y);
709
}
Guido van Rossum's avatar
Guido van Rossum committed
710

711
PyDoc_STRVAR(math_modf_doc,
712 713 714
"modf(x)\n"
"\n"
"Return the fractional and integer parts of x.  Both results carry the sign\n"
715
"of x.  The integer part is returned as a real.");
716

717 718 719 720 721 722 723 724 725
/* A decent logarithm is easy to compute even for huge longs, but libm can't
   do that by itself -- loghelper can.  func is log or log10, and name is
   "log" or "log10".  Note that overflow isn't possible:  a long can contain
   no more than INT_MAX * SHIFT bits, so has value certainly less than
   2**(2**64 * 2**16) == 2**2**80, and log2 of that is 2**80, which is
   small enough to fit in an IEEE single.  log and log10 are even smaller.
*/

static PyObject*
726
loghelper(PyObject* arg, double (*func)(double), char *funcname)
727 728 729 730 731 732 733 734 735 736 737
{
	/* If it is long, do it ourselves. */
	if (PyLong_Check(arg)) {
		double x;
		int e;
		x = _PyLong_AsScaledDouble(arg, &e);
		if (x <= 0.0) {
			PyErr_SetString(PyExc_ValueError,
					"math domain error");
			return NULL;
		}
738 739 740
		/* Value is ~= x * 2**(e*PyLong_SHIFT), so the log ~=
		   log(x) + log(2) * e * PyLong_SHIFT.
		   CAUTION:  e*PyLong_SHIFT may overflow using int arithmetic,
741
		   so force use of double. */
742
		x = func(x) + (e * (double)PyLong_SHIFT) * func(2.0);
743 744 745 746
		return PyFloat_FromDouble(x);
	}

	/* Else let libm handle it by itself. */
747
	return math_1(arg, func, 0);
748 749 750 751 752
}

static PyObject *
math_log(PyObject *self, PyObject *args)
{
753 754 755 756 757
	PyObject *arg;
	PyObject *base = NULL;
	PyObject *num, *den;
	PyObject *ans;

758
	if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))
759 760
		return NULL;

761 762 763
	num = loghelper(arg, log, "log");
	if (num == NULL || base == NULL)
		return num;
764

765
	den = loghelper(base, log, "log");
766 767 768 769 770 771 772 773 774
	if (den == NULL) {
		Py_DECREF(num);
		return NULL;
	}

	ans = PyNumber_Divide(num, den);
	Py_DECREF(num);
	Py_DECREF(den);
	return ans;
775 776
}

777
PyDoc_STRVAR(math_log_doc,
778 779
"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.");
780 781

static PyObject *
782
math_log10(PyObject *self, PyObject *arg)
783
{
784
	return loghelper(arg, log10, "log10");
785 786
}

787 788
PyDoc_STRVAR(math_log10_doc,
"log10(x) -> the base 10 logarithm of x.");
789

790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
static PyObject *
math_fmod(PyObject *self, PyObject *args)
{
	PyObject *ox, *oy;
	double r, x, y;
	if (! PyArg_UnpackTuple(args, "fmod", 2, 2, &ox, &oy))
		return NULL;
	x = PyFloat_AsDouble(ox);
	y = PyFloat_AsDouble(oy);
	if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
		return NULL;
	/* fmod(x, +/-Inf) returns x for finite x. */
	if (Py_IS_INFINITY(y) && Py_IS_FINITE(x))
		return PyFloat_FromDouble(x);
	errno = 0;
	PyFPE_START_PROTECT("in math_fmod", return 0);
	r = fmod(x, y);
	PyFPE_END_PROTECT(r);
	if (Py_IS_NAN(r)) {
		if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
			errno = EDOM;
		else
			errno = 0;
	}
	if (errno && is_error(r))
		return NULL;
	else
		return PyFloat_FromDouble(r);
}

PyDoc_STRVAR(math_fmod_doc,
"fmod(x,y)\n\nReturn fmod(x, y), according to platform C."
"  x % y may differ.");

static PyObject *
math_hypot(PyObject *self, PyObject *args)
{
	PyObject *ox, *oy;
	double r, x, y;
	if (! PyArg_UnpackTuple(args, "hypot", 2, 2, &ox, &oy))
		return NULL;
	x = PyFloat_AsDouble(ox);
	y = PyFloat_AsDouble(oy);
	if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
		return NULL;
	/* hypot(x, +/-Inf) returns Inf, even if x is a NaN. */
	if (Py_IS_INFINITY(x))
		return PyFloat_FromDouble(fabs(x));
	if (Py_IS_INFINITY(y))
		return PyFloat_FromDouble(fabs(y));
	errno = 0;
	PyFPE_START_PROTECT("in math_hypot", return 0);
	r = hypot(x, y);
	PyFPE_END_PROTECT(r);
	if (Py_IS_NAN(r)) {
		if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
			errno = EDOM;
		else
			errno = 0;
	}
	else if (Py_IS_INFINITY(r)) {
		if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
			errno = ERANGE;
		else
			errno = 0;
	}
	if (errno && is_error(r))
		return NULL;
	else
		return PyFloat_FromDouble(r);
}

PyDoc_STRVAR(math_hypot_doc,
"hypot(x,y)\n\nReturn the Euclidean distance, sqrt(x*x + y*y).");

/* pow can't use math_2, but needs its own wrapper: the problem is
   that an infinite result can arise either as a result of overflow
   (in which case OverflowError should be raised) or as a result of
   e.g. 0.**-5. (for which ValueError needs to be raised.)
*/

static PyObject *
math_pow(PyObject *self, PyObject *args)
{
	PyObject *ox, *oy;
	double r, x, y;
876
	int odd_y;
877 878 879 880 881 882 883

	if (! PyArg_UnpackTuple(args, "pow", 2, 2, &ox, &oy))
		return NULL;
	x = PyFloat_AsDouble(ox);
	y = PyFloat_AsDouble(oy);
	if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
		return NULL;
884

885 886
	/* deal directly with IEEE specials, to cope with problems on various
	   platforms whose semantics don't exactly match C99 */
887
	r = 0.; /* silence compiler warning */
888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
	if (!Py_IS_FINITE(x) || !Py_IS_FINITE(y)) {
		errno = 0;
		if (Py_IS_NAN(x))
			r = y == 0. ? 1. : x; /* NaN**0 = 1 */
		else if (Py_IS_NAN(y))
			r = x == 1. ? 1. : y; /* 1**NaN = 1 */
		else if (Py_IS_INFINITY(x)) {
			odd_y = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;
			if (y > 0.)
				r = odd_y ? x : fabs(x);
			else if (y == 0.)
				r = 1.;
			else /* y < 0. */
				r = odd_y ? copysign(0., x) : 0.;
		}
		else if (Py_IS_INFINITY(y)) {
			if (fabs(x) == 1.0)
				r = 1.;
			else if (y > 0. && fabs(x) > 1.0)
				r = y;
			else if (y < 0. && fabs(x) < 1.0) {
				r = -y; /* result is +inf */
				if (x == 0.) /* 0**-inf: divide-by-zero */
					errno = EDOM;
			}
			else
				r = 0.;
		}
916
	}
917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
	else {
		/* let libm handle finite**finite */
		errno = 0;
		PyFPE_START_PROTECT("in math_pow", return 0);
		r = pow(x, y);
		PyFPE_END_PROTECT(r);
		/* a NaN result should arise only from (-ve)**(finite
		   non-integer); in this case we want to raise ValueError. */
		if (!Py_IS_FINITE(r)) {
			if (Py_IS_NAN(r)) {
				errno = EDOM;
			}
			/* 
			   an infinite result here arises either from:
			   (A) (+/-0.)**negative (-> divide-by-zero)
			   (B) overflow of x**y with x and y finite
			*/
			else if (Py_IS_INFINITY(r)) {
				if (x == 0.)
					errno = EDOM;
				else
					errno = ERANGE;
			}
		}
941 942 943 944 945 946 947 948 949 950 951
	}

	if (errno && is_error(r))
		return NULL;
	else
		return PyFloat_FromDouble(r);
}

PyDoc_STRVAR(math_pow_doc,
"pow(x,y)\n\nReturn x**y (x to the power of y).");

952 953
static const double degToRad = Py_MATH_PI / 180.0;
static const double radToDeg = 180.0 / Py_MATH_PI;
954 955

static PyObject *
956
math_degrees(PyObject *self, PyObject *arg)
957
{
958 959
	double x = PyFloat_AsDouble(arg);
	if (x == -1.0 && PyErr_Occurred())
960
		return NULL;
961
	return PyFloat_FromDouble(x * radToDeg);
962 963
}

964 965
PyDoc_STRVAR(math_degrees_doc,
"degrees(x) -> converts angle x from radians to degrees");
966 967

static PyObject *
968
math_radians(PyObject *self, PyObject *arg)
969
{
970 971
	double x = PyFloat_AsDouble(arg);
	if (x == -1.0 && PyErr_Occurred())
972 973 974 975
		return NULL;
	return PyFloat_FromDouble(x * degToRad);
}

976 977
PyDoc_STRVAR(math_radians_doc,
"radians(x) -> converts angle x from degrees to radians");
978

979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004
static PyObject *
math_isnan(PyObject *self, PyObject *arg)
{
	double x = PyFloat_AsDouble(arg);
	if (x == -1.0 && PyErr_Occurred())
		return NULL;
	return PyBool_FromLong((long)Py_IS_NAN(x));
}

PyDoc_STRVAR(math_isnan_doc,
"isnan(x) -> bool\n\
Checks if float x is not a number (NaN)");

static PyObject *
math_isinf(PyObject *self, PyObject *arg)
{
	double x = PyFloat_AsDouble(arg);
	if (x == -1.0 && PyErr_Occurred())
		return NULL;
	return PyBool_FromLong((long)Py_IS_INFINITY(x));
}

PyDoc_STRVAR(math_isinf_doc,
"isinf(x) -> bool\n\
Checks if float x is infinite (positive or negative)");

Barry Warsaw's avatar
Barry Warsaw committed
1005
static PyMethodDef math_methods[] = {
1006
	{"acos",	math_acos,	METH_O,		math_acos_doc},
1007
	{"acosh",	math_acosh,	METH_O,		math_acosh_doc},
1008
	{"asin",	math_asin,	METH_O,		math_asin_doc},
1009
	{"asinh",	math_asinh,	METH_O,		math_asinh_doc},
1010
	{"atan",	math_atan,	METH_O,		math_atan_doc},
1011
	{"atan2",	math_atan2,	METH_VARARGS,	math_atan2_doc},
1012
	{"atanh",	math_atanh,	METH_O,		math_atanh_doc},
1013
	{"ceil",	math_ceil,	METH_O,		math_ceil_doc},
1014
	{"copysign",	math_copysign,	METH_VARARGS,	math_copysign_doc},
1015 1016 1017 1018 1019
	{"cos",		math_cos,	METH_O,		math_cos_doc},
	{"cosh",	math_cosh,	METH_O,		math_cosh_doc},
	{"degrees",	math_degrees,	METH_O,		math_degrees_doc},
	{"exp",		math_exp,	METH_O,		math_exp_doc},
	{"fabs",	math_fabs,	METH_O,		math_fabs_doc},
1020
	{"factorial",	math_factorial,	METH_O,		math_factorial_doc},
1021
	{"floor",	math_floor,	METH_O,		math_floor_doc},
1022
	{"fmod",	math_fmod,	METH_VARARGS,	math_fmod_doc},
1023
	{"frexp",	math_frexp,	METH_O,		math_frexp_doc},
1024
	{"fsum",	math_fsum,	METH_O,		math_fsum_doc},
1025
	{"hypot",	math_hypot,	METH_VARARGS,	math_hypot_doc},
1026 1027
	{"isinf",	math_isinf,	METH_O,		math_isinf_doc},
	{"isnan",	math_isnan,	METH_O,		math_isnan_doc},
1028 1029
	{"ldexp",	math_ldexp,	METH_VARARGS,	math_ldexp_doc},
	{"log",		math_log,	METH_VARARGS,	math_log_doc},
1030
	{"log1p",	math_log1p,	METH_O,		math_log1p_doc},
1031 1032
	{"log10",	math_log10,	METH_O,		math_log10_doc},
	{"modf",	math_modf,	METH_O,		math_modf_doc},
1033
	{"pow",		math_pow,	METH_VARARGS,	math_pow_doc},
1034 1035 1036 1037 1038 1039
	{"radians",	math_radians,	METH_O,		math_radians_doc},
	{"sin",		math_sin,	METH_O,		math_sin_doc},
	{"sinh",	math_sinh,	METH_O,		math_sinh_doc},
	{"sqrt",	math_sqrt,	METH_O,		math_sqrt_doc},
	{"tan",		math_tan,	METH_O,		math_tan_doc},
	{"tanh",	math_tanh,	METH_O,		math_tanh_doc},
1040
	{"trunc",	math_trunc,	METH_O,		math_trunc_doc},
Guido van Rossum's avatar
Guido van Rossum committed
1041 1042 1043
	{NULL,		NULL}		/* sentinel */
};

1044

1045
PyDoc_STRVAR(module_doc,
1046
"This module is always available.  It provides access to the\n"
1047
"mathematical functions defined by the C standard.");
1048

1049
PyMODINIT_FUNC
1050
initmath(void)
Guido van Rossum's avatar
Guido van Rossum committed
1051
{
1052
	PyObject *m;
1053

1054
	m = Py_InitModule3("math", math_methods, module_doc);
1055 1056
	if (m == NULL)
		goto finally;
1057

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

1061
    finally:
1062
	return;
Guido van Rossum's avatar
Guido van Rossum committed
1063
}