blob: 249c22765e802f13076ca3c68900411ccf5de91a [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Math module -- standard C math library functions, pi and e */
2
Christian Heimes53876d92008-04-19 00:31:39 +00003/* 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
Barry Warsaw8b43b191996-12-09 22:32:36 +000055#include "Python.h"
Michael W. Hudson9ef852c2005-04-06 13:05:18 +000056#include "longintrepr.h" /* just for SHIFT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057
Christian Heimes969fe572008-01-25 11:23:10 +000058#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
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000063/*
64 sin(pi*x), giving accurate results for all finite x (especially x
65 integral or close to an integer). This is here for use in the
66 reflection formula for the gamma function. It conforms to IEEE
67 754-2008 for finite arguments, but not for infinities or nans.
68*/
Tim Petersa40c7932001-09-05 22:36:56 +000069
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000070static const double pi = 3.141592653589793238462643383279502884197;
71
72static double
73sinpi(double x)
74{
75 double y, r;
76 int n;
77 /* this function should only ever be called for finite arguments */
78 assert(Py_IS_FINITE(x));
79 y = fmod(fabs(x), 2.0);
80 n = (int)round(2.0*y);
81 assert(0 <= n && n <= 4);
82 switch (n) {
83 case 0:
84 r = sin(pi*y);
85 break;
86 case 1:
87 r = cos(pi*(y-0.5));
88 break;
89 case 2:
90 /* N.B. -sin(pi*(y-1.0)) is *not* equivalent: it would give
91 -0.0 instead of 0.0 when y == 1.0. */
92 r = sin(pi*(1.0-y));
93 break;
94 case 3:
95 r = -cos(pi*(y-1.5));
96 break;
97 case 4:
98 r = sin(pi*(y-2.0));
99 break;
100 default:
101 assert(0); /* should never get here */
102 r = -1.23e200; /* silence gcc warning */
Tim Peters1d120612000-10-12 06:10:25 +0000103 }
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000104 return copysign(1.0, x)*r;
105}
106
107/* Implementation of the real gamma function. In extensive but non-exhaustive
108 random tests, this function proved accurate to within <= 10 ulps across the
109 entire float domain. Note that accuracy may depend on the quality of the
110 system math functions, the pow function in particular. Special cases
111 follow C99 annex F. The parameters and method are tailored to platforms
112 whose double format is the IEEE 754 binary64 format.
113
114 Method: for x > 0.0 we use the Lanczos approximation with parameters N=13
115 and g=6.024680040776729583740234375; these parameters are amongst those
116 used by the Boost library. Following Boost (again), we re-express the
117 Lanczos sum as a rational function, and compute it that way. The
118 coefficients below were computed independently using MPFR, and have been
119 double-checked against the coefficients in the Boost source code.
120
121 For x < 0.0 we use the reflection formula.
122
123 There's one minor tweak that deserves explanation: Lanczos' formula for
124 Gamma(x) involves computing pow(x+g-0.5, x-0.5) / exp(x+g-0.5). For many x
125 values, x+g-0.5 can be represented exactly. However, in cases where it
126 can't be represented exactly the small error in x+g-0.5 can be magnified
127 significantly by the pow and exp calls, especially for large x. A cheap
128 correction is to multiply by (1 + e*g/(x+g-0.5)), where e is the error
129 involved in the computation of x+g-0.5 (that is, e = computed value of
130 x+g-0.5 - exact value of x+g-0.5). Here's the proof:
131
132 Correction factor
133 -----------------
134 Write x+g-0.5 = y-e, where y is exactly representable as an IEEE 754
135 double, and e is tiny. Then:
136
137 pow(x+g-0.5,x-0.5)/exp(x+g-0.5) = pow(y-e, x-0.5)/exp(y-e)
138 = pow(y, x-0.5)/exp(y) * C,
139
140 where the correction_factor C is given by
141
142 C = pow(1-e/y, x-0.5) * exp(e)
143
144 Since e is tiny, pow(1-e/y, x-0.5) ~ 1-(x-0.5)*e/y, and exp(x) ~ 1+e, so:
145
146 C ~ (1-(x-0.5)*e/y) * (1+e) ~ 1 + e*(y-(x-0.5))/y
147
148 But y-(x-0.5) = g+e, and g+e ~ g. So we get C ~ 1 + e*g/y, and
149
150 pow(x+g-0.5,x-0.5)/exp(x+g-0.5) ~ pow(y, x-0.5)/exp(y) * (1 + e*g/y),
151
152 Note that for accuracy, when computing r*C it's better to do
153
154 r + e*g/y*r;
155
156 than
157
158 r * (1 + e*g/y);
159
160 since the addition in the latter throws away most of the bits of
161 information in e*g/y.
162*/
163
164#define LANCZOS_N 13
165static const double lanczos_g = 6.024680040776729583740234375;
166static const double lanczos_g_minus_half = 5.524680040776729583740234375;
167static const double lanczos_num_coeffs[LANCZOS_N] = {
168 23531376880.410759688572007674451636754734846804940,
169 42919803642.649098768957899047001988850926355848959,
170 35711959237.355668049440185451547166705960488635843,
171 17921034426.037209699919755754458931112671403265390,
172 6039542586.3520280050642916443072979210699388420708,
173 1439720407.3117216736632230727949123939715485786772,
174 248874557.86205415651146038641322942321632125127801,
175 31426415.585400194380614231628318205362874684987640,
176 2876370.6289353724412254090516208496135991145378768,
177 186056.26539522349504029498971604569928220784236328,
178 8071.6720023658162106380029022722506138218516325024,
179 210.82427775157934587250973392071336271166969580291,
180 2.5066282746310002701649081771338373386264310793408
181};
182
183/* denominator is x*(x+1)*...*(x+LANCZOS_N-2) */
184static const double lanczos_den_coeffs[LANCZOS_N] = {
185 0.0, 39916800.0, 120543840.0, 150917976.0, 105258076.0, 45995730.0,
186 13339535.0, 2637558.0, 357423.0, 32670.0, 1925.0, 66.0, 1.0};
187
188/* gamma values for small positive integers, 1 though NGAMMA_INTEGRAL */
189#define NGAMMA_INTEGRAL 23
190static const double gamma_integral[NGAMMA_INTEGRAL] = {
191 1.0, 1.0, 2.0, 6.0, 24.0, 120.0, 720.0, 5040.0, 40320.0, 362880.0,
192 3628800.0, 39916800.0, 479001600.0, 6227020800.0, 87178291200.0,
193 1307674368000.0, 20922789888000.0, 355687428096000.0,
194 6402373705728000.0, 121645100408832000.0, 2432902008176640000.0,
195 51090942171709440000.0, 1124000727777607680000.0,
196};
197
198/* Lanczos' sum L_g(x), for positive x */
199
200static double
201lanczos_sum(double x)
202{
203 double num = 0.0, den = 0.0;
204 int i;
205 assert(x > 0.0);
206 /* evaluate the rational function lanczos_sum(x). For large
207 x, the obvious algorithm risks overflow, so we instead
208 rescale the denominator and numerator of the rational
209 function by x**(1-LANCZOS_N) and treat this as a
210 rational function in 1/x. This also reduces the error for
211 larger x values. The choice of cutoff point (5.0 below) is
212 somewhat arbitrary; in tests, smaller cutoff values than
213 this resulted in lower accuracy. */
214 if (x < 5.0) {
215 for (i = LANCZOS_N; --i >= 0; ) {
216 num = num * x + lanczos_num_coeffs[i];
217 den = den * x + lanczos_den_coeffs[i];
218 }
219 }
220 else {
221 for (i = 0; i < LANCZOS_N; i++) {
222 num = num / x + lanczos_num_coeffs[i];
223 den = den / x + lanczos_den_coeffs[i];
224 }
225 }
226 return num/den;
227}
228
229static double
230m_tgamma(double x)
231{
232 double absx, r, y, z, sqrtpow;
233
234 /* special cases */
235 if (!Py_IS_FINITE(x)) {
236 if (Py_IS_NAN(x) || x > 0.0)
237 return x; /* tgamma(nan) = nan, tgamma(inf) = inf */
238 else {
239 errno = EDOM;
240 return Py_NAN; /* tgamma(-inf) = nan, invalid */
241 }
242 }
243 if (x == 0.0) {
244 errno = EDOM;
245 return 1.0/x; /* tgamma(+-0.0) = +-inf, divide-by-zero */
246 }
247
248 /* integer arguments */
249 if (x == floor(x)) {
250 if (x < 0.0) {
251 errno = EDOM; /* tgamma(n) = nan, invalid for */
252 return Py_NAN; /* negative integers n */
253 }
254 if (x <= NGAMMA_INTEGRAL)
255 return gamma_integral[(int)x - 1];
256 }
257 absx = fabs(x);
258
259 /* tiny arguments: tgamma(x) ~ 1/x for x near 0 */
260 if (absx < 1e-20) {
261 r = 1.0/x;
262 if (Py_IS_INFINITY(r))
263 errno = ERANGE;
264 return r;
265 }
266
267 /* large arguments: assuming IEEE 754 doubles, tgamma(x) overflows for
268 x > 200, and underflows to +-0.0 for x < -200, not a negative
269 integer. */
270 if (absx > 200.0) {
271 if (x < 0.0) {
272 return 0.0/sinpi(x);
273 }
274 else {
275 errno = ERANGE;
276 return Py_HUGE_VAL;
277 }
278 }
279
280 y = absx + lanczos_g_minus_half;
281 /* compute error in sum */
282 if (absx > lanczos_g_minus_half) {
283 /* note: the correction can be foiled by an optimizing
284 compiler that (incorrectly) thinks that an expression like
285 a + b - a - b can be optimized to 0.0. This shouldn't
286 happen in a standards-conforming compiler. */
287 double q = y - absx;
288 z = q - lanczos_g_minus_half;
289 }
290 else {
291 double q = y - lanczos_g_minus_half;
292 z = q - absx;
293 }
294 z = z * lanczos_g / y;
295 if (x < 0.0) {
296 r = -pi / sinpi(absx) / absx * exp(y) / lanczos_sum(absx);
297 r -= z * r;
298 if (absx < 140.0) {
299 r /= pow(y, absx - 0.5);
300 }
301 else {
302 sqrtpow = pow(y, absx / 2.0 - 0.25);
303 r /= sqrtpow;
304 r /= sqrtpow;
305 }
306 }
307 else {
308 r = lanczos_sum(absx) / exp(y);
309 r += z * r;
310 if (absx < 140.0) {
311 r *= pow(y, absx - 0.5);
312 }
313 else {
314 sqrtpow = pow(y, absx / 2.0 - 0.25);
315 r *= sqrtpow;
316 r *= sqrtpow;
317 }
318 }
319 if (Py_IS_INFINITY(r))
320 errno = ERANGE;
321 return r;
Guido van Rossum8832b621991-12-16 15:44:24 +0000322}
323
Christian Heimes53876d92008-04-19 00:31:39 +0000324/*
Christian Heimese57950f2008-04-21 13:08:03 +0000325 wrapper for atan2 that deals directly with special cases before
326 delegating to the platform libm for the remaining cases. This
327 is necessary to get consistent behaviour across platforms.
328 Windows, FreeBSD and alpha Tru64 are amongst platforms that don't
329 always follow C99.
330*/
331
332static double
333m_atan2(double y, double x)
334{
335 if (Py_IS_NAN(x) || Py_IS_NAN(y))
336 return Py_NAN;
337 if (Py_IS_INFINITY(y)) {
338 if (Py_IS_INFINITY(x)) {
339 if (copysign(1., x) == 1.)
340 /* atan2(+-inf, +inf) == +-pi/4 */
341 return copysign(0.25*Py_MATH_PI, y);
342 else
343 /* atan2(+-inf, -inf) == +-pi*3/4 */
344 return copysign(0.75*Py_MATH_PI, y);
345 }
346 /* atan2(+-inf, x) == +-pi/2 for finite x */
347 return copysign(0.5*Py_MATH_PI, y);
348 }
349 if (Py_IS_INFINITY(x) || y == 0.) {
350 if (copysign(1., x) == 1.)
351 /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
352 return copysign(0., y);
353 else
354 /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
355 return copysign(Py_MATH_PI, y);
356 }
357 return atan2(y, x);
358}
359
360/*
Mark Dickinsone675f082008-12-11 21:56:00 +0000361 Various platforms (Solaris, OpenBSD) do nonstandard things for log(0),
362 log(-ve), log(NaN). Here are wrappers for log and log10 that deal with
363 special values directly, passing positive non-special values through to
364 the system log/log10.
365 */
366
367static double
368m_log(double x)
369{
370 if (Py_IS_FINITE(x)) {
371 if (x > 0.0)
372 return log(x);
373 errno = EDOM;
374 if (x == 0.0)
375 return -Py_HUGE_VAL; /* log(0) = -inf */
376 else
377 return Py_NAN; /* log(-ve) = nan */
378 }
379 else if (Py_IS_NAN(x))
380 return x; /* log(nan) = nan */
381 else if (x > 0.0)
382 return x; /* log(inf) = inf */
383 else {
384 errno = EDOM;
385 return Py_NAN; /* log(-inf) = nan */
386 }
387}
388
389static double
390m_log10(double x)
391{
392 if (Py_IS_FINITE(x)) {
393 if (x > 0.0)
394 return log10(x);
395 errno = EDOM;
396 if (x == 0.0)
397 return -Py_HUGE_VAL; /* log10(0) = -inf */
398 else
399 return Py_NAN; /* log10(-ve) = nan */
400 }
401 else if (Py_IS_NAN(x))
402 return x; /* log10(nan) = nan */
403 else if (x > 0.0)
404 return x; /* log10(inf) = inf */
405 else {
406 errno = EDOM;
407 return Py_NAN; /* log10(-inf) = nan */
408 }
409}
410
411
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000412/* Call is_error when errno != 0, and where x is the result libm
413 * returned. is_error will usually set up an exception and return
414 * true (1), but may return false (0) without setting up an exception.
415 */
416static int
417is_error(double x)
418{
419 int result = 1; /* presumption of guilt */
420 assert(errno); /* non-zero errno is a precondition for calling */
421 if (errno == EDOM)
422 PyErr_SetString(PyExc_ValueError, "math domain error");
423
424 else if (errno == ERANGE) {
425 /* ANSI C generally requires libm functions to set ERANGE
426 * on overflow, but also generally *allows* them to set
427 * ERANGE on underflow too. There's no consistency about
428 * the latter across platforms.
429 * Alas, C99 never requires that errno be set.
430 * Here we suppress the underflow errors (libm functions
431 * should return a zero on underflow, and +- HUGE_VAL on
432 * overflow, so testing the result for zero suffices to
433 * distinguish the cases).
434 *
435 * On some platforms (Ubuntu/ia64) it seems that errno can be
436 * set to ERANGE for subnormal results that do *not* underflow
437 * to zero. So to be safe, we'll ignore ERANGE whenever the
438 * function result is less than one in absolute value.
439 */
440 if (fabs(x) < 1.0)
441 result = 0;
442 else
443 PyErr_SetString(PyExc_OverflowError,
444 "math range error");
445 }
446 else
447 /* Unexpected math error */
448 PyErr_SetFromErrno(PyExc_ValueError);
449 return result;
450}
451
Mark Dickinsone675f082008-12-11 21:56:00 +0000452/*
Christian Heimes53876d92008-04-19 00:31:39 +0000453 math_1 is used to wrap a libm function f that takes a double
454 arguments and returns a double.
455
456 The error reporting follows these rules, which are designed to do
457 the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
458 platforms.
459
460 - a NaN result from non-NaN inputs causes ValueError to be raised
461 - an infinite result from finite inputs causes OverflowError to be
462 raised if can_overflow is 1, or raises ValueError if can_overflow
463 is 0.
464 - if the result is finite and errno == EDOM then ValueError is
465 raised
466 - if the result is finite and nonzero and errno == ERANGE then
467 OverflowError is raised
468
469 The last rule is used to catch overflow on platforms which follow
470 C89 but for which HUGE_VAL is not an infinity.
471
472 For the majority of one-argument functions these rules are enough
473 to ensure that Python's functions behave as specified in 'Annex F'
474 of the C99 standard, with the 'invalid' and 'divide-by-zero'
475 floating-point exceptions mapping to Python's ValueError and the
476 'overflow' floating-point exception mapping to OverflowError.
477 math_1 only works for functions that don't have singularities *and*
478 the possibility of overflow; fortunately, that covers everything we
479 care about right now.
480*/
481
Barry Warsaw8b43b191996-12-09 22:32:36 +0000482static PyObject *
Jeffrey Yasskinc2155832008-01-05 20:03:11 +0000483math_1_to_whatever(PyObject *arg, double (*func) (double),
Christian Heimes53876d92008-04-19 00:31:39 +0000484 PyObject *(*from_double_func) (double),
485 int can_overflow)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486{
Christian Heimes53876d92008-04-19 00:31:39 +0000487 double x, r;
488 x = PyFloat_AsDouble(arg);
Thomas Wouters89f507f2006-12-13 04:49:30 +0000489 if (x == -1.0 && PyErr_Occurred())
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 return NULL;
491 errno = 0;
Christian Heimes53876d92008-04-19 00:31:39 +0000492 PyFPE_START_PROTECT("in math_1", return 0);
493 r = (*func)(x);
494 PyFPE_END_PROTECT(r);
Mark Dickinsona0de26c2008-04-30 23:30:57 +0000495 if (Py_IS_NAN(r) && !Py_IS_NAN(x)) {
496 PyErr_SetString(PyExc_ValueError,
Mark Dickinson66bada52008-06-18 10:04:31 +0000497 "math domain error"); /* invalid arg */
Mark Dickinsona0de26c2008-04-30 23:30:57 +0000498 return NULL;
Christian Heimes53876d92008-04-19 00:31:39 +0000499 }
Mark Dickinsona0de26c2008-04-30 23:30:57 +0000500 if (Py_IS_INFINITY(r) && Py_IS_FINITE(x)) {
501 if (can_overflow)
502 PyErr_SetString(PyExc_OverflowError,
Mark Dickinson66bada52008-06-18 10:04:31 +0000503 "math range error"); /* overflow */
Mark Dickinsonb63aff12008-05-09 14:10:27 +0000504 else
505 PyErr_SetString(PyExc_ValueError,
Mark Dickinson66bada52008-06-18 10:04:31 +0000506 "math domain error"); /* singularity */
Mark Dickinsona0de26c2008-04-30 23:30:57 +0000507 return NULL;
Christian Heimes53876d92008-04-19 00:31:39 +0000508 }
Mark Dickinsonde429622008-05-01 00:19:23 +0000509 if (Py_IS_FINITE(r) && errno && is_error(r))
510 /* this branch unnecessary on most platforms */
Tim Peters1d120612000-10-12 06:10:25 +0000511 return NULL;
Mark Dickinsonde429622008-05-01 00:19:23 +0000512
513 return (*from_double_func)(r);
Christian Heimes53876d92008-04-19 00:31:39 +0000514}
515
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000516/* variant of math_1, to be used when the function being wrapped is known to
517 set errno properly (that is, errno = EDOM for invalid or divide-by-zero,
518 errno = ERANGE for overflow). */
519
520static PyObject *
521math_1a(PyObject *arg, double (*func) (double))
522{
523 double x, r;
524 x = PyFloat_AsDouble(arg);
525 if (x == -1.0 && PyErr_Occurred())
526 return NULL;
527 errno = 0;
528 PyFPE_START_PROTECT("in math_1a", return 0);
529 r = (*func)(x);
530 PyFPE_END_PROTECT(r);
531 if (errno && is_error(r))
532 return NULL;
533 return PyFloat_FromDouble(r);
534}
535
Christian Heimes53876d92008-04-19 00:31:39 +0000536/*
537 math_2 is used to wrap a libm function f that takes two double
538 arguments and returns a double.
539
540 The error reporting follows these rules, which are designed to do
541 the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
542 platforms.
543
544 - a NaN result from non-NaN inputs causes ValueError to be raised
545 - an infinite result from finite inputs causes OverflowError to be
546 raised.
547 - if the result is finite and errno == EDOM then ValueError is
548 raised
549 - if the result is finite and nonzero and errno == ERANGE then
550 OverflowError is raised
551
552 The last rule is used to catch overflow on platforms which follow
553 C89 but for which HUGE_VAL is not an infinity.
554
555 For most two-argument functions (copysign, fmod, hypot, atan2)
556 these rules are enough to ensure that Python's functions behave as
557 specified in 'Annex F' of the C99 standard, with the 'invalid' and
558 'divide-by-zero' floating-point exceptions mapping to Python's
559 ValueError and the 'overflow' floating-point exception mapping to
560 OverflowError.
561*/
562
563static PyObject *
564math_1(PyObject *arg, double (*func) (double), int can_overflow)
565{
566 return math_1_to_whatever(arg, func, PyFloat_FromDouble, can_overflow);
Jeffrey Yasskinc2155832008-01-05 20:03:11 +0000567}
568
569static PyObject *
Christian Heimes53876d92008-04-19 00:31:39 +0000570math_1_to_int(PyObject *arg, double (*func) (double), int can_overflow)
Jeffrey Yasskinc2155832008-01-05 20:03:11 +0000571{
Christian Heimes53876d92008-04-19 00:31:39 +0000572 return math_1_to_whatever(arg, func, PyLong_FromDouble, can_overflow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573}
574
Barry Warsaw8b43b191996-12-09 22:32:36 +0000575static PyObject *
Thomas Wouters89f507f2006-12-13 04:49:30 +0000576math_2(PyObject *args, double (*func) (double, double), char *funcname)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000577{
Thomas Wouters89f507f2006-12-13 04:49:30 +0000578 PyObject *ox, *oy;
Christian Heimes53876d92008-04-19 00:31:39 +0000579 double x, y, r;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000580 if (! PyArg_UnpackTuple(args, funcname, 2, 2, &ox, &oy))
581 return NULL;
582 x = PyFloat_AsDouble(ox);
583 y = PyFloat_AsDouble(oy);
584 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585 return NULL;
586 errno = 0;
Christian Heimes53876d92008-04-19 00:31:39 +0000587 PyFPE_START_PROTECT("in math_2", return 0);
588 r = (*func)(x, y);
589 PyFPE_END_PROTECT(r);
590 if (Py_IS_NAN(r)) {
591 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
592 errno = EDOM;
593 else
594 errno = 0;
595 }
596 else if (Py_IS_INFINITY(r)) {
597 if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
598 errno = ERANGE;
599 else
600 errno = 0;
601 }
602 if (errno && is_error(r))
Tim Peters1d120612000-10-12 06:10:25 +0000603 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604 else
Christian Heimes53876d92008-04-19 00:31:39 +0000605 return PyFloat_FromDouble(r);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000606}
607
Christian Heimes53876d92008-04-19 00:31:39 +0000608#define FUNC1(funcname, func, can_overflow, docstring) \
Fred Drake40c48682000-07-03 18:11:56 +0000609 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
Christian Heimes53876d92008-04-19 00:31:39 +0000610 return math_1(args, func, can_overflow); \
Guido van Rossumc6e22901998-12-04 19:26:43 +0000611 }\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000612 PyDoc_STRVAR(math_##funcname##_doc, docstring);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000614#define FUNC1A(funcname, func, docstring) \
615 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
616 return math_1a(args, func); \
617 }\
618 PyDoc_STRVAR(math_##funcname##_doc, docstring);
619
Fred Drake40c48682000-07-03 18:11:56 +0000620#define FUNC2(funcname, func, docstring) \
621 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
Thomas Wouters89f507f2006-12-13 04:49:30 +0000622 return math_2(args, func, #funcname); \
Guido van Rossumc6e22901998-12-04 19:26:43 +0000623 }\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000624 PyDoc_STRVAR(math_##funcname##_doc, docstring);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625
Christian Heimes53876d92008-04-19 00:31:39 +0000626FUNC1(acos, acos, 0,
Tim Petersfe71f812001-08-07 22:10:00 +0000627 "acos(x)\n\nReturn the arc cosine (measured in radians) of x.")
Christian Heimes53876d92008-04-19 00:31:39 +0000628FUNC1(acosh, acosh, 0,
629 "acosh(x)\n\nReturn the hyperbolic arc cosine (measured in radians) of x.")
630FUNC1(asin, asin, 0,
Tim Petersfe71f812001-08-07 22:10:00 +0000631 "asin(x)\n\nReturn the arc sine (measured in radians) of x.")
Christian Heimes53876d92008-04-19 00:31:39 +0000632FUNC1(asinh, asinh, 0,
633 "asinh(x)\n\nReturn the hyperbolic arc sine (measured in radians) of x.")
634FUNC1(atan, atan, 0,
Tim Petersfe71f812001-08-07 22:10:00 +0000635 "atan(x)\n\nReturn the arc tangent (measured in radians) of x.")
Christian Heimese57950f2008-04-21 13:08:03 +0000636FUNC2(atan2, m_atan2,
Tim Petersfe71f812001-08-07 22:10:00 +0000637 "atan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\n"
638 "Unlike atan(y/x), the signs of both x and y are considered.")
Christian Heimes53876d92008-04-19 00:31:39 +0000639FUNC1(atanh, atanh, 0,
640 "atanh(x)\n\nReturn the hyperbolic arc tangent (measured in radians) of x.")
Guido van Rossum13e05de2007-08-23 22:56:55 +0000641
642static PyObject * math_ceil(PyObject *self, PyObject *number) {
643 static PyObject *ceil_str = NULL;
644 PyObject *method;
645
646 if (ceil_str == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +0000647 ceil_str = PyUnicode_InternFromString("__ceil__");
Guido van Rossum13e05de2007-08-23 22:56:55 +0000648 if (ceil_str == NULL)
649 return NULL;
650 }
651
Christian Heimes90aa7642007-12-19 02:45:37 +0000652 method = _PyType_Lookup(Py_TYPE(number), ceil_str);
Guido van Rossum13e05de2007-08-23 22:56:55 +0000653 if (method == NULL)
Christian Heimes53876d92008-04-19 00:31:39 +0000654 return math_1_to_int(number, ceil, 0);
Guido van Rossum13e05de2007-08-23 22:56:55 +0000655 else
656 return PyObject_CallFunction(method, "O", number);
657}
658
659PyDoc_STRVAR(math_ceil_doc,
Jeffrey Yasskinc2155832008-01-05 20:03:11 +0000660 "ceil(x)\n\nReturn the ceiling of x as an int.\n"
Guido van Rossum13e05de2007-08-23 22:56:55 +0000661 "This is the smallest integral value >= x.");
662
Christian Heimes072c0f12008-01-03 23:01:04 +0000663FUNC2(copysign, copysign,
Christian Heimes53876d92008-04-19 00:31:39 +0000664 "copysign(x,y)\n\nReturn x with the sign of y.")
665FUNC1(cos, cos, 0,
666 "cos(x)\n\nReturn the cosine of x (measured in radians).")
667FUNC1(cosh, cosh, 1,
668 "cosh(x)\n\nReturn the hyperbolic cosine of x.")
669FUNC1(exp, exp, 1,
Guido van Rossumc6e22901998-12-04 19:26:43 +0000670 "exp(x)\n\nReturn e raised to the power of x.")
Christian Heimes53876d92008-04-19 00:31:39 +0000671FUNC1(fabs, fabs, 0,
Tim Petersfe71f812001-08-07 22:10:00 +0000672 "fabs(x)\n\nReturn the absolute value of the float x.")
Guido van Rossum13e05de2007-08-23 22:56:55 +0000673
674static PyObject * math_floor(PyObject *self, PyObject *number) {
675 static PyObject *floor_str = NULL;
676 PyObject *method;
677
678 if (floor_str == NULL) {
Christian Heimesfe82e772008-01-28 02:38:20 +0000679 floor_str = PyUnicode_InternFromString("__floor__");
Guido van Rossum13e05de2007-08-23 22:56:55 +0000680 if (floor_str == NULL)
681 return NULL;
682 }
683
Christian Heimes90aa7642007-12-19 02:45:37 +0000684 method = _PyType_Lookup(Py_TYPE(number), floor_str);
Guido van Rossum13e05de2007-08-23 22:56:55 +0000685 if (method == NULL)
Christian Heimes53876d92008-04-19 00:31:39 +0000686 return math_1_to_int(number, floor, 0);
Guido van Rossum13e05de2007-08-23 22:56:55 +0000687 else
688 return PyObject_CallFunction(method, "O", number);
689}
690
691PyDoc_STRVAR(math_floor_doc,
Jeffrey Yasskinc2155832008-01-05 20:03:11 +0000692 "floor(x)\n\nReturn the floor of x as an int.\n"
Guido van Rossum13e05de2007-08-23 22:56:55 +0000693 "This is the largest integral value <= x.");
694
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000695FUNC1A(gamma, m_tgamma,
696 "gamma(x)\n\nGamma function at x.")
Christian Heimes53876d92008-04-19 00:31:39 +0000697FUNC1(log1p, log1p, 1,
698 "log1p(x)\n\nReturn the natural logarithm of 1+x (base e).\n\
699 The result is computed in a way which is accurate for x near zero.")
700FUNC1(sin, sin, 0,
Tim Petersfe71f812001-08-07 22:10:00 +0000701 "sin(x)\n\nReturn the sine of x (measured in radians).")
Christian Heimes53876d92008-04-19 00:31:39 +0000702FUNC1(sinh, sinh, 1,
Guido van Rossumc6e22901998-12-04 19:26:43 +0000703 "sinh(x)\n\nReturn the hyperbolic sine of x.")
Christian Heimes53876d92008-04-19 00:31:39 +0000704FUNC1(sqrt, sqrt, 0,
Guido van Rossumc6e22901998-12-04 19:26:43 +0000705 "sqrt(x)\n\nReturn the square root of x.")
Christian Heimes53876d92008-04-19 00:31:39 +0000706FUNC1(tan, tan, 0,
Tim Petersfe71f812001-08-07 22:10:00 +0000707 "tan(x)\n\nReturn the tangent of x (measured in radians).")
Christian Heimes53876d92008-04-19 00:31:39 +0000708FUNC1(tanh, tanh, 0,
Guido van Rossumc6e22901998-12-04 19:26:43 +0000709 "tanh(x)\n\nReturn the hyperbolic tangent of x.")
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000710
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000711/* Precision summation function as msum() by Raymond Hettinger in
712 <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393090>,
713 enhanced with the exact partials sum and roundoff from Mark
714 Dickinson's post at <http://bugs.python.org/file10357/msum4.py>.
715 See those links for more details, proofs and other references.
716
717 Note 1: IEEE 754R floating point semantics are assumed,
718 but the current implementation does not re-establish special
719 value semantics across iterations (i.e. handling -Inf + Inf).
720
721 Note 2: No provision is made for intermediate overflow handling;
Georg Brandlf78e02b2008-06-10 17:40:04 +0000722 therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000723 sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
724 overflow of the first partial sum.
725
Benjamin Petersonfea6a942008-07-02 16:11:42 +0000726 Note 3: The intermediate values lo, yr, and hi are declared volatile so
727 aggressive compilers won't algebraically reduce lo to always be exactly 0.0.
Georg Brandlf78e02b2008-06-10 17:40:04 +0000728 Also, the volatile declaration forces the values to be stored in memory as
729 regular doubles instead of extended long precision (80-bit) values. This
Benjamin Petersonfea6a942008-07-02 16:11:42 +0000730 prevents double rounding because any addition or subtraction of two doubles
Georg Brandlf78e02b2008-06-10 17:40:04 +0000731 can be resolved exactly into double-sized hi and lo values. As long as the
732 hi value gets forced into a double before yr and lo are computed, the extra
733 bits in downstream extended precision operations (x87 for example) will be
734 exactly zero and therefore can be losslessly stored back into a double,
735 thereby preventing double rounding.
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000736
737 Note 4: A similar implementation is in Modules/cmathmodule.c.
738 Be sure to update both when making changes.
739
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000740 Note 5: The signature of math.fsum() differs from __builtin__.sum()
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000741 because the start argument doesn't make sense in the context of
742 accurate summation. Since the partials table is collapsed before
743 returning a result, sum(seq2, start=sum(seq1)) may not equal the
744 accurate result returned by sum(itertools.chain(seq1, seq2)).
745*/
746
747#define NUM_PARTIALS 32 /* initial partials array size, on stack */
748
749/* Extend the partials array p[] by doubling its size. */
750static int /* non-zero on error */
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000751_fsum_realloc(double **p_ptr, Py_ssize_t n,
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000752 double *ps, Py_ssize_t *m_ptr)
753{
754 void *v = NULL;
755 Py_ssize_t m = *m_ptr;
756
757 m += m; /* double */
758 if (n < m && m < (PY_SSIZE_T_MAX / sizeof(double))) {
759 double *p = *p_ptr;
760 if (p == ps) {
761 v = PyMem_Malloc(sizeof(double) * m);
762 if (v != NULL)
763 memcpy(v, ps, sizeof(double) * n);
764 }
765 else
766 v = PyMem_Realloc(p, sizeof(double) * m);
767 }
768 if (v == NULL) { /* size overflow or no memory */
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000769 PyErr_SetString(PyExc_MemoryError, "math.fsum partials");
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000770 return 1;
771 }
772 *p_ptr = (double*) v;
773 *m_ptr = m;
774 return 0;
775}
776
777/* Full precision summation of a sequence of floats.
778
779 def msum(iterable):
780 partials = [] # sorted, non-overlapping partial sums
781 for x in iterable:
782 i = 0
783 for y in partials:
784 if abs(x) < abs(y):
785 x, y = y, x
786 hi = x + y
787 lo = y - (hi - x)
788 if lo:
789 partials[i] = lo
790 i += 1
791 x = hi
792 partials[i:] = [x]
793 return sum_exact(partials)
794
795 Rounded x+y stored in hi with the roundoff stored in lo. Together hi+lo
796 are exactly equal to x+y. The inner loop applies hi/lo summation to each
797 partial so that the list of partial sums remains exact.
798
799 Sum_exact() adds the partial sums exactly and correctly rounds the final
800 result (using the round-half-to-even rule). The items in partials remain
801 non-zero, non-special, non-overlapping and strictly increasing in
802 magnitude, but possibly not all having the same sign.
803
804 Depends on IEEE 754 arithmetic guarantees and half-even rounding.
805*/
806
807static PyObject*
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000808math_fsum(PyObject *self, PyObject *seq)
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000809{
810 PyObject *item, *iter, *sum = NULL;
811 Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;
Georg Brandlf78e02b2008-06-10 17:40:04 +0000812 double x, y, t, ps[NUM_PARTIALS], *p = ps;
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000813 double xsave, special_sum = 0.0, inf_sum = 0.0;
Georg Brandlf78e02b2008-06-10 17:40:04 +0000814 volatile double hi, yr, lo;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000815
816 iter = PyObject_GetIter(seq);
817 if (iter == NULL)
818 return NULL;
819
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000820 PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000821
822 for(;;) { /* for x in iterable */
823 assert(0 <= n && n <= m);
824 assert((m == NUM_PARTIALS && p == ps) ||
825 (m > NUM_PARTIALS && p != NULL));
826
827 item = PyIter_Next(iter);
828 if (item == NULL) {
829 if (PyErr_Occurred())
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000830 goto _fsum_error;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000831 break;
832 }
833 x = PyFloat_AsDouble(item);
834 Py_DECREF(item);
835 if (PyErr_Occurred())
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000836 goto _fsum_error;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000837
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000838 xsave = x;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000839 for (i = j = 0; j < n; j++) { /* for y in partials */
840 y = p[j];
Georg Brandlf78e02b2008-06-10 17:40:04 +0000841 if (fabs(x) < fabs(y)) {
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000842 t = x; x = y; y = t;
Georg Brandlf78e02b2008-06-10 17:40:04 +0000843 }
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000844 hi = x + y;
Georg Brandlf78e02b2008-06-10 17:40:04 +0000845 yr = hi - x;
846 lo = y - yr;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000847 if (lo != 0.0)
848 p[i++] = lo;
849 x = hi;
850 }
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000851
852 n = i; /* ps[i:] = [x] */
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000853 if (x != 0.0) {
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000854 if (! Py_IS_FINITE(x)) {
855 /* a nonfinite x could arise either as
856 a result of intermediate overflow, or
857 as a result of a nan or inf in the
858 summands */
859 if (Py_IS_FINITE(xsave)) {
860 PyErr_SetString(PyExc_OverflowError,
861 "intermediate overflow in fsum");
862 goto _fsum_error;
863 }
864 if (Py_IS_INFINITY(xsave))
865 inf_sum += xsave;
866 special_sum += xsave;
867 /* reset partials */
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000868 n = 0;
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000869 }
870 else if (n >= m && _fsum_realloc(&p, n, ps, &m))
871 goto _fsum_error;
872 else
873 p[n++] = x;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000874 }
875 }
876
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000877 if (special_sum != 0.0) {
878 if (Py_IS_NAN(inf_sum))
879 PyErr_SetString(PyExc_ValueError,
880 "-inf + inf in fsum");
881 else
882 sum = PyFloat_FromDouble(special_sum);
883 goto _fsum_error;
884 }
885
Georg Brandlf78e02b2008-06-10 17:40:04 +0000886 hi = 0.0;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000887 if (n > 0) {
888 hi = p[--n];
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000889 /* sum_exact(ps, hi) from the top, stop when the sum becomes
890 inexact. */
891 while (n > 0) {
892 x = hi;
893 y = p[--n];
894 assert(fabs(y) < fabs(x));
895 hi = x + y;
896 yr = hi - x;
897 lo = y - yr;
898 if (lo != 0.0)
899 break;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000900 }
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000901 /* Make half-even rounding work across multiple partials.
902 Needed so that sum([1e-16, 1, 1e16]) will round-up the last
903 digit to two instead of down to zero (the 1e-16 makes the 1
904 slightly closer to two). With a potential 1 ULP rounding
905 error fixed-up, math.fsum() can guarantee commutativity. */
906 if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
907 (lo > 0.0 && p[n-1] > 0.0))) {
908 y = lo * 2.0;
909 x = hi + y;
910 yr = x - hi;
911 if (y == yr)
912 hi = x;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000913 }
914 }
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000915 sum = PyFloat_FromDouble(hi);
916
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000917_fsum_error:
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000918 PyFPE_END_PROTECT(hi)
919 Py_DECREF(iter);
920 if (p != ps)
921 PyMem_Free(p);
922 return sum;
923}
924
925#undef NUM_PARTIALS
926
Mark Dickinsonaa7633a2008-08-01 08:16:13 +0000927PyDoc_STRVAR(math_fsum_doc,
Benjamin Peterson2b7411d2008-05-26 17:36:47 +0000928"sum(iterable)\n\n\
929Return an accurate floating point sum of values in the iterable.\n\
930Assumes IEEE-754 floating point arithmetic.");
931
Barry Warsaw8b43b191996-12-09 22:32:36 +0000932static PyObject *
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000933math_factorial(PyObject *self, PyObject *arg)
934{
935 long i, x;
936 PyObject *result, *iobj, *newresult;
937
938 if (PyFloat_Check(arg)) {
939 double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);
940 if (dx != floor(dx)) {
941 PyErr_SetString(PyExc_ValueError,
942 "factorial() only accepts integral values");
943 return NULL;
944 }
945 }
946
947 x = PyLong_AsLong(arg);
948 if (x == -1 && PyErr_Occurred())
949 return NULL;
950 if (x < 0) {
951 PyErr_SetString(PyExc_ValueError,
952 "factorial() not defined for negative values");
953 return NULL;
954 }
955
956 result = (PyObject *)PyLong_FromLong(1);
957 if (result == NULL)
958 return NULL;
959 for (i=1 ; i<=x ; i++) {
960 iobj = (PyObject *)PyLong_FromLong(i);
961 if (iobj == NULL)
962 goto error;
963 newresult = PyNumber_Multiply(result, iobj);
964 Py_DECREF(iobj);
965 if (newresult == NULL)
966 goto error;
967 Py_DECREF(result);
968 result = newresult;
969 }
970 return result;
971
972error:
973 Py_DECREF(result);
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000974 return NULL;
975}
976
Benjamin Peterson6ebe78f2008-12-21 00:06:59 +0000977PyDoc_STRVAR(math_factorial_doc,
978"factorial(x) -> Integral\n"
979"\n"
980"Find x!. Raise a ValueError if x is negative or non-integral.");
Georg Brandlc28e1fa2008-06-10 19:20:26 +0000981
982static PyObject *
Christian Heimes400adb02008-02-01 08:12:03 +0000983math_trunc(PyObject *self, PyObject *number)
984{
985 static PyObject *trunc_str = NULL;
986 PyObject *trunc;
987
988 if (Py_TYPE(number)->tp_dict == NULL) {
989 if (PyType_Ready(Py_TYPE(number)) < 0)
990 return NULL;
991 }
992
993 if (trunc_str == NULL) {
994 trunc_str = PyUnicode_InternFromString("__trunc__");
995 if (trunc_str == NULL)
996 return NULL;
997 }
998
999 trunc = _PyType_Lookup(Py_TYPE(number), trunc_str);
1000 if (trunc == NULL) {
1001 PyErr_Format(PyExc_TypeError,
1002 "type %.100s doesn't define __trunc__ method",
1003 Py_TYPE(number)->tp_name);
1004 return NULL;
1005 }
1006 return PyObject_CallFunctionObjArgs(trunc, number, NULL);
1007}
1008
1009PyDoc_STRVAR(math_trunc_doc,
1010"trunc(x:Real) -> Integral\n"
1011"\n"
Christian Heimes292d3512008-02-03 16:51:08 +00001012"Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");
Christian Heimes400adb02008-02-01 08:12:03 +00001013
1014static PyObject *
Thomas Wouters89f507f2006-12-13 04:49:30 +00001015math_frexp(PyObject *self, PyObject *arg)
Guido van Rossumd18ad581991-10-24 14:57:21 +00001016{
Guido van Rossumd18ad581991-10-24 14:57:21 +00001017 int i;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001018 double x = PyFloat_AsDouble(arg);
1019 if (x == -1.0 && PyErr_Occurred())
Guido van Rossumd18ad581991-10-24 14:57:21 +00001020 return NULL;
Christian Heimes53876d92008-04-19 00:31:39 +00001021 /* deal with special cases directly, to sidestep platform
1022 differences */
1023 if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
1024 i = 0;
1025 }
1026 else {
1027 PyFPE_START_PROTECT("in math_frexp", return 0);
1028 x = frexp(x, &i);
1029 PyFPE_END_PROTECT(x);
1030 }
1031 return Py_BuildValue("(di)", x, i);
Guido van Rossumd18ad581991-10-24 14:57:21 +00001032}
1033
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001034PyDoc_STRVAR(math_frexp_doc,
Tim Peters63c94532001-09-04 23:17:42 +00001035"frexp(x)\n"
1036"\n"
1037"Return the mantissa and exponent of x, as pair (m, e).\n"
1038"m is a float and e is an int, such that x = m * 2.**e.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001039"If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.");
Guido van Rossumc6e22901998-12-04 19:26:43 +00001040
Barry Warsaw8b43b191996-12-09 22:32:36 +00001041static PyObject *
Fred Drake40c48682000-07-03 18:11:56 +00001042math_ldexp(PyObject *self, PyObject *args)
Guido van Rossumd18ad581991-10-24 14:57:21 +00001043{
Christian Heimes53876d92008-04-19 00:31:39 +00001044 double x, r;
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001045 PyObject *oexp;
1046 long exp;
1047 if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp))
Guido van Rossumd18ad581991-10-24 14:57:21 +00001048 return NULL;
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001049
1050 if (PyLong_Check(oexp)) {
1051 /* on overflow, replace exponent with either LONG_MAX
1052 or LONG_MIN, depending on the sign. */
1053 exp = PyLong_AsLong(oexp);
1054 if (exp == -1 && PyErr_Occurred()) {
1055 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1056 if (Py_SIZE(oexp) < 0) {
1057 exp = LONG_MIN;
1058 }
1059 else {
1060 exp = LONG_MAX;
1061 }
1062 PyErr_Clear();
1063 }
1064 else {
1065 /* propagate any unexpected exception */
1066 return NULL;
1067 }
1068 }
1069 }
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001070 else {
1071 PyErr_SetString(PyExc_TypeError,
1072 "Expected an int or long as second argument "
1073 "to ldexp.");
1074 return NULL;
1075 }
1076
1077 if (x == 0. || !Py_IS_FINITE(x)) {
1078 /* NaNs, zeros and infinities are returned unchanged */
1079 r = x;
Christian Heimes53876d92008-04-19 00:31:39 +00001080 errno = 0;
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001081 } else if (exp > INT_MAX) {
1082 /* overflow */
1083 r = copysign(Py_HUGE_VAL, x);
1084 errno = ERANGE;
1085 } else if (exp < INT_MIN) {
1086 /* underflow to +-0 */
1087 r = copysign(0., x);
1088 errno = 0;
1089 } else {
1090 errno = 0;
1091 PyFPE_START_PROTECT("in math_ldexp", return 0);
1092 r = ldexp(x, (int)exp);
1093 PyFPE_END_PROTECT(r);
1094 if (Py_IS_INFINITY(r))
1095 errno = ERANGE;
1096 }
1097
Christian Heimes53876d92008-04-19 00:31:39 +00001098 if (errno && is_error(r))
Tim Peters1d120612000-10-12 06:10:25 +00001099 return NULL;
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00001100 return PyFloat_FromDouble(r);
Guido van Rossumd18ad581991-10-24 14:57:21 +00001101}
1102
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001103PyDoc_STRVAR(math_ldexp_doc,
1104"ldexp(x, i) -> x * (2**i)");
Guido van Rossumc6e22901998-12-04 19:26:43 +00001105
Barry Warsaw8b43b191996-12-09 22:32:36 +00001106static PyObject *
Thomas Wouters89f507f2006-12-13 04:49:30 +00001107math_modf(PyObject *self, PyObject *arg)
Guido van Rossumd18ad581991-10-24 14:57:21 +00001108{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001109 double y, x = PyFloat_AsDouble(arg);
1110 if (x == -1.0 && PyErr_Occurred())
Guido van Rossumd18ad581991-10-24 14:57:21 +00001111 return NULL;
Christian Heimesa342c012008-04-20 21:01:16 +00001112 /* some platforms don't do the right thing for NaNs and
1113 infinities, so we take care of special cases directly. */
1114 if (!Py_IS_FINITE(x)) {
1115 if (Py_IS_INFINITY(x))
1116 return Py_BuildValue("(dd)", copysign(0., x), x);
1117 else if (Py_IS_NAN(x))
1118 return Py_BuildValue("(dd)", x, x);
1119 }
1120
Guido van Rossumd18ad581991-10-24 14:57:21 +00001121 errno = 0;
Christian Heimes53876d92008-04-19 00:31:39 +00001122 PyFPE_START_PROTECT("in math_modf", return 0);
Guido van Rossumd18ad581991-10-24 14:57:21 +00001123 x = modf(x, &y);
Christian Heimes53876d92008-04-19 00:31:39 +00001124 PyFPE_END_PROTECT(x);
1125 return Py_BuildValue("(dd)", x, y);
Guido van Rossumd18ad581991-10-24 14:57:21 +00001126}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001128PyDoc_STRVAR(math_modf_doc,
Tim Peters63c94532001-09-04 23:17:42 +00001129"modf(x)\n"
1130"\n"
1131"Return the fractional and integer parts of x. Both results carry the sign\n"
Benjamin Peterson6ebe78f2008-12-21 00:06:59 +00001132"of x and are floats.");
Guido van Rossumc6e22901998-12-04 19:26:43 +00001133
Tim Peters78526162001-09-05 00:53:45 +00001134/* A decent logarithm is easy to compute even for huge longs, but libm can't
1135 do that by itself -- loghelper can. func is log or log10, and name is
1136 "log" or "log10". Note that overflow isn't possible: a long can contain
1137 no more than INT_MAX * SHIFT bits, so has value certainly less than
1138 2**(2**64 * 2**16) == 2**2**80, and log2 of that is 2**80, which is
1139 small enough to fit in an IEEE single. log and log10 are even smaller.
1140*/
1141
1142static PyObject*
Thomas Wouters89f507f2006-12-13 04:49:30 +00001143loghelper(PyObject* arg, double (*func)(double), char *funcname)
Tim Peters78526162001-09-05 00:53:45 +00001144{
Tim Peters78526162001-09-05 00:53:45 +00001145 /* If it is long, do it ourselves. */
1146 if (PyLong_Check(arg)) {
1147 double x;
1148 int e;
1149 x = _PyLong_AsScaledDouble(arg, &e);
1150 if (x <= 0.0) {
1151 PyErr_SetString(PyExc_ValueError,
1152 "math domain error");
1153 return NULL;
1154 }
Christian Heimesaf98da12008-01-27 15:18:18 +00001155 /* Value is ~= x * 2**(e*PyLong_SHIFT), so the log ~=
1156 log(x) + log(2) * e * PyLong_SHIFT.
1157 CAUTION: e*PyLong_SHIFT may overflow using int arithmetic,
Tim Peters78526162001-09-05 00:53:45 +00001158 so force use of double. */
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001159 x = func(x) + (e * (double)PyLong_SHIFT) * func(2.0);
Tim Peters78526162001-09-05 00:53:45 +00001160 return PyFloat_FromDouble(x);
1161 }
1162
1163 /* Else let libm handle it by itself. */
Christian Heimes53876d92008-04-19 00:31:39 +00001164 return math_1(arg, func, 0);
Tim Peters78526162001-09-05 00:53:45 +00001165}
1166
1167static PyObject *
1168math_log(PyObject *self, PyObject *args)
1169{
Raymond Hettinger866964c2002-12-14 19:51:34 +00001170 PyObject *arg;
1171 PyObject *base = NULL;
1172 PyObject *num, *den;
1173 PyObject *ans;
Raymond Hettinger866964c2002-12-14 19:51:34 +00001174
Raymond Hettingerea3fdf42002-12-29 16:33:45 +00001175 if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))
Raymond Hettinger866964c2002-12-14 19:51:34 +00001176 return NULL;
Raymond Hettinger866964c2002-12-14 19:51:34 +00001177
Mark Dickinsone675f082008-12-11 21:56:00 +00001178 num = loghelper(arg, m_log, "log");
Thomas Wouters89f507f2006-12-13 04:49:30 +00001179 if (num == NULL || base == NULL)
1180 return num;
Raymond Hettinger866964c2002-12-14 19:51:34 +00001181
Mark Dickinsone675f082008-12-11 21:56:00 +00001182 den = loghelper(base, m_log, "log");
Raymond Hettinger866964c2002-12-14 19:51:34 +00001183 if (den == NULL) {
1184 Py_DECREF(num);
1185 return NULL;
1186 }
1187
Neal Norwitzbcc0db82006-03-24 08:14:36 +00001188 ans = PyNumber_TrueDivide(num, den);
Raymond Hettinger866964c2002-12-14 19:51:34 +00001189 Py_DECREF(num);
1190 Py_DECREF(den);
1191 return ans;
Tim Peters78526162001-09-05 00:53:45 +00001192}
1193
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001194PyDoc_STRVAR(math_log_doc,
Raymond Hettinger866964c2002-12-14 19:51:34 +00001195"log(x[, base]) -> the logarithm of x to the given base.\n\
1196If the base not specified, returns the natural logarithm (base e) of x.");
Tim Peters78526162001-09-05 00:53:45 +00001197
1198static PyObject *
Thomas Wouters89f507f2006-12-13 04:49:30 +00001199math_log10(PyObject *self, PyObject *arg)
Tim Peters78526162001-09-05 00:53:45 +00001200{
Mark Dickinsone675f082008-12-11 21:56:00 +00001201 return loghelper(arg, m_log10, "log10");
Tim Peters78526162001-09-05 00:53:45 +00001202}
1203
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001204PyDoc_STRVAR(math_log10_doc,
1205"log10(x) -> the base 10 logarithm of x.");
Tim Peters78526162001-09-05 00:53:45 +00001206
Christian Heimes53876d92008-04-19 00:31:39 +00001207static PyObject *
1208math_fmod(PyObject *self, PyObject *args)
1209{
1210 PyObject *ox, *oy;
1211 double r, x, y;
1212 if (! PyArg_UnpackTuple(args, "fmod", 2, 2, &ox, &oy))
1213 return NULL;
1214 x = PyFloat_AsDouble(ox);
1215 y = PyFloat_AsDouble(oy);
1216 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1217 return NULL;
1218 /* fmod(x, +/-Inf) returns x for finite x. */
1219 if (Py_IS_INFINITY(y) && Py_IS_FINITE(x))
1220 return PyFloat_FromDouble(x);
1221 errno = 0;
1222 PyFPE_START_PROTECT("in math_fmod", return 0);
1223 r = fmod(x, y);
1224 PyFPE_END_PROTECT(r);
1225 if (Py_IS_NAN(r)) {
1226 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
1227 errno = EDOM;
1228 else
1229 errno = 0;
1230 }
1231 if (errno && is_error(r))
1232 return NULL;
1233 else
1234 return PyFloat_FromDouble(r);
1235}
1236
1237PyDoc_STRVAR(math_fmod_doc,
1238"fmod(x,y)\n\nReturn fmod(x, y), according to platform C."
1239" x % y may differ.");
1240
1241static PyObject *
1242math_hypot(PyObject *self, PyObject *args)
1243{
1244 PyObject *ox, *oy;
1245 double r, x, y;
1246 if (! PyArg_UnpackTuple(args, "hypot", 2, 2, &ox, &oy))
1247 return NULL;
1248 x = PyFloat_AsDouble(ox);
1249 y = PyFloat_AsDouble(oy);
1250 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1251 return NULL;
1252 /* hypot(x, +/-Inf) returns Inf, even if x is a NaN. */
1253 if (Py_IS_INFINITY(x))
1254 return PyFloat_FromDouble(fabs(x));
1255 if (Py_IS_INFINITY(y))
1256 return PyFloat_FromDouble(fabs(y));
1257 errno = 0;
1258 PyFPE_START_PROTECT("in math_hypot", return 0);
1259 r = hypot(x, y);
1260 PyFPE_END_PROTECT(r);
1261 if (Py_IS_NAN(r)) {
1262 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
1263 errno = EDOM;
1264 else
1265 errno = 0;
1266 }
1267 else if (Py_IS_INFINITY(r)) {
1268 if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
1269 errno = ERANGE;
1270 else
1271 errno = 0;
1272 }
1273 if (errno && is_error(r))
1274 return NULL;
1275 else
1276 return PyFloat_FromDouble(r);
1277}
1278
1279PyDoc_STRVAR(math_hypot_doc,
1280"hypot(x,y)\n\nReturn the Euclidean distance, sqrt(x*x + y*y).");
1281
1282/* pow can't use math_2, but needs its own wrapper: the problem is
1283 that an infinite result can arise either as a result of overflow
1284 (in which case OverflowError should be raised) or as a result of
1285 e.g. 0.**-5. (for which ValueError needs to be raised.)
1286*/
1287
1288static PyObject *
1289math_pow(PyObject *self, PyObject *args)
1290{
1291 PyObject *ox, *oy;
1292 double r, x, y;
Christian Heimesa342c012008-04-20 21:01:16 +00001293 int odd_y;
Christian Heimes53876d92008-04-19 00:31:39 +00001294
1295 if (! PyArg_UnpackTuple(args, "pow", 2, 2, &ox, &oy))
1296 return NULL;
1297 x = PyFloat_AsDouble(ox);
1298 y = PyFloat_AsDouble(oy);
1299 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1300 return NULL;
Christian Heimesa342c012008-04-20 21:01:16 +00001301
1302 /* deal directly with IEEE specials, to cope with problems on various
1303 platforms whose semantics don't exactly match C99 */
Christian Heimes81ee3ef2008-05-04 22:42:01 +00001304 r = 0.; /* silence compiler warning */
Christian Heimesa342c012008-04-20 21:01:16 +00001305 if (!Py_IS_FINITE(x) || !Py_IS_FINITE(y)) {
1306 errno = 0;
1307 if (Py_IS_NAN(x))
1308 r = y == 0. ? 1. : x; /* NaN**0 = 1 */
1309 else if (Py_IS_NAN(y))
1310 r = x == 1. ? 1. : y; /* 1**NaN = 1 */
1311 else if (Py_IS_INFINITY(x)) {
1312 odd_y = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;
1313 if (y > 0.)
1314 r = odd_y ? x : fabs(x);
1315 else if (y == 0.)
1316 r = 1.;
1317 else /* y < 0. */
1318 r = odd_y ? copysign(0., x) : 0.;
1319 }
1320 else if (Py_IS_INFINITY(y)) {
1321 if (fabs(x) == 1.0)
1322 r = 1.;
1323 else if (y > 0. && fabs(x) > 1.0)
1324 r = y;
1325 else if (y < 0. && fabs(x) < 1.0) {
1326 r = -y; /* result is +inf */
1327 if (x == 0.) /* 0**-inf: divide-by-zero */
1328 errno = EDOM;
1329 }
1330 else
1331 r = 0.;
1332 }
Christian Heimes53876d92008-04-19 00:31:39 +00001333 }
Christian Heimesa342c012008-04-20 21:01:16 +00001334 else {
1335 /* let libm handle finite**finite */
1336 errno = 0;
1337 PyFPE_START_PROTECT("in math_pow", return 0);
1338 r = pow(x, y);
1339 PyFPE_END_PROTECT(r);
1340 /* a NaN result should arise only from (-ve)**(finite
1341 non-integer); in this case we want to raise ValueError. */
1342 if (!Py_IS_FINITE(r)) {
1343 if (Py_IS_NAN(r)) {
1344 errno = EDOM;
1345 }
1346 /*
1347 an infinite result here arises either from:
1348 (A) (+/-0.)**negative (-> divide-by-zero)
1349 (B) overflow of x**y with x and y finite
1350 */
1351 else if (Py_IS_INFINITY(r)) {
1352 if (x == 0.)
1353 errno = EDOM;
1354 else
1355 errno = ERANGE;
1356 }
1357 }
Christian Heimes53876d92008-04-19 00:31:39 +00001358 }
1359
1360 if (errno && is_error(r))
1361 return NULL;
1362 else
1363 return PyFloat_FromDouble(r);
1364}
1365
1366PyDoc_STRVAR(math_pow_doc,
1367"pow(x,y)\n\nReturn x**y (x to the power of y).");
1368
Christian Heimes072c0f12008-01-03 23:01:04 +00001369static const double degToRad = Py_MATH_PI / 180.0;
1370static const double radToDeg = 180.0 / Py_MATH_PI;
Raymond Hettingerd6f22672002-05-13 03:56:10 +00001371
1372static PyObject *
Thomas Wouters89f507f2006-12-13 04:49:30 +00001373math_degrees(PyObject *self, PyObject *arg)
Raymond Hettingerd6f22672002-05-13 03:56:10 +00001374{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001375 double x = PyFloat_AsDouble(arg);
1376 if (x == -1.0 && PyErr_Occurred())
Raymond Hettingerd6f22672002-05-13 03:56:10 +00001377 return NULL;
Christian Heimes072c0f12008-01-03 23:01:04 +00001378 return PyFloat_FromDouble(x * radToDeg);
Raymond Hettingerd6f22672002-05-13 03:56:10 +00001379}
1380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381PyDoc_STRVAR(math_degrees_doc,
1382"degrees(x) -> converts angle x from radians to degrees");
Raymond Hettingerd6f22672002-05-13 03:56:10 +00001383
1384static PyObject *
Thomas Wouters89f507f2006-12-13 04:49:30 +00001385math_radians(PyObject *self, PyObject *arg)
Raymond Hettingerd6f22672002-05-13 03:56:10 +00001386{
Thomas Wouters89f507f2006-12-13 04:49:30 +00001387 double x = PyFloat_AsDouble(arg);
1388 if (x == -1.0 && PyErr_Occurred())
Raymond Hettingerd6f22672002-05-13 03:56:10 +00001389 return NULL;
1390 return PyFloat_FromDouble(x * degToRad);
1391}
1392
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001393PyDoc_STRVAR(math_radians_doc,
1394"radians(x) -> converts angle x from degrees to radians");
Tim Peters78526162001-09-05 00:53:45 +00001395
Christian Heimes072c0f12008-01-03 23:01:04 +00001396static PyObject *
1397math_isnan(PyObject *self, PyObject *arg)
1398{
1399 double x = PyFloat_AsDouble(arg);
1400 if (x == -1.0 && PyErr_Occurred())
1401 return NULL;
1402 return PyBool_FromLong((long)Py_IS_NAN(x));
1403}
1404
1405PyDoc_STRVAR(math_isnan_doc,
1406"isnan(x) -> bool\n\
1407Checks if float x is not a number (NaN)");
1408
1409static PyObject *
1410math_isinf(PyObject *self, PyObject *arg)
1411{
1412 double x = PyFloat_AsDouble(arg);
1413 if (x == -1.0 && PyErr_Occurred())
1414 return NULL;
1415 return PyBool_FromLong((long)Py_IS_INFINITY(x));
1416}
1417
1418PyDoc_STRVAR(math_isinf_doc,
1419"isinf(x) -> bool\n\
1420Checks if float x is infinite (positive or negative)");
1421
Barry Warsaw8b43b191996-12-09 22:32:36 +00001422static PyMethodDef math_methods[] = {
Thomas Wouters89f507f2006-12-13 04:49:30 +00001423 {"acos", math_acos, METH_O, math_acos_doc},
Christian Heimes53876d92008-04-19 00:31:39 +00001424 {"acosh", math_acosh, METH_O, math_acosh_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001425 {"asin", math_asin, METH_O, math_asin_doc},
Christian Heimes53876d92008-04-19 00:31:39 +00001426 {"asinh", math_asinh, METH_O, math_asinh_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001427 {"atan", math_atan, METH_O, math_atan_doc},
Fred Drake40c48682000-07-03 18:11:56 +00001428 {"atan2", math_atan2, METH_VARARGS, math_atan2_doc},
Christian Heimes53876d92008-04-19 00:31:39 +00001429 {"atanh", math_atanh, METH_O, math_atanh_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001430 {"ceil", math_ceil, METH_O, math_ceil_doc},
Christian Heimes072c0f12008-01-03 23:01:04 +00001431 {"copysign", math_copysign, METH_VARARGS, math_copysign_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001432 {"cos", math_cos, METH_O, math_cos_doc},
1433 {"cosh", math_cosh, METH_O, math_cosh_doc},
1434 {"degrees", math_degrees, METH_O, math_degrees_doc},
1435 {"exp", math_exp, METH_O, math_exp_doc},
1436 {"fabs", math_fabs, METH_O, math_fabs_doc},
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001437 {"factorial", math_factorial, METH_O, math_factorial_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001438 {"floor", math_floor, METH_O, math_floor_doc},
Fred Drake40c48682000-07-03 18:11:56 +00001439 {"fmod", math_fmod, METH_VARARGS, math_fmod_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001440 {"frexp", math_frexp, METH_O, math_frexp_doc},
Mark Dickinsonaa7633a2008-08-01 08:16:13 +00001441 {"fsum", math_fsum, METH_O, math_fsum_doc},
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001442 {"gamma", math_gamma, METH_O, math_gamma_doc},
Fred Drake40c48682000-07-03 18:11:56 +00001443 {"hypot", math_hypot, METH_VARARGS, math_hypot_doc},
Christian Heimes072c0f12008-01-03 23:01:04 +00001444 {"isinf", math_isinf, METH_O, math_isinf_doc},
1445 {"isnan", math_isnan, METH_O, math_isnan_doc},
Fred Drake40c48682000-07-03 18:11:56 +00001446 {"ldexp", math_ldexp, METH_VARARGS, math_ldexp_doc},
1447 {"log", math_log, METH_VARARGS, math_log_doc},
Christian Heimes53876d92008-04-19 00:31:39 +00001448 {"log1p", math_log1p, METH_O, math_log1p_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001449 {"log10", math_log10, METH_O, math_log10_doc},
1450 {"modf", math_modf, METH_O, math_modf_doc},
Fred Drake40c48682000-07-03 18:11:56 +00001451 {"pow", math_pow, METH_VARARGS, math_pow_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001452 {"radians", math_radians, METH_O, math_radians_doc},
1453 {"sin", math_sin, METH_O, math_sin_doc},
1454 {"sinh", math_sinh, METH_O, math_sinh_doc},
1455 {"sqrt", math_sqrt, METH_O, math_sqrt_doc},
1456 {"tan", math_tan, METH_O, math_tan_doc},
1457 {"tanh", math_tanh, METH_O, math_tanh_doc},
Mark Dickinsonaa7633a2008-08-01 08:16:13 +00001458 {"trunc", math_trunc, METH_O, math_trunc_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001459 {NULL, NULL} /* sentinel */
1460};
1461
Guido van Rossumc6e22901998-12-04 19:26:43 +00001462
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001463PyDoc_STRVAR(module_doc,
Tim Peters63c94532001-09-04 23:17:42 +00001464"This module is always available. It provides access to the\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001465"mathematical functions defined by the C standard.");
Guido van Rossumc6e22901998-12-04 19:26:43 +00001466
Martin v. Löwis1a214512008-06-11 05:26:20 +00001467
1468static struct PyModuleDef mathmodule = {
1469 PyModuleDef_HEAD_INIT,
1470 "math",
1471 module_doc,
1472 -1,
1473 math_methods,
1474 NULL,
1475 NULL,
1476 NULL,
1477 NULL
1478};
1479
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001480PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001481PyInit_math(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001482{
Christian Heimes53876d92008-04-19 00:31:39 +00001483 PyObject *m;
Tim Petersfe71f812001-08-07 22:10:00 +00001484
Martin v. Löwis1a214512008-06-11 05:26:20 +00001485 m = PyModule_Create(&mathmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001486 if (m == NULL)
1487 goto finally;
Barry Warsawfc93f751996-12-17 00:47:03 +00001488
Christian Heimes53876d92008-04-19 00:31:39 +00001489 PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));
1490 PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
Barry Warsawfc93f751996-12-17 00:47:03 +00001491
Christian Heimes53876d92008-04-19 00:31:39 +00001492 finally:
Martin v. Löwis1a214512008-06-11 05:26:20 +00001493 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001494}