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
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
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
56 #include "longintrepr.h" /* just for SHIFT */
59 /* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
60 extern double copysign(double, double);
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.
70 int result
= 1; /* presumption of guilt */
71 assert(errno
); /* non-zero errno is a precondition for calling */
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.
94 PyErr_SetString(PyExc_OverflowError
,
98 /* Unexpected math error */
99 PyErr_SetFromErrno(PyExc_ValueError
);
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
112 m_atan2(double y
, double x
)
114 if (Py_IS_NAN(x
) || Py_IS_NAN(y
))
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
);
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
);
133 /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
134 return copysign(Py_MATH_PI
, y
);
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.
149 if (Py_IS_FINITE(x
)) {
154 return -Py_HUGE_VAL
; /* log(0) = -inf */
156 return Py_NAN
; /* log(-ve) = nan */
158 else if (Py_IS_NAN(x
))
159 return x
; /* log(nan) = nan */
161 return x
; /* log(inf) = inf */
164 return Py_NAN
; /* log(-inf) = nan */
171 if (Py_IS_FINITE(x
)) {
176 return -Py_HUGE_VAL
; /* log10(0) = -inf */
178 return Py_NAN
; /* log10(-ve) = nan */
180 else if (Py_IS_NAN(x
))
181 return x
; /* log10(nan) = nan */
183 return x
; /* log10(inf) = inf */
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
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
203 - if the result is finite and errno == EDOM then ValueError is
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.
222 math_1(PyObject
*arg
, double (*func
) (double), int can_overflow
)
225 x
= PyFloat_AsDouble(arg
);
226 if (x
== -1.0 && PyErr_Occurred())
229 PyFPE_START_PROTECT("in math_1", return 0);
231 PyFPE_END_PROTECT(r
);
238 else if (Py_IS_INFINITY(r
)) {
240 errno
= can_overflow
? ERANGE
: EDOM
;
244 if (errno
&& is_error(r
))
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
258 - a NaN result from non-NaN inputs causes ValueError to be raised
259 - an infinite result from finite inputs causes OverflowError to be
261 - if the result is finite and errno == EDOM then ValueError is
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
278 math_2(PyObject
*args
, double (*func
) (double, double), char *funcname
)
282 if (! PyArg_UnpackTuple(args
, funcname
, 2, 2, &ox
, &oy
))
284 x
= PyFloat_AsDouble(ox
);
285 y
= PyFloat_AsDouble(oy
);
286 if ((x
== -1.0 || y
== -1.0) && PyErr_Occurred())
289 PyFPE_START_PROTECT("in math_2", return 0);
291 PyFPE_END_PROTECT(r
);
293 if (!Py_IS_NAN(x
) && !Py_IS_NAN(y
))
298 else if (Py_IS_INFINITY(r
)) {
299 if (Py_IS_FINITE(x
) && Py_IS_FINITE(y
))
304 if (errno
&& is_error(r
))
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);
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.")
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.")
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.")
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.")
343 "cos(x)\n\nReturn the cosine of x (measured in radians).")
345 "cosh(x)\n\nReturn the hyperbolic cosine of x.")
347 "exp(x)\n\nReturn e raised to the power of x.")
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.")
357 "sin(x)\n\nReturn the sine of x (measured in radians).")
359 "sinh(x)\n\nReturn the hyperbolic sine of x.")
361 "sqrt(x)\n\nReturn the square root of x.")
363 "tan(x)\n\nReturn the tangent of x (measured in radians).")
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
)
411 Py_ssize_t m
= *m_ptr
;
414 if (n
< m
&& m
< (PY_SSIZE_T_MAX
/ sizeof(double))) {
417 v
= PyMem_Malloc(sizeof(double) * m
);
419 memcpy(v
, ps
, sizeof(double) * n
);
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");
428 *p_ptr
= (double*) v
;
433 /* Full precision summation of a sequence of floats.
436 partials = [] # sorted, non-overlapping partial sums
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.
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
);
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
);
485 if (PyErr_Occurred())
489 x
= PyFloat_AsDouble(item
);
491 if (PyErr_Occurred())
495 for (i
= j
= 0; j
< n
; j
++) { /* for y in partials */
497 if (fabs(x
) < fabs(y
)) {
508 n
= i
; /* ps[i:] = [x] */
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
515 if (Py_IS_FINITE(xsave
)) {
516 PyErr_SetString(PyExc_OverflowError
,
517 "intermediate overflow in fsum");
520 if (Py_IS_INFINITY(xsave
))
522 special_sum
+= xsave
;
526 else if (n
>= m
&& _fsum_realloc(&p
, n
, ps
, &m
))
533 if (special_sum
!= 0.0) {
534 if (Py_IS_NAN(inf_sum
))
535 PyErr_SetString(PyExc_ValueError
,
536 "-inf + inf in fsum");
538 sum
= PyFloat_FromDouble(special_sum
);
545 /* sum_exact(ps, hi) from the top, stop when the sum becomes
550 assert(fabs(y
) < fabs(x
));
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))) {
571 sum
= PyFloat_FromDouble(hi
);
574 PyFPE_END_PROTECT(hi
)
583 PyDoc_STRVAR(math_fsum_doc
,
585 Return an accurate floating point sum of values in the iterable.\n\
586 Assumes IEEE-754 floating point arithmetic.");
589 math_factorial(PyObject
*self
, PyObject
*arg
)
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");
603 x
= PyInt_AsLong(arg
);
604 if (x
== -1 && PyErr_Occurred())
607 PyErr_SetString(PyExc_ValueError
,
608 "factorial() not defined for negative values");
612 result
= (PyObject
*)PyInt_FromLong(1);
615 for (i
=1 ; i
<=x
; i
++) {
616 iobj
= (PyObject
*)PyInt_FromLong(i
);
619 newresult
= PyNumber_Multiply(result
, iobj
);
621 if (newresult
== NULL
)
633 PyDoc_STRVAR(math_factorial_doc
,
634 "factorial(x) -> Integral\n"
636 "Find x!. Raise a ValueError if x is negative or non-integral.");
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"
647 "Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");
650 math_frexp(PyObject
*self
, PyObject
*arg
)
653 double x
= PyFloat_AsDouble(arg
);
654 if (x
== -1.0 && PyErr_Occurred())
656 /* deal with special cases directly, to sidestep platform
658 if (Py_IS_NAN(x
) || Py_IS_INFINITY(x
) || !x
) {
662 PyFPE_START_PROTECT("in math_frexp", return 0);
664 PyFPE_END_PROTECT(x
);
666 return Py_BuildValue("(di)", x
, i
);
669 PyDoc_STRVAR(math_frexp_doc
,
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.");
677 math_ldexp(PyObject
*self
, PyObject
*args
)
682 if (! PyArg_ParseTuple(args
, "dO:ldexp", &x
, &oexp
))
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) {
700 /* propagate any unexpected exception */
705 else if (PyInt_Check(oexp
)) {
706 exp
= PyInt_AS_LONG(oexp
);
709 PyErr_SetString(PyExc_TypeError
,
710 "Expected an int or long as second argument "
715 if (x
== 0. || !Py_IS_FINITE(x
)) {
716 /* NaNs, zeros and infinities are returned unchanged */
719 } else if (exp
> INT_MAX
) {
721 r
= copysign(Py_HUGE_VAL
, x
);
723 } else if (exp
< INT_MIN
) {
724 /* underflow to +-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
))
736 if (errno
&& is_error(r
))
738 return PyFloat_FromDouble(r
);
741 PyDoc_STRVAR(math_ldexp_doc
,
742 "ldexp(x, i) -> x * (2**i)");
745 math_modf(PyObject
*self
, PyObject
*arg
)
747 double y
, x
= PyFloat_AsDouble(arg
);
748 if (x
== -1.0 && PyErr_Occurred())
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
);
760 PyFPE_START_PROTECT("in math_modf", return 0);
762 PyFPE_END_PROTECT(x
);
763 return Py_BuildValue("(dd)", x
, y
);
766 PyDoc_STRVAR(math_modf_doc
,
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.
781 loghelper(PyObject
* arg
, double (*func
)(double), char *funcname
)
783 /* If it is long, do it ourselves. */
784 if (PyLong_Check(arg
)) {
787 x
= _PyLong_AsScaledDouble(arg
, &e
);
789 PyErr_SetString(PyExc_ValueError
,
790 "math domain error");
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);
806 math_log(PyObject
*self
, PyObject
*args
)
809 PyObject
*base
= NULL
;
813 if (!PyArg_UnpackTuple(args
, "log", 1, 2, &arg
, &base
))
816 num
= loghelper(arg
, m_log
, "log");
817 if (num
== NULL
|| base
== NULL
)
820 den
= loghelper(base
, m_log
, "log");
826 ans
= PyNumber_Divide(num
, den
);
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.");
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.");
846 math_fmod(PyObject
*self
, PyObject
*args
)
850 if (! PyArg_UnpackTuple(args
, "fmod", 2, 2, &ox
, &oy
))
852 x
= PyFloat_AsDouble(ox
);
853 y
= PyFloat_AsDouble(oy
);
854 if ((x
== -1.0 || y
== -1.0) && PyErr_Occurred())
856 /* fmod(x, +/-Inf) returns x for finite x. */
857 if (Py_IS_INFINITY(y
) && Py_IS_FINITE(x
))
858 return PyFloat_FromDouble(x
);
860 PyFPE_START_PROTECT("in math_fmod", return 0);
862 PyFPE_END_PROTECT(r
);
864 if (!Py_IS_NAN(x
) && !Py_IS_NAN(y
))
869 if (errno
&& is_error(r
))
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.");
880 math_hypot(PyObject
*self
, PyObject
*args
)
884 if (! PyArg_UnpackTuple(args
, "hypot", 2, 2, &ox
, &oy
))
886 x
= PyFloat_AsDouble(ox
);
887 y
= PyFloat_AsDouble(oy
);
888 if ((x
== -1.0 || y
== -1.0) && PyErr_Occurred())
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
));
896 PyFPE_START_PROTECT("in math_hypot", return 0);
898 PyFPE_END_PROTECT(r
);
900 if (!Py_IS_NAN(x
) && !Py_IS_NAN(y
))
905 else if (Py_IS_INFINITY(r
)) {
906 if (Py_IS_FINITE(x
) && Py_IS_FINITE(y
))
911 if (errno
&& is_error(r
))
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.)
927 math_pow(PyObject
*self
, PyObject
*args
)
933 if (! PyArg_UnpackTuple(args
, "pow", 2, 2, &ox
, &oy
))
935 x
= PyFloat_AsDouble(ox
);
936 y
= PyFloat_AsDouble(oy
);
937 if ((x
== -1.0 || y
== -1.0) && PyErr_Occurred())
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
)) {
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;
952 r
= odd_y
? x
: fabs(x
);
956 r
= odd_y
? copysign(0., x
) : 0.;
958 else if (Py_IS_INFINITY(y
)) {
961 else if (y
> 0. && fabs(x
) > 1.0)
963 else if (y
< 0. && fabs(x
) < 1.0) {
964 r
= -y
; /* result is +inf */
965 if (x
== 0.) /* 0**-inf: divide-by-zero */
973 /* let libm handle finite**finite */
975 PyFPE_START_PROTECT("in math_pow", return 0);
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
)) {
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
)) {
998 if (errno
&& is_error(r
))
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
;
1011 math_degrees(PyObject
*self
, PyObject
*arg
)
1013 double x
= PyFloat_AsDouble(arg
);
1014 if (x
== -1.0 && PyErr_Occurred())
1016 return PyFloat_FromDouble(x
* radToDeg
);
1019 PyDoc_STRVAR(math_degrees_doc
,
1020 "degrees(x) -> converts angle x from radians to degrees");
1023 math_radians(PyObject
*self
, PyObject
*arg
)
1025 double x
= PyFloat_AsDouble(arg
);
1026 if (x
== -1.0 && PyErr_Occurred())
1028 return PyFloat_FromDouble(x
* degToRad
);
1031 PyDoc_STRVAR(math_radians_doc
,
1032 "radians(x) -> converts angle x from degrees to radians");
1035 math_isnan(PyObject
*self
, PyObject
*arg
)
1037 double x
= PyFloat_AsDouble(arg
);
1038 if (x
== -1.0 && PyErr_Occurred())
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)");
1048 math_isinf(PyObject
*self
, PyObject
*arg
)
1050 double x
= PyFloat_AsDouble(arg
);
1051 if (x
== -1.0 && PyErr_Occurred())
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.");
1109 m
= Py_InitModule3("math", math_methods
, module_doc
);
1113 PyModule_AddObject(m
, "pi", PyFloat_FromDouble(Py_MATH_PI
));
1114 PyModule_AddObject(m
, "e", PyFloat_FromDouble(Py_MATH_E
));