Fix HAVE_DECL_ISINF/ISNAN test (again).
[python.git] / Modules / mathmodule.c
blob952d56a48ad6dc2af3469cb28346aa2ea5c3fce6
1 /* Math module -- standard C math library functions, pi and e */
3 /* Here are some comments from Tim Peters, extracted from the
4 discussion attached to http://bugs.python.org/issue1640. They
5 describe the general aims of the math module with respect to
6 special values, IEEE-754 floating-point exceptions, and Python
7 exceptions.
9 These are the "spirit of 754" rules:
11 1. If the mathematical result is a real number, but of magnitude too
12 large to approximate by a machine float, overflow is signaled and the
13 result is an infinity (with the appropriate sign).
15 2. If the mathematical result is a real number, but of magnitude too
16 small to approximate by a machine float, underflow is signaled and the
17 result is a zero (with the appropriate sign).
19 3. At a singularity (a value x such that the limit of f(y) as y
20 approaches x exists and is an infinity), "divide by zero" is signaled
21 and the result is an infinity (with the appropriate sign). This is
22 complicated a little by that the left-side and right-side limits may
23 not be the same; e.g., 1/x approaches +inf or -inf as x approaches 0
24 from the positive or negative directions. In that specific case, the
25 sign of the zero determines the result of 1/0.
27 4. At a point where a function has no defined result in the extended
28 reals (i.e., the reals plus an infinity or two), invalid operation is
29 signaled and a NaN is returned.
31 And these are what Python has historically /tried/ to do (but not
32 always successfully, as platform libm behavior varies a lot):
34 For #1, raise OverflowError.
36 For #2, return a zero (with the appropriate sign if that happens by
37 accident ;-)).
39 For #3 and #4, raise ValueError. It may have made sense to raise
40 Python's ZeroDivisionError in #3, but historically that's only been
41 raised for division by zero and mod by zero.
46 In general, on an IEEE-754 platform the aim is to follow the C99
47 standard, including Annex 'F', whenever possible. Where the
48 standard recommends raising the 'divide-by-zero' or 'invalid'
49 floating-point exceptions, Python should raise a ValueError. Where
50 the standard recommends raising 'overflow', Python should raise an
51 OverflowError. In all other circumstances a value should be
52 returned.
55 #include "Python.h"
56 #include "longintrepr.h" /* just for SHIFT */
58 #ifdef _OSF_SOURCE
59 /* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
60 extern double copysign(double, double);
61 #endif
63 /* Call is_error when errno != 0, and where x is the result libm
64 * returned. is_error will usually set up an exception and return
65 * true (1), but may return false (0) without setting up an exception.
67 static int
68 is_error(double x)
70 int result = 1; /* presumption of guilt */
71 assert(errno); /* non-zero errno is a precondition for calling */
72 if (errno == EDOM)
73 PyErr_SetString(PyExc_ValueError, "math domain error");
75 else if (errno == ERANGE) {
76 /* ANSI C generally requires libm functions to set ERANGE
77 * on overflow, but also generally *allows* them to set
78 * ERANGE on underflow too. There's no consistency about
79 * the latter across platforms.
80 * Alas, C99 never requires that errno be set.
81 * Here we suppress the underflow errors (libm functions
82 * should return a zero on underflow, and +- HUGE_VAL on
83 * overflow, so testing the result for zero suffices to
84 * distinguish the cases).
86 * On some platforms (Ubuntu/ia64) it seems that errno can be
87 * set to ERANGE for subnormal results that do *not* underflow
88 * to zero. So to be safe, we'll ignore ERANGE whenever the
89 * function result is less than one in absolute value.
91 if (fabs(x) < 1.0)
92 result = 0;
93 else
94 PyErr_SetString(PyExc_OverflowError,
95 "math range error");
97 else
98 /* Unexpected math error */
99 PyErr_SetFromErrno(PyExc_ValueError);
100 return result;
104 wrapper for atan2 that deals directly with special cases before
105 delegating to the platform libm for the remaining cases. This
106 is necessary to get consistent behaviour across platforms.
107 Windows, FreeBSD and alpha Tru64 are amongst platforms that don't
108 always follow C99.
111 static double
112 m_atan2(double y, double x)
114 if (Py_IS_NAN(x) || Py_IS_NAN(y))
115 return Py_NAN;
116 if (Py_IS_INFINITY(y)) {
117 if (Py_IS_INFINITY(x)) {
118 if (copysign(1., x) == 1.)
119 /* atan2(+-inf, +inf) == +-pi/4 */
120 return copysign(0.25*Py_MATH_PI, y);
121 else
122 /* atan2(+-inf, -inf) == +-pi*3/4 */
123 return copysign(0.75*Py_MATH_PI, y);
125 /* atan2(+-inf, x) == +-pi/2 for finite x */
126 return copysign(0.5*Py_MATH_PI, y);
128 if (Py_IS_INFINITY(x) || y == 0.) {
129 if (copysign(1., x) == 1.)
130 /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
131 return copysign(0., y);
132 else
133 /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
134 return copysign(Py_MATH_PI, y);
136 return atan2(y, x);
140 Various platforms (Solaris, OpenBSD) do nonstandard things for log(0),
141 log(-ve), log(NaN). Here are wrappers for log and log10 that deal with
142 special values directly, passing positive non-special values through to
143 the system log/log10.
146 static double
147 m_log(double x)
149 if (Py_IS_FINITE(x)) {
150 if (x > 0.0)
151 return log(x);
152 errno = EDOM;
153 if (x == 0.0)
154 return -Py_HUGE_VAL; /* log(0) = -inf */
155 else
156 return Py_NAN; /* log(-ve) = nan */
158 else if (Py_IS_NAN(x))
159 return x; /* log(nan) = nan */
160 else if (x > 0.0)
161 return x; /* log(inf) = inf */
162 else {
163 errno = EDOM;
164 return Py_NAN; /* log(-inf) = nan */
168 static double
169 m_log10(double x)
171 if (Py_IS_FINITE(x)) {
172 if (x > 0.0)
173 return log10(x);
174 errno = EDOM;
175 if (x == 0.0)
176 return -Py_HUGE_VAL; /* log10(0) = -inf */
177 else
178 return Py_NAN; /* log10(-ve) = nan */
180 else if (Py_IS_NAN(x))
181 return x; /* log10(nan) = nan */
182 else if (x > 0.0)
183 return x; /* log10(inf) = inf */
184 else {
185 errno = EDOM;
186 return Py_NAN; /* log10(-inf) = nan */
192 math_1 is used to wrap a libm function f that takes a double
193 arguments and returns a double.
195 The error reporting follows these rules, which are designed to do
196 the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
197 platforms.
199 - a NaN result from non-NaN inputs causes ValueError to be raised
200 - an infinite result from finite inputs causes OverflowError to be
201 raised if can_overflow is 1, or raises ValueError if can_overflow
202 is 0.
203 - if the result is finite and errno == EDOM then ValueError is
204 raised
205 - if the result is finite and nonzero and errno == ERANGE then
206 OverflowError is raised
208 The last rule is used to catch overflow on platforms which follow
209 C89 but for which HUGE_VAL is not an infinity.
211 For the majority of one-argument functions these rules are enough
212 to ensure that Python's functions behave as specified in 'Annex F'
213 of the C99 standard, with the 'invalid' and 'divide-by-zero'
214 floating-point exceptions mapping to Python's ValueError and the
215 'overflow' floating-point exception mapping to OverflowError.
216 math_1 only works for functions that don't have singularities *and*
217 the possibility of overflow; fortunately, that covers everything we
218 care about right now.
221 static PyObject *
222 math_1(PyObject *arg, double (*func) (double), int can_overflow)
224 double x, r;
225 x = PyFloat_AsDouble(arg);
226 if (x == -1.0 && PyErr_Occurred())
227 return NULL;
228 errno = 0;
229 PyFPE_START_PROTECT("in math_1", return 0);
230 r = (*func)(x);
231 PyFPE_END_PROTECT(r);
232 if (Py_IS_NAN(r)) {
233 if (!Py_IS_NAN(x))
234 errno = EDOM;
235 else
236 errno = 0;
238 else if (Py_IS_INFINITY(r)) {
239 if (Py_IS_FINITE(x))
240 errno = can_overflow ? ERANGE : EDOM;
241 else
242 errno = 0;
244 if (errno && is_error(r))
245 return NULL;
246 else
247 return PyFloat_FromDouble(r);
251 math_2 is used to wrap a libm function f that takes two double
252 arguments and returns a double.
254 The error reporting follows these rules, which are designed to do
255 the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
256 platforms.
258 - a NaN result from non-NaN inputs causes ValueError to be raised
259 - an infinite result from finite inputs causes OverflowError to be
260 raised.
261 - if the result is finite and errno == EDOM then ValueError is
262 raised
263 - if the result is finite and nonzero and errno == ERANGE then
264 OverflowError is raised
266 The last rule is used to catch overflow on platforms which follow
267 C89 but for which HUGE_VAL is not an infinity.
269 For most two-argument functions (copysign, fmod, hypot, atan2)
270 these rules are enough to ensure that Python's functions behave as
271 specified in 'Annex F' of the C99 standard, with the 'invalid' and
272 'divide-by-zero' floating-point exceptions mapping to Python's
273 ValueError and the 'overflow' floating-point exception mapping to
274 OverflowError.
277 static PyObject *
278 math_2(PyObject *args, double (*func) (double, double), char *funcname)
280 PyObject *ox, *oy;
281 double x, y, r;
282 if (! PyArg_UnpackTuple(args, funcname, 2, 2, &ox, &oy))
283 return NULL;
284 x = PyFloat_AsDouble(ox);
285 y = PyFloat_AsDouble(oy);
286 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
287 return NULL;
288 errno = 0;
289 PyFPE_START_PROTECT("in math_2", return 0);
290 r = (*func)(x, y);
291 PyFPE_END_PROTECT(r);
292 if (Py_IS_NAN(r)) {
293 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
294 errno = EDOM;
295 else
296 errno = 0;
298 else if (Py_IS_INFINITY(r)) {
299 if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
300 errno = ERANGE;
301 else
302 errno = 0;
304 if (errno && is_error(r))
305 return NULL;
306 else
307 return PyFloat_FromDouble(r);
310 #define FUNC1(funcname, func, can_overflow, docstring) \
311 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
312 return math_1(args, func, can_overflow); \
314 PyDoc_STRVAR(math_##funcname##_doc, docstring);
316 #define FUNC2(funcname, func, docstring) \
317 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
318 return math_2(args, func, #funcname); \
320 PyDoc_STRVAR(math_##funcname##_doc, docstring);
322 FUNC1(acos, acos, 0,
323 "acos(x)\n\nReturn the arc cosine (measured in radians) of x.")
324 FUNC1(acosh, acosh, 0,
325 "acosh(x)\n\nReturn the hyperbolic arc cosine (measured in radians) of x.")
326 FUNC1(asin, asin, 0,
327 "asin(x)\n\nReturn the arc sine (measured in radians) of x.")
328 FUNC1(asinh, asinh, 0,
329 "asinh(x)\n\nReturn the hyperbolic arc sine (measured in radians) of x.")
330 FUNC1(atan, atan, 0,
331 "atan(x)\n\nReturn the arc tangent (measured in radians) of x.")
332 FUNC2(atan2, m_atan2,
333 "atan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\n"
334 "Unlike atan(y/x), the signs of both x and y are considered.")
335 FUNC1(atanh, atanh, 0,
336 "atanh(x)\n\nReturn the hyperbolic arc tangent (measured in radians) of x.")
337 FUNC1(ceil, ceil, 0,
338 "ceil(x)\n\nReturn the ceiling of x as a float.\n"
339 "This is the smallest integral value >= x.")
340 FUNC2(copysign, copysign,
341 "copysign(x,y)\n\nReturn x with the sign of y.")
342 FUNC1(cos, cos, 0,
343 "cos(x)\n\nReturn the cosine of x (measured in radians).")
344 FUNC1(cosh, cosh, 1,
345 "cosh(x)\n\nReturn the hyperbolic cosine of x.")
346 FUNC1(exp, exp, 1,
347 "exp(x)\n\nReturn e raised to the power of x.")
348 FUNC1(fabs, fabs, 0,
349 "fabs(x)\n\nReturn the absolute value of the float x.")
350 FUNC1(floor, floor, 0,
351 "floor(x)\n\nReturn the floor of x as a float.\n"
352 "This is the largest integral value <= x.")
353 FUNC1(log1p, log1p, 1,
354 "log1p(x)\n\nReturn the natural logarithm of 1+x (base e).\n\
355 The result is computed in a way which is accurate for x near zero.")
356 FUNC1(sin, sin, 0,
357 "sin(x)\n\nReturn the sine of x (measured in radians).")
358 FUNC1(sinh, sinh, 1,
359 "sinh(x)\n\nReturn the hyperbolic sine of x.")
360 FUNC1(sqrt, sqrt, 0,
361 "sqrt(x)\n\nReturn the square root of x.")
362 FUNC1(tan, tan, 0,
363 "tan(x)\n\nReturn the tangent of x (measured in radians).")
364 FUNC1(tanh, tanh, 0,
365 "tanh(x)\n\nReturn the hyperbolic tangent of x.")
367 /* Precision summation function as msum() by Raymond Hettinger in
368 <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393090>,
369 enhanced with the exact partials sum and roundoff from Mark
370 Dickinson's post at <http://bugs.python.org/file10357/msum4.py>.
371 See those links for more details, proofs and other references.
373 Note 1: IEEE 754R floating point semantics are assumed,
374 but the current implementation does not re-establish special
375 value semantics across iterations (i.e. handling -Inf + Inf).
377 Note 2: No provision is made for intermediate overflow handling;
378 therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while
379 sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
380 overflow of the first partial sum.
382 Note 3: The intermediate values lo, yr, and hi are declared volatile so
383 aggressive compilers won't algebraically reduce lo to always be exactly 0.0.
384 Also, the volatile declaration forces the values to be stored in memory as
385 regular doubles instead of extended long precision (80-bit) values. This
386 prevents double rounding because any addition or subtraction of two doubles
387 can be resolved exactly into double-sized hi and lo values. As long as the
388 hi value gets forced into a double before yr and lo are computed, the extra
389 bits in downstream extended precision operations (x87 for example) will be
390 exactly zero and therefore can be losslessly stored back into a double,
391 thereby preventing double rounding.
393 Note 4: A similar implementation is in Modules/cmathmodule.c.
394 Be sure to update both when making changes.
396 Note 5: The signature of math.fsum() differs from __builtin__.sum()
397 because the start argument doesn't make sense in the context of
398 accurate summation. Since the partials table is collapsed before
399 returning a result, sum(seq2, start=sum(seq1)) may not equal the
400 accurate result returned by sum(itertools.chain(seq1, seq2)).
403 #define NUM_PARTIALS 32 /* initial partials array size, on stack */
405 /* Extend the partials array p[] by doubling its size. */
406 static int /* non-zero on error */
407 _fsum_realloc(double **p_ptr, Py_ssize_t n,
408 double *ps, Py_ssize_t *m_ptr)
410 void *v = NULL;
411 Py_ssize_t m = *m_ptr;
413 m += m; /* double */
414 if (n < m && m < (PY_SSIZE_T_MAX / sizeof(double))) {
415 double *p = *p_ptr;
416 if (p == ps) {
417 v = PyMem_Malloc(sizeof(double) * m);
418 if (v != NULL)
419 memcpy(v, ps, sizeof(double) * n);
421 else
422 v = PyMem_Realloc(p, sizeof(double) * m);
424 if (v == NULL) { /* size overflow or no memory */
425 PyErr_SetString(PyExc_MemoryError, "math.fsum partials");
426 return 1;
428 *p_ptr = (double*) v;
429 *m_ptr = m;
430 return 0;
433 /* Full precision summation of a sequence of floats.
435 def msum(iterable):
436 partials = [] # sorted, non-overlapping partial sums
437 for x in iterable:
438 i = 0
439 for y in partials:
440 if abs(x) < abs(y):
441 x, y = y, x
442 hi = x + y
443 lo = y - (hi - x)
444 if lo:
445 partials[i] = lo
446 i += 1
447 x = hi
448 partials[i:] = [x]
449 return sum_exact(partials)
451 Rounded x+y stored in hi with the roundoff stored in lo. Together hi+lo
452 are exactly equal to x+y. The inner loop applies hi/lo summation to each
453 partial so that the list of partial sums remains exact.
455 Sum_exact() adds the partial sums exactly and correctly rounds the final
456 result (using the round-half-to-even rule). The items in partials remain
457 non-zero, non-special, non-overlapping and strictly increasing in
458 magnitude, but possibly not all having the same sign.
460 Depends on IEEE 754 arithmetic guarantees and half-even rounding.
463 static PyObject*
464 math_fsum(PyObject *self, PyObject *seq)
466 PyObject *item, *iter, *sum = NULL;
467 Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;
468 double x, y, t, ps[NUM_PARTIALS], *p = ps;
469 double xsave, special_sum = 0.0, inf_sum = 0.0;
470 volatile double hi, yr, lo;
472 iter = PyObject_GetIter(seq);
473 if (iter == NULL)
474 return NULL;
476 PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)
478 for(;;) { /* for x in iterable */
479 assert(0 <= n && n <= m);
480 assert((m == NUM_PARTIALS && p == ps) ||
481 (m > NUM_PARTIALS && p != NULL));
483 item = PyIter_Next(iter);
484 if (item == NULL) {
485 if (PyErr_Occurred())
486 goto _fsum_error;
487 break;
489 x = PyFloat_AsDouble(item);
490 Py_DECREF(item);
491 if (PyErr_Occurred())
492 goto _fsum_error;
494 xsave = x;
495 for (i = j = 0; j < n; j++) { /* for y in partials */
496 y = p[j];
497 if (fabs(x) < fabs(y)) {
498 t = x; x = y; y = t;
500 hi = x + y;
501 yr = hi - x;
502 lo = y - yr;
503 if (lo != 0.0)
504 p[i++] = lo;
505 x = hi;
508 n = i; /* ps[i:] = [x] */
509 if (x != 0.0) {
510 if (! Py_IS_FINITE(x)) {
511 /* a nonfinite x could arise either as
512 a result of intermediate overflow, or
513 as a result of a nan or inf in the
514 summands */
515 if (Py_IS_FINITE(xsave)) {
516 PyErr_SetString(PyExc_OverflowError,
517 "intermediate overflow in fsum");
518 goto _fsum_error;
520 if (Py_IS_INFINITY(xsave))
521 inf_sum += xsave;
522 special_sum += xsave;
523 /* reset partials */
524 n = 0;
526 else if (n >= m && _fsum_realloc(&p, n, ps, &m))
527 goto _fsum_error;
528 else
529 p[n++] = x;
533 if (special_sum != 0.0) {
534 if (Py_IS_NAN(inf_sum))
535 PyErr_SetString(PyExc_ValueError,
536 "-inf + inf in fsum");
537 else
538 sum = PyFloat_FromDouble(special_sum);
539 goto _fsum_error;
542 hi = 0.0;
543 if (n > 0) {
544 hi = p[--n];
545 /* sum_exact(ps, hi) from the top, stop when the sum becomes
546 inexact. */
547 while (n > 0) {
548 x = hi;
549 y = p[--n];
550 assert(fabs(y) < fabs(x));
551 hi = x + y;
552 yr = hi - x;
553 lo = y - yr;
554 if (lo != 0.0)
555 break;
557 /* Make half-even rounding work across multiple partials.
558 Needed so that sum([1e-16, 1, 1e16]) will round-up the last
559 digit to two instead of down to zero (the 1e-16 makes the 1
560 slightly closer to two). With a potential 1 ULP rounding
561 error fixed-up, math.fsum() can guarantee commutativity. */
562 if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
563 (lo > 0.0 && p[n-1] > 0.0))) {
564 y = lo * 2.0;
565 x = hi + y;
566 yr = x - hi;
567 if (y == yr)
568 hi = x;
571 sum = PyFloat_FromDouble(hi);
573 _fsum_error:
574 PyFPE_END_PROTECT(hi)
575 Py_DECREF(iter);
576 if (p != ps)
577 PyMem_Free(p);
578 return sum;
581 #undef NUM_PARTIALS
583 PyDoc_STRVAR(math_fsum_doc,
584 "sum(iterable)\n\n\
585 Return an accurate floating point sum of values in the iterable.\n\
586 Assumes IEEE-754 floating point arithmetic.");
588 static PyObject *
589 math_factorial(PyObject *self, PyObject *arg)
591 long i, x;
592 PyObject *result, *iobj, *newresult;
594 if (PyFloat_Check(arg)) {
595 double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);
596 if (dx != floor(dx)) {
597 PyErr_SetString(PyExc_ValueError,
598 "factorial() only accepts integral values");
599 return NULL;
603 x = PyInt_AsLong(arg);
604 if (x == -1 && PyErr_Occurred())
605 return NULL;
606 if (x < 0) {
607 PyErr_SetString(PyExc_ValueError,
608 "factorial() not defined for negative values");
609 return NULL;
612 result = (PyObject *)PyInt_FromLong(1);
613 if (result == NULL)
614 return NULL;
615 for (i=1 ; i<=x ; i++) {
616 iobj = (PyObject *)PyInt_FromLong(i);
617 if (iobj == NULL)
618 goto error;
619 newresult = PyNumber_Multiply(result, iobj);
620 Py_DECREF(iobj);
621 if (newresult == NULL)
622 goto error;
623 Py_DECREF(result);
624 result = newresult;
626 return result;
628 error:
629 Py_DECREF(result);
630 return NULL;
633 PyDoc_STRVAR(math_factorial_doc,
634 "factorial(x) -> Integral\n"
635 "\n"
636 "Find x!. Raise a ValueError if x is negative or non-integral.");
638 static PyObject *
639 math_trunc(PyObject *self, PyObject *number)
641 return PyObject_CallMethod(number, "__trunc__", NULL);
644 PyDoc_STRVAR(math_trunc_doc,
645 "trunc(x:Real) -> Integral\n"
646 "\n"
647 "Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");
649 static PyObject *
650 math_frexp(PyObject *self, PyObject *arg)
652 int i;
653 double x = PyFloat_AsDouble(arg);
654 if (x == -1.0 && PyErr_Occurred())
655 return NULL;
656 /* deal with special cases directly, to sidestep platform
657 differences */
658 if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
659 i = 0;
661 else {
662 PyFPE_START_PROTECT("in math_frexp", return 0);
663 x = frexp(x, &i);
664 PyFPE_END_PROTECT(x);
666 return Py_BuildValue("(di)", x, i);
669 PyDoc_STRVAR(math_frexp_doc,
670 "frexp(x)\n"
671 "\n"
672 "Return the mantissa and exponent of x, as pair (m, e).\n"
673 "m is a float and e is an int, such that x = m * 2.**e.\n"
674 "If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.");
676 static PyObject *
677 math_ldexp(PyObject *self, PyObject *args)
679 double x, r;
680 PyObject *oexp;
681 long exp;
682 if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp))
683 return NULL;
685 if (PyLong_Check(oexp)) {
686 /* on overflow, replace exponent with either LONG_MAX
687 or LONG_MIN, depending on the sign. */
688 exp = PyLong_AsLong(oexp);
689 if (exp == -1 && PyErr_Occurred()) {
690 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
691 if (Py_SIZE(oexp) < 0) {
692 exp = LONG_MIN;
694 else {
695 exp = LONG_MAX;
697 PyErr_Clear();
699 else {
700 /* propagate any unexpected exception */
701 return NULL;
705 else if (PyInt_Check(oexp)) {
706 exp = PyInt_AS_LONG(oexp);
708 else {
709 PyErr_SetString(PyExc_TypeError,
710 "Expected an int or long as second argument "
711 "to ldexp.");
712 return NULL;
715 if (x == 0. || !Py_IS_FINITE(x)) {
716 /* NaNs, zeros and infinities are returned unchanged */
717 r = x;
718 errno = 0;
719 } else if (exp > INT_MAX) {
720 /* overflow */
721 r = copysign(Py_HUGE_VAL, x);
722 errno = ERANGE;
723 } else if (exp < INT_MIN) {
724 /* underflow to +-0 */
725 r = copysign(0., x);
726 errno = 0;
727 } else {
728 errno = 0;
729 PyFPE_START_PROTECT("in math_ldexp", return 0);
730 r = ldexp(x, (int)exp);
731 PyFPE_END_PROTECT(r);
732 if (Py_IS_INFINITY(r))
733 errno = ERANGE;
736 if (errno && is_error(r))
737 return NULL;
738 return PyFloat_FromDouble(r);
741 PyDoc_STRVAR(math_ldexp_doc,
742 "ldexp(x, i) -> x * (2**i)");
744 static PyObject *
745 math_modf(PyObject *self, PyObject *arg)
747 double y, x = PyFloat_AsDouble(arg);
748 if (x == -1.0 && PyErr_Occurred())
749 return NULL;
750 /* some platforms don't do the right thing for NaNs and
751 infinities, so we take care of special cases directly. */
752 if (!Py_IS_FINITE(x)) {
753 if (Py_IS_INFINITY(x))
754 return Py_BuildValue("(dd)", copysign(0., x), x);
755 else if (Py_IS_NAN(x))
756 return Py_BuildValue("(dd)", x, x);
759 errno = 0;
760 PyFPE_START_PROTECT("in math_modf", return 0);
761 x = modf(x, &y);
762 PyFPE_END_PROTECT(x);
763 return Py_BuildValue("(dd)", x, y);
766 PyDoc_STRVAR(math_modf_doc,
767 "modf(x)\n"
768 "\n"
769 "Return the fractional and integer parts of x. Both results carry the sign\n"
770 "of x and are floats.");
772 /* A decent logarithm is easy to compute even for huge longs, but libm can't
773 do that by itself -- loghelper can. func is log or log10, and name is
774 "log" or "log10". Note that overflow isn't possible: a long can contain
775 no more than INT_MAX * SHIFT bits, so has value certainly less than
776 2**(2**64 * 2**16) == 2**2**80, and log2 of that is 2**80, which is
777 small enough to fit in an IEEE single. log and log10 are even smaller.
780 static PyObject*
781 loghelper(PyObject* arg, double (*func)(double), char *funcname)
783 /* If it is long, do it ourselves. */
784 if (PyLong_Check(arg)) {
785 double x;
786 int e;
787 x = _PyLong_AsScaledDouble(arg, &e);
788 if (x <= 0.0) {
789 PyErr_SetString(PyExc_ValueError,
790 "math domain error");
791 return NULL;
793 /* Value is ~= x * 2**(e*PyLong_SHIFT), so the log ~=
794 log(x) + log(2) * e * PyLong_SHIFT.
795 CAUTION: e*PyLong_SHIFT may overflow using int arithmetic,
796 so force use of double. */
797 x = func(x) + (e * (double)PyLong_SHIFT) * func(2.0);
798 return PyFloat_FromDouble(x);
801 /* Else let libm handle it by itself. */
802 return math_1(arg, func, 0);
805 static PyObject *
806 math_log(PyObject *self, PyObject *args)
808 PyObject *arg;
809 PyObject *base = NULL;
810 PyObject *num, *den;
811 PyObject *ans;
813 if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))
814 return NULL;
816 num = loghelper(arg, m_log, "log");
817 if (num == NULL || base == NULL)
818 return num;
820 den = loghelper(base, m_log, "log");
821 if (den == NULL) {
822 Py_DECREF(num);
823 return NULL;
826 ans = PyNumber_Divide(num, den);
827 Py_DECREF(num);
828 Py_DECREF(den);
829 return ans;
832 PyDoc_STRVAR(math_log_doc,
833 "log(x[, base]) -> the logarithm of x to the given base.\n\
834 If the base not specified, returns the natural logarithm (base e) of x.");
836 static PyObject *
837 math_log10(PyObject *self, PyObject *arg)
839 return loghelper(arg, m_log10, "log10");
842 PyDoc_STRVAR(math_log10_doc,
843 "log10(x) -> the base 10 logarithm of x.");
845 static PyObject *
846 math_fmod(PyObject *self, PyObject *args)
848 PyObject *ox, *oy;
849 double r, x, y;
850 if (! PyArg_UnpackTuple(args, "fmod", 2, 2, &ox, &oy))
851 return NULL;
852 x = PyFloat_AsDouble(ox);
853 y = PyFloat_AsDouble(oy);
854 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
855 return NULL;
856 /* fmod(x, +/-Inf) returns x for finite x. */
857 if (Py_IS_INFINITY(y) && Py_IS_FINITE(x))
858 return PyFloat_FromDouble(x);
859 errno = 0;
860 PyFPE_START_PROTECT("in math_fmod", return 0);
861 r = fmod(x, y);
862 PyFPE_END_PROTECT(r);
863 if (Py_IS_NAN(r)) {
864 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
865 errno = EDOM;
866 else
867 errno = 0;
869 if (errno && is_error(r))
870 return NULL;
871 else
872 return PyFloat_FromDouble(r);
875 PyDoc_STRVAR(math_fmod_doc,
876 "fmod(x,y)\n\nReturn fmod(x, y), according to platform C."
877 " x % y may differ.");
879 static PyObject *
880 math_hypot(PyObject *self, PyObject *args)
882 PyObject *ox, *oy;
883 double r, x, y;
884 if (! PyArg_UnpackTuple(args, "hypot", 2, 2, &ox, &oy))
885 return NULL;
886 x = PyFloat_AsDouble(ox);
887 y = PyFloat_AsDouble(oy);
888 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
889 return NULL;
890 /* hypot(x, +/-Inf) returns Inf, even if x is a NaN. */
891 if (Py_IS_INFINITY(x))
892 return PyFloat_FromDouble(fabs(x));
893 if (Py_IS_INFINITY(y))
894 return PyFloat_FromDouble(fabs(y));
895 errno = 0;
896 PyFPE_START_PROTECT("in math_hypot", return 0);
897 r = hypot(x, y);
898 PyFPE_END_PROTECT(r);
899 if (Py_IS_NAN(r)) {
900 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
901 errno = EDOM;
902 else
903 errno = 0;
905 else if (Py_IS_INFINITY(r)) {
906 if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
907 errno = ERANGE;
908 else
909 errno = 0;
911 if (errno && is_error(r))
912 return NULL;
913 else
914 return PyFloat_FromDouble(r);
917 PyDoc_STRVAR(math_hypot_doc,
918 "hypot(x,y)\n\nReturn the Euclidean distance, sqrt(x*x + y*y).");
920 /* pow can't use math_2, but needs its own wrapper: the problem is
921 that an infinite result can arise either as a result of overflow
922 (in which case OverflowError should be raised) or as a result of
923 e.g. 0.**-5. (for which ValueError needs to be raised.)
926 static PyObject *
927 math_pow(PyObject *self, PyObject *args)
929 PyObject *ox, *oy;
930 double r, x, y;
931 int odd_y;
933 if (! PyArg_UnpackTuple(args, "pow", 2, 2, &ox, &oy))
934 return NULL;
935 x = PyFloat_AsDouble(ox);
936 y = PyFloat_AsDouble(oy);
937 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
938 return NULL;
940 /* deal directly with IEEE specials, to cope with problems on various
941 platforms whose semantics don't exactly match C99 */
942 r = 0.; /* silence compiler warning */
943 if (!Py_IS_FINITE(x) || !Py_IS_FINITE(y)) {
944 errno = 0;
945 if (Py_IS_NAN(x))
946 r = y == 0. ? 1. : x; /* NaN**0 = 1 */
947 else if (Py_IS_NAN(y))
948 r = x == 1. ? 1. : y; /* 1**NaN = 1 */
949 else if (Py_IS_INFINITY(x)) {
950 odd_y = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;
951 if (y > 0.)
952 r = odd_y ? x : fabs(x);
953 else if (y == 0.)
954 r = 1.;
955 else /* y < 0. */
956 r = odd_y ? copysign(0., x) : 0.;
958 else if (Py_IS_INFINITY(y)) {
959 if (fabs(x) == 1.0)
960 r = 1.;
961 else if (y > 0. && fabs(x) > 1.0)
962 r = y;
963 else if (y < 0. && fabs(x) < 1.0) {
964 r = -y; /* result is +inf */
965 if (x == 0.) /* 0**-inf: divide-by-zero */
966 errno = EDOM;
968 else
969 r = 0.;
972 else {
973 /* let libm handle finite**finite */
974 errno = 0;
975 PyFPE_START_PROTECT("in math_pow", return 0);
976 r = pow(x, y);
977 PyFPE_END_PROTECT(r);
978 /* a NaN result should arise only from (-ve)**(finite
979 non-integer); in this case we want to raise ValueError. */
980 if (!Py_IS_FINITE(r)) {
981 if (Py_IS_NAN(r)) {
982 errno = EDOM;
985 an infinite result here arises either from:
986 (A) (+/-0.)**negative (-> divide-by-zero)
987 (B) overflow of x**y with x and y finite
989 else if (Py_IS_INFINITY(r)) {
990 if (x == 0.)
991 errno = EDOM;
992 else
993 errno = ERANGE;
998 if (errno && is_error(r))
999 return NULL;
1000 else
1001 return PyFloat_FromDouble(r);
1004 PyDoc_STRVAR(math_pow_doc,
1005 "pow(x,y)\n\nReturn x**y (x to the power of y).");
1007 static const double degToRad = Py_MATH_PI / 180.0;
1008 static const double radToDeg = 180.0 / Py_MATH_PI;
1010 static PyObject *
1011 math_degrees(PyObject *self, PyObject *arg)
1013 double x = PyFloat_AsDouble(arg);
1014 if (x == -1.0 && PyErr_Occurred())
1015 return NULL;
1016 return PyFloat_FromDouble(x * radToDeg);
1019 PyDoc_STRVAR(math_degrees_doc,
1020 "degrees(x) -> converts angle x from radians to degrees");
1022 static PyObject *
1023 math_radians(PyObject *self, PyObject *arg)
1025 double x = PyFloat_AsDouble(arg);
1026 if (x == -1.0 && PyErr_Occurred())
1027 return NULL;
1028 return PyFloat_FromDouble(x * degToRad);
1031 PyDoc_STRVAR(math_radians_doc,
1032 "radians(x) -> converts angle x from degrees to radians");
1034 static PyObject *
1035 math_isnan(PyObject *self, PyObject *arg)
1037 double x = PyFloat_AsDouble(arg);
1038 if (x == -1.0 && PyErr_Occurred())
1039 return NULL;
1040 return PyBool_FromLong((long)Py_IS_NAN(x));
1043 PyDoc_STRVAR(math_isnan_doc,
1044 "isnan(x) -> bool\n\
1045 Checks if float x is not a number (NaN)");
1047 static PyObject *
1048 math_isinf(PyObject *self, PyObject *arg)
1050 double x = PyFloat_AsDouble(arg);
1051 if (x == -1.0 && PyErr_Occurred())
1052 return NULL;
1053 return PyBool_FromLong((long)Py_IS_INFINITY(x));
1056 PyDoc_STRVAR(math_isinf_doc,
1057 "isinf(x) -> bool\n\
1058 Checks if float x is infinite (positive or negative)");
1060 static PyMethodDef math_methods[] = {
1061 {"acos", math_acos, METH_O, math_acos_doc},
1062 {"acosh", math_acosh, METH_O, math_acosh_doc},
1063 {"asin", math_asin, METH_O, math_asin_doc},
1064 {"asinh", math_asinh, METH_O, math_asinh_doc},
1065 {"atan", math_atan, METH_O, math_atan_doc},
1066 {"atan2", math_atan2, METH_VARARGS, math_atan2_doc},
1067 {"atanh", math_atanh, METH_O, math_atanh_doc},
1068 {"ceil", math_ceil, METH_O, math_ceil_doc},
1069 {"copysign", math_copysign, METH_VARARGS, math_copysign_doc},
1070 {"cos", math_cos, METH_O, math_cos_doc},
1071 {"cosh", math_cosh, METH_O, math_cosh_doc},
1072 {"degrees", math_degrees, METH_O, math_degrees_doc},
1073 {"exp", math_exp, METH_O, math_exp_doc},
1074 {"fabs", math_fabs, METH_O, math_fabs_doc},
1075 {"factorial", math_factorial, METH_O, math_factorial_doc},
1076 {"floor", math_floor, METH_O, math_floor_doc},
1077 {"fmod", math_fmod, METH_VARARGS, math_fmod_doc},
1078 {"frexp", math_frexp, METH_O, math_frexp_doc},
1079 {"fsum", math_fsum, METH_O, math_fsum_doc},
1080 {"hypot", math_hypot, METH_VARARGS, math_hypot_doc},
1081 {"isinf", math_isinf, METH_O, math_isinf_doc},
1082 {"isnan", math_isnan, METH_O, math_isnan_doc},
1083 {"ldexp", math_ldexp, METH_VARARGS, math_ldexp_doc},
1084 {"log", math_log, METH_VARARGS, math_log_doc},
1085 {"log1p", math_log1p, METH_O, math_log1p_doc},
1086 {"log10", math_log10, METH_O, math_log10_doc},
1087 {"modf", math_modf, METH_O, math_modf_doc},
1088 {"pow", math_pow, METH_VARARGS, math_pow_doc},
1089 {"radians", math_radians, METH_O, math_radians_doc},
1090 {"sin", math_sin, METH_O, math_sin_doc},
1091 {"sinh", math_sinh, METH_O, math_sinh_doc},
1092 {"sqrt", math_sqrt, METH_O, math_sqrt_doc},
1093 {"tan", math_tan, METH_O, math_tan_doc},
1094 {"tanh", math_tanh, METH_O, math_tanh_doc},
1095 {"trunc", math_trunc, METH_O, math_trunc_doc},
1096 {NULL, NULL} /* sentinel */
1100 PyDoc_STRVAR(module_doc,
1101 "This module is always available. It provides access to the\n"
1102 "mathematical functions defined by the C standard.");
1104 PyMODINIT_FUNC
1105 initmath(void)
1107 PyObject *m;
1109 m = Py_InitModule3("math", math_methods, module_doc);
1110 if (m == NULL)
1111 goto finally;
1113 PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));
1114 PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
1116 finally:
1117 return;