source: python/vendor/Python-2.6.5/Modules/mathmodule.c

Last change on this file was 2, checked in by Yuri Dario, 15 years ago

Initial import for vendor code.

  • Property svn:eol-style set to native
File size: 31.5 KB
Line 
1/* Math module -- standard C math library functions, pi and e */
2
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.
8
9These are the "spirit of 754" rules:
10
111. If the mathematical result is a real number, but of magnitude too
12large to approximate by a machine float, overflow is signaled and the
13result is an infinity (with the appropriate sign).
14
152. If the mathematical result is a real number, but of magnitude too
16small to approximate by a machine float, underflow is signaled and the
17result is a zero (with the appropriate sign).
18
193. At a singularity (a value x such that the limit of f(y) as y
20approaches x exists and is an infinity), "divide by zero" is signaled
21and the result is an infinity (with the appropriate sign). This is
22complicated a little by that the left-side and right-side limits may
23not be the same; e.g., 1/x approaches +inf or -inf as x approaches 0
24from the positive or negative directions. In that specific case, the
25sign of the zero determines the result of 1/0.
26
274. At a point where a function has no defined result in the extended
28reals (i.e., the reals plus an infinity or two), invalid operation is
29signaled and a NaN is returned.
30
31And these are what Python has historically /tried/ to do (but not
32always successfully, as platform libm behavior varies a lot):
33
34For #1, raise OverflowError.
35
36For #2, return a zero (with the appropriate sign if that happens by
37accident ;-)).
38
39For #3 and #4, raise ValueError. It may have made sense to raise
40Python's ZeroDivisionError in #3, but historically that's only been
41raised for division by zero and mod by zero.
42
43*/
44
45/*
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.
53 */
54
55#include "Python.h"
56#include "longintrepr.h" /* just for SHIFT */
57
58#ifdef _OSF_SOURCE
59/* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */
60extern double copysign(double, double);
61#endif
62
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.
66 */
67static int
68is_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)
73 PyErr_SetString(PyExc_ValueError, "math domain error");
74
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).
85 *
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.
90 */
91 if (fabs(x) < 1.0)
92 result = 0;
93 else
94 PyErr_SetString(PyExc_OverflowError,
95 "math range error");
96 }
97 else
98 /* Unexpected math error */
99 PyErr_SetFromErrno(PyExc_ValueError);
100 return result;
101}
102
103/*
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.
109*/
110
111static double
112m_atan2(double y, double x)
113{
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);
124 }
125 /* atan2(+-inf, x) == +-pi/2 for finite x */
126 return copysign(0.5*Py_MATH_PI, y);
127 }
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);
135 }
136 return atan2(y, x);
137}
138
139/*
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.
144 */
145
146static double
147m_log(double x)
148{
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 */
157 }
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 */
165 }
166}
167
168static double
169m_log10(double x)
170{
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 */
179 }
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 */
187 }
188}
189
190
191/*
192 math_1 is used to wrap a libm function f that takes a double
193 arguments and returns a double.
194
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.
198
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
207
208 The last rule is used to catch overflow on platforms which follow
209 C89 but for which HUGE_VAL is not an infinity.
210
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.
219*/
220
221static PyObject *
222math_1(PyObject *arg, double (*func) (double), int can_overflow)
223{
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;
237 }
238 else if (Py_IS_INFINITY(r)) {
239 if (Py_IS_FINITE(x))
240 errno = can_overflow ? ERANGE : EDOM;
241 else
242 errno = 0;
243 }
244 if (errno && is_error(r))
245 return NULL;
246 else
247 return PyFloat_FromDouble(r);
248}
249
250/*
251 math_2 is used to wrap a libm function f that takes two double
252 arguments and returns a double.
253
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.
257
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
265
266 The last rule is used to catch overflow on platforms which follow
267 C89 but for which HUGE_VAL is not an infinity.
268
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.
275*/
276
277static PyObject *
278math_2(PyObject *args, double (*func) (double, double), char *funcname)
279{
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;
297 }
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;
303 }
304 if (errno && is_error(r))
305 return NULL;
306 else
307 return PyFloat_FromDouble(r);
308}
309
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); \
313 }\
314 PyDoc_STRVAR(math_##funcname##_doc, docstring);
315
316#define FUNC2(funcname, func, docstring) \
317 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
318 return math_2(args, func, #funcname); \
319 }\
320 PyDoc_STRVAR(math_##funcname##_doc, docstring);
321
322FUNC1(acos, acos, 0,
323 "acos(x)\n\nReturn the arc cosine (measured in radians) of x.")
324FUNC1(acosh, acosh, 0,
325 "acosh(x)\n\nReturn the hyperbolic arc cosine (measured in radians) of x.")
326FUNC1(asin, asin, 0,
327 "asin(x)\n\nReturn the arc sine (measured in radians) of x.")
328FUNC1(asinh, asinh, 0,
329 "asinh(x)\n\nReturn the hyperbolic arc sine (measured in radians) of x.")
330FUNC1(atan, atan, 0,
331 "atan(x)\n\nReturn the arc tangent (measured in radians) of x.")
332FUNC2(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.")
335FUNC1(atanh, atanh, 0,
336 "atanh(x)\n\nReturn the hyperbolic arc tangent (measured in radians) of x.")
337FUNC1(ceil, ceil, 0,
338 "ceil(x)\n\nReturn the ceiling of x as a float.\n"
339 "This is the smallest integral value >= x.")
340FUNC2(copysign, copysign,
341 "copysign(x,y)\n\nReturn x with the sign of y.")
342FUNC1(cos, cos, 0,
343 "cos(x)\n\nReturn the cosine of x (measured in radians).")
344FUNC1(cosh, cosh, 1,
345 "cosh(x)\n\nReturn the hyperbolic cosine of x.")
346FUNC1(exp, exp, 1,
347 "exp(x)\n\nReturn e raised to the power of x.")
348FUNC1(fabs, fabs, 0,
349 "fabs(x)\n\nReturn the absolute value of the float x.")
350FUNC1(floor, floor, 0,
351 "floor(x)\n\nReturn the floor of x as a float.\n"
352 "This is the largest integral value <= x.")
353FUNC1(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.")
356FUNC1(sin, sin, 0,
357 "sin(x)\n\nReturn the sine of x (measured in radians).")
358FUNC1(sinh, sinh, 1,
359 "sinh(x)\n\nReturn the hyperbolic sine of x.")
360FUNC1(sqrt, sqrt, 0,
361 "sqrt(x)\n\nReturn the square root of x.")
362FUNC1(tan, tan, 0,
363 "tan(x)\n\nReturn the tangent of x (measured in radians).")
364FUNC1(tanh, tanh, 0,
365 "tanh(x)\n\nReturn the hyperbolic tangent of x.")
366
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.
372
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).
376
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.
381
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.
392
393 Note 4: A similar implementation is in Modules/cmathmodule.c.
394 Be sure to update both when making changes.
395
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)).
401*/
402
403#define NUM_PARTIALS 32 /* initial partials array size, on stack */
404
405/* Extend the partials array p[] by doubling its size. */
406static int /* non-zero on error */
407_fsum_realloc(double **p_ptr, Py_ssize_t n,
408 double *ps, Py_ssize_t *m_ptr)
409{
410 void *v = NULL;
411 Py_ssize_t m = *m_ptr;
412
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);
420 }
421 else
422 v = PyMem_Realloc(p, sizeof(double) * m);
423 }
424 if (v == NULL) { /* size overflow or no memory */
425 PyErr_SetString(PyExc_MemoryError, "math.fsum partials");
426 return 1;
427 }
428 *p_ptr = (double*) v;
429 *m_ptr = m;
430 return 0;
431}
432
433/* Full precision summation of a sequence of floats.
434
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)
450
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.
454
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.
459
460 Depends on IEEE 754 arithmetic guarantees and half-even rounding.
461*/
462
463static PyObject*
464math_fsum(PyObject *self, PyObject *seq)
465{
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;
471
472 iter = PyObject_GetIter(seq);
473 if (iter == NULL)
474 return NULL;
475
476 PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)
477
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));
482
483 item = PyIter_Next(iter);
484 if (item == NULL) {
485 if (PyErr_Occurred())
486 goto _fsum_error;
487 break;
488 }
489 x = PyFloat_AsDouble(item);
490 Py_DECREF(item);
491 if (PyErr_Occurred())
492 goto _fsum_error;
493
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;
499 }
500 hi = x + y;
501 yr = hi - x;
502 lo = y - yr;
503 if (lo != 0.0)
504 p[i++] = lo;
505 x = hi;
506 }
507
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;
519 }
520 if (Py_IS_INFINITY(xsave))
521 inf_sum += xsave;
522 special_sum += xsave;
523 /* reset partials */
524 n = 0;
525 }
526 else if (n >= m && _fsum_realloc(&p, n, ps, &m))
527 goto _fsum_error;
528 else
529 p[n++] = x;
530 }
531 }
532
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;
540 }
541
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;
556 }
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;
569 }
570 }
571 sum = PyFloat_FromDouble(hi);
572
573_fsum_error:
574 PyFPE_END_PROTECT(hi)
575 Py_DECREF(iter);
576 if (p != ps)
577 PyMem_Free(p);
578 return sum;
579}
580
581#undef NUM_PARTIALS
582
583PyDoc_STRVAR(math_fsum_doc,
584"sum(iterable)\n\n\
585Return an accurate floating point sum of values in the iterable.\n\
586Assumes IEEE-754 floating point arithmetic.");
587
588static PyObject *
589math_factorial(PyObject *self, PyObject *arg)
590{
591 long i, x;
592 PyObject *result, *iobj, *newresult;
593
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;
600 }
601 }
602
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;
610 }
611
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;
625 }
626 return result;
627
628error:
629 Py_DECREF(result);
630 return NULL;
631}
632
633PyDoc_STRVAR(math_factorial_doc,
634"factorial(x) -> Integral\n"
635"\n"
636"Find x!. Raise a ValueError if x is negative or non-integral.");
637
638static PyObject *
639math_trunc(PyObject *self, PyObject *number)
640{
641 return PyObject_CallMethod(number, "__trunc__", NULL);
642}
643
644PyDoc_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.");
648
649static PyObject *
650math_frexp(PyObject *self, PyObject *arg)
651{
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;
660 }
661 else {
662 PyFPE_START_PROTECT("in math_frexp", return 0);
663 x = frexp(x, &i);
664 PyFPE_END_PROTECT(x);
665 }
666 return Py_BuildValue("(di)", x, i);
667}
668
669PyDoc_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.");
675
676static PyObject *
677math_ldexp(PyObject *self, PyObject *args)
678{
679 double x, r;
680 PyObject *oexp;
681 long exp;
682 if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp))
683 return NULL;
684
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;
693 }
694 else {
695 exp = LONG_MAX;
696 }
697 PyErr_Clear();
698 }
699 else {
700 /* propagate any unexpected exception */
701 return NULL;
702 }
703 }
704 }
705 else if (PyInt_Check(oexp)) {
706 exp = PyInt_AS_LONG(oexp);
707 }
708 else {
709 PyErr_SetString(PyExc_TypeError,
710 "Expected an int or long as second argument "
711 "to ldexp.");
712 return NULL;
713 }
714
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;
734 }
735
736 if (errno && is_error(r))
737 return NULL;
738 return PyFloat_FromDouble(r);
739}
740
741PyDoc_STRVAR(math_ldexp_doc,
742"ldexp(x, i) -> x * (2**i)");
743
744static PyObject *
745math_modf(PyObject *self, PyObject *arg)
746{
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);
757 }
758
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);
764}
765
766PyDoc_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.");
771
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.
778*/
779
780static PyObject*
781loghelper(PyObject* arg, double (*func)(double), char *funcname)
782{
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;
792 }
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);
799 }
800
801 /* Else let libm handle it by itself. */
802 return math_1(arg, func, 0);
803}
804
805static PyObject *
806math_log(PyObject *self, PyObject *args)
807{
808 PyObject *arg;
809 PyObject *base = NULL;
810 PyObject *num, *den;
811 PyObject *ans;
812
813 if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))
814 return NULL;
815
816 num = loghelper(arg, m_log, "log");
817 if (num == NULL || base == NULL)
818 return num;
819
820 den = loghelper(base, m_log, "log");
821 if (den == NULL) {
822 Py_DECREF(num);
823 return NULL;
824 }
825
826 ans = PyNumber_Divide(num, den);
827 Py_DECREF(num);
828 Py_DECREF(den);
829 return ans;
830}
831
832PyDoc_STRVAR(math_log_doc,
833"log(x[, base]) -> the logarithm of x to the given base.\n\
834If the base not specified, returns the natural logarithm (base e) of x.");
835
836static PyObject *
837math_log10(PyObject *self, PyObject *arg)
838{
839 return loghelper(arg, m_log10, "log10");
840}
841
842PyDoc_STRVAR(math_log10_doc,
843"log10(x) -> the base 10 logarithm of x.");
844
845static PyObject *
846math_fmod(PyObject *self, PyObject *args)
847{
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;
868 }
869 if (errno && is_error(r))
870 return NULL;
871 else
872 return PyFloat_FromDouble(r);
873}
874
875PyDoc_STRVAR(math_fmod_doc,
876"fmod(x,y)\n\nReturn fmod(x, y), according to platform C."
877" x % y may differ.");
878
879static PyObject *
880math_hypot(PyObject *self, PyObject *args)
881{
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;
904 }
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;
910 }
911 if (errno && is_error(r))
912 return NULL;
913 else
914 return PyFloat_FromDouble(r);
915}
916
917PyDoc_STRVAR(math_hypot_doc,
918"hypot(x,y)\n\nReturn the Euclidean distance, sqrt(x*x + y*y).");
919
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.)
924*/
925
926static PyObject *
927math_pow(PyObject *self, PyObject *args)
928{
929 PyObject *ox, *oy;
930 double r, x, y;
931 int odd_y;
932
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;
939
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.;
957 }
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;
967 }
968 else
969 r = 0.;
970 }
971 }
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;
983 }
984 /*
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
988 */
989 else if (Py_IS_INFINITY(r)) {
990 if (x == 0.)
991 errno = EDOM;
992 else
993 errno = ERANGE;
994 }
995 }
996 }
997
998 if (errno && is_error(r))
999 return NULL;
1000 else
1001 return PyFloat_FromDouble(r);
1002}
1003
1004PyDoc_STRVAR(math_pow_doc,
1005"pow(x,y)\n\nReturn x**y (x to the power of y).");
1006
1007static const double degToRad = Py_MATH_PI / 180.0;
1008static const double radToDeg = 180.0 / Py_MATH_PI;
1009
1010static PyObject *
1011math_degrees(PyObject *self, PyObject *arg)
1012{
1013 double x = PyFloat_AsDouble(arg);
1014 if (x == -1.0 && PyErr_Occurred())
1015 return NULL;
1016 return PyFloat_FromDouble(x * radToDeg);
1017}
1018
1019PyDoc_STRVAR(math_degrees_doc,
1020"degrees(x) -> converts angle x from radians to degrees");
1021
1022static PyObject *
1023math_radians(PyObject *self, PyObject *arg)
1024{
1025 double x = PyFloat_AsDouble(arg);
1026 if (x == -1.0 && PyErr_Occurred())
1027 return NULL;
1028 return PyFloat_FromDouble(x * degToRad);
1029}
1030
1031PyDoc_STRVAR(math_radians_doc,
1032"radians(x) -> converts angle x from degrees to radians");
1033
1034static PyObject *
1035math_isnan(PyObject *self, PyObject *arg)
1036{
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));
1041}
1042
1043PyDoc_STRVAR(math_isnan_doc,
1044"isnan(x) -> bool\n\
1045Checks if float x is not a number (NaN)");
1046
1047static PyObject *
1048math_isinf(PyObject *self, PyObject *arg)
1049{
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));
1054}
1055
1056PyDoc_STRVAR(math_isinf_doc,
1057"isinf(x) -> bool\n\
1058Checks if float x is infinite (positive or negative)");
1059
1060static 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 */
1097};
1098
1099
1100PyDoc_STRVAR(module_doc,
1101"This module is always available. It provides access to the\n"
1102"mathematical functions defined by the C standard.");
1103
1104PyMODINIT_FUNC
1105initmath(void)
1106{
1107 PyObject *m;
1108
1109 m = Py_InitModule3("math", math_methods, module_doc);
1110 if (m == NULL)
1111 goto finally;
1112
1113 PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));
1114 PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
1115
1116 finally:
1117 return;
1118}
Note: See TracBrowser for help on using the repository browser.