Line data Source code
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 :
9 : These are the "spirit of 754" rules:
10 :
11 : 1. If the mathematical result is a real number, but of magnitude too
12 : large to approximate by a machine float, overflow is signaled and the
13 : result is an infinity (with the appropriate sign).
14 :
15 : 2. If the mathematical result is a real number, but of magnitude too
16 : small to approximate by a machine float, underflow is signaled and the
17 : result is a zero (with the appropriate sign).
18 :
19 : 3. At a singularity (a value x such that the limit of f(y) as y
20 : approaches x exists and is an infinity), "divide by zero" is signaled
21 : and the result is an infinity (with the appropriate sign). This is
22 : complicated a little by that the left-side and right-side limits may
23 : not be the same; e.g., 1/x approaches +inf or -inf as x approaches 0
24 : from the positive or negative directions. In that specific case, the
25 : sign of the zero determines the result of 1/0.
26 :
27 : 4. At a point where a function has no defined result in the extended
28 : reals (i.e., the reals plus an infinity or two), invalid operation is
29 : signaled and a NaN is returned.
30 :
31 : And these are what Python has historically /tried/ to do (but not
32 : always successfully, as platform libm behavior varies a lot):
33 :
34 : For #1, raise OverflowError.
35 :
36 : For #2, return a zero (with the appropriate sign if that happens by
37 : accident ;-)).
38 :
39 : For #3 and #4, raise ValueError. It may have made sense to raise
40 : Python's ZeroDivisionError in #3, but historically that's only been
41 : raised for division by zero and mod by zero.
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 "_math.h"
57 :
58 : /*
59 : sin(pi*x), giving accurate results for all finite x (especially x
60 : integral or close to an integer). This is here for use in the
61 : reflection formula for the gamma function. It conforms to IEEE
62 : 754-2008 for finite arguments, but not for infinities or nans.
63 : */
64 :
65 : static const double pi = 3.141592653589793238462643383279502884197;
66 : static const double sqrtpi = 1.772453850905516027298167483341145182798;
67 : static const double logpi = 1.144729885849400174143427351353058711647;
68 :
69 : static double
70 0 : sinpi(double x)
71 : {
72 : double y, r;
73 : int n;
74 : /* this function should only ever be called for finite arguments */
75 : assert(Py_IS_FINITE(x));
76 0 : y = fmod(fabs(x), 2.0);
77 0 : n = (int)round(2.0*y);
78 : assert(0 <= n && n <= 4);
79 0 : switch (n) {
80 : case 0:
81 0 : r = sin(pi*y);
82 0 : break;
83 : case 1:
84 0 : r = cos(pi*(y-0.5));
85 0 : break;
86 : case 2:
87 : /* N.B. -sin(pi*(y-1.0)) is *not* equivalent: it would give
88 : -0.0 instead of 0.0 when y == 1.0. */
89 0 : r = sin(pi*(1.0-y));
90 0 : break;
91 : case 3:
92 0 : r = -cos(pi*(y-1.5));
93 0 : break;
94 : case 4:
95 0 : r = sin(pi*(y-2.0));
96 0 : break;
97 : default:
98 : assert(0); /* should never get here */
99 0 : r = -1.23e200; /* silence gcc warning */
100 : }
101 0 : return copysign(1.0, x)*r;
102 : }
103 :
104 : /* Implementation of the real gamma function. In extensive but non-exhaustive
105 : random tests, this function proved accurate to within <= 10 ulps across the
106 : entire float domain. Note that accuracy may depend on the quality of the
107 : system math functions, the pow function in particular. Special cases
108 : follow C99 annex F. The parameters and method are tailored to platforms
109 : whose double format is the IEEE 754 binary64 format.
110 :
111 : Method: for x > 0.0 we use the Lanczos approximation with parameters N=13
112 : and g=6.024680040776729583740234375; these parameters are amongst those
113 : used by the Boost library. Following Boost (again), we re-express the
114 : Lanczos sum as a rational function, and compute it that way. The
115 : coefficients below were computed independently using MPFR, and have been
116 : double-checked against the coefficients in the Boost source code.
117 :
118 : For x < 0.0 we use the reflection formula.
119 :
120 : There's one minor tweak that deserves explanation: Lanczos' formula for
121 : Gamma(x) involves computing pow(x+g-0.5, x-0.5) / exp(x+g-0.5). For many x
122 : values, x+g-0.5 can be represented exactly. However, in cases where it
123 : can't be represented exactly the small error in x+g-0.5 can be magnified
124 : significantly by the pow and exp calls, especially for large x. A cheap
125 : correction is to multiply by (1 + e*g/(x+g-0.5)), where e is the error
126 : involved in the computation of x+g-0.5 (that is, e = computed value of
127 : x+g-0.5 - exact value of x+g-0.5). Here's the proof:
128 :
129 : Correction factor
130 : -----------------
131 : Write x+g-0.5 = y-e, where y is exactly representable as an IEEE 754
132 : double, and e is tiny. Then:
133 :
134 : pow(x+g-0.5,x-0.5)/exp(x+g-0.5) = pow(y-e, x-0.5)/exp(y-e)
135 : = pow(y, x-0.5)/exp(y) * C,
136 :
137 : where the correction_factor C is given by
138 :
139 : C = pow(1-e/y, x-0.5) * exp(e)
140 :
141 : Since e is tiny, pow(1-e/y, x-0.5) ~ 1-(x-0.5)*e/y, and exp(x) ~ 1+e, so:
142 :
143 : C ~ (1-(x-0.5)*e/y) * (1+e) ~ 1 + e*(y-(x-0.5))/y
144 :
145 : But y-(x-0.5) = g+e, and g+e ~ g. So we get C ~ 1 + e*g/y, and
146 :
147 : pow(x+g-0.5,x-0.5)/exp(x+g-0.5) ~ pow(y, x-0.5)/exp(y) * (1 + e*g/y),
148 :
149 : Note that for accuracy, when computing r*C it's better to do
150 :
151 : r + e*g/y*r;
152 :
153 : than
154 :
155 : r * (1 + e*g/y);
156 :
157 : since the addition in the latter throws away most of the bits of
158 : information in e*g/y.
159 : */
160 :
161 : #define LANCZOS_N 13
162 : static const double lanczos_g = 6.024680040776729583740234375;
163 : static const double lanczos_g_minus_half = 5.524680040776729583740234375;
164 : static const double lanczos_num_coeffs[LANCZOS_N] = {
165 : 23531376880.410759688572007674451636754734846804940,
166 : 42919803642.649098768957899047001988850926355848959,
167 : 35711959237.355668049440185451547166705960488635843,
168 : 17921034426.037209699919755754458931112671403265390,
169 : 6039542586.3520280050642916443072979210699388420708,
170 : 1439720407.3117216736632230727949123939715485786772,
171 : 248874557.86205415651146038641322942321632125127801,
172 : 31426415.585400194380614231628318205362874684987640,
173 : 2876370.6289353724412254090516208496135991145378768,
174 : 186056.26539522349504029498971604569928220784236328,
175 : 8071.6720023658162106380029022722506138218516325024,
176 : 210.82427775157934587250973392071336271166969580291,
177 : 2.5066282746310002701649081771338373386264310793408
178 : };
179 :
180 : /* denominator is x*(x+1)*...*(x+LANCZOS_N-2) */
181 : static const double lanczos_den_coeffs[LANCZOS_N] = {
182 : 0.0, 39916800.0, 120543840.0, 150917976.0, 105258076.0, 45995730.0,
183 : 13339535.0, 2637558.0, 357423.0, 32670.0, 1925.0, 66.0, 1.0};
184 :
185 : /* gamma values for small positive integers, 1 though NGAMMA_INTEGRAL */
186 : #define NGAMMA_INTEGRAL 23
187 : static const double gamma_integral[NGAMMA_INTEGRAL] = {
188 : 1.0, 1.0, 2.0, 6.0, 24.0, 120.0, 720.0, 5040.0, 40320.0, 362880.0,
189 : 3628800.0, 39916800.0, 479001600.0, 6227020800.0, 87178291200.0,
190 : 1307674368000.0, 20922789888000.0, 355687428096000.0,
191 : 6402373705728000.0, 121645100408832000.0, 2432902008176640000.0,
192 : 51090942171709440000.0, 1124000727777607680000.0,
193 : };
194 :
195 : /* Lanczos' sum L_g(x), for positive x */
196 :
197 : static double
198 0 : lanczos_sum(double x)
199 : {
200 0 : double num = 0.0, den = 0.0;
201 : int i;
202 : assert(x > 0.0);
203 : /* evaluate the rational function lanczos_sum(x). For large
204 : x, the obvious algorithm risks overflow, so we instead
205 : rescale the denominator and numerator of the rational
206 : function by x**(1-LANCZOS_N) and treat this as a
207 : rational function in 1/x. This also reduces the error for
208 : larger x values. The choice of cutoff point (5.0 below) is
209 : somewhat arbitrary; in tests, smaller cutoff values than
210 : this resulted in lower accuracy. */
211 0 : if (x < 5.0) {
212 0 : for (i = LANCZOS_N; --i >= 0; ) {
213 0 : num = num * x + lanczos_num_coeffs[i];
214 0 : den = den * x + lanczos_den_coeffs[i];
215 : }
216 : }
217 : else {
218 0 : for (i = 0; i < LANCZOS_N; i++) {
219 0 : num = num / x + lanczos_num_coeffs[i];
220 0 : den = den / x + lanczos_den_coeffs[i];
221 : }
222 : }
223 0 : return num/den;
224 : }
225 :
226 : static double
227 0 : m_tgamma(double x)
228 : {
229 : double absx, r, y, z, sqrtpow;
230 :
231 : /* special cases */
232 0 : if (!Py_IS_FINITE(x)) {
233 0 : if (Py_IS_NAN(x) || x > 0.0)
234 0 : return x; /* tgamma(nan) = nan, tgamma(inf) = inf */
235 : else {
236 0 : errno = EDOM;
237 0 : return Py_NAN; /* tgamma(-inf) = nan, invalid */
238 : }
239 : }
240 0 : if (x == 0.0) {
241 0 : errno = EDOM;
242 : /* tgamma(+-0.0) = +-inf, divide-by-zero */
243 0 : return copysign(Py_HUGE_VAL, x);
244 : }
245 :
246 : /* integer arguments */
247 0 : if (x == floor(x)) {
248 0 : if (x < 0.0) {
249 0 : errno = EDOM; /* tgamma(n) = nan, invalid for */
250 0 : return Py_NAN; /* negative integers n */
251 : }
252 0 : if (x <= NGAMMA_INTEGRAL)
253 0 : return gamma_integral[(int)x - 1];
254 : }
255 0 : absx = fabs(x);
256 :
257 : /* tiny arguments: tgamma(x) ~ 1/x for x near 0 */
258 0 : if (absx < 1e-20) {
259 0 : r = 1.0/x;
260 0 : if (Py_IS_INFINITY(r))
261 0 : errno = ERANGE;
262 0 : return r;
263 : }
264 :
265 : /* large arguments: assuming IEEE 754 doubles, tgamma(x) overflows for
266 : x > 200, and underflows to +-0.0 for x < -200, not a negative
267 : integer. */
268 0 : if (absx > 200.0) {
269 0 : if (x < 0.0) {
270 0 : return 0.0/sinpi(x);
271 : }
272 : else {
273 0 : errno = ERANGE;
274 0 : return Py_HUGE_VAL;
275 : }
276 : }
277 :
278 0 : y = absx + lanczos_g_minus_half;
279 : /* compute error in sum */
280 0 : if (absx > lanczos_g_minus_half) {
281 : /* note: the correction can be foiled by an optimizing
282 : compiler that (incorrectly) thinks that an expression like
283 : a + b - a - b can be optimized to 0.0. This shouldn't
284 : happen in a standards-conforming compiler. */
285 0 : double q = y - absx;
286 0 : z = q - lanczos_g_minus_half;
287 : }
288 : else {
289 0 : double q = y - lanczos_g_minus_half;
290 0 : z = q - absx;
291 : }
292 0 : z = z * lanczos_g / y;
293 0 : if (x < 0.0) {
294 0 : r = -pi / sinpi(absx) / absx * exp(y) / lanczos_sum(absx);
295 0 : r -= z * r;
296 0 : if (absx < 140.0) {
297 0 : r /= pow(y, absx - 0.5);
298 : }
299 : else {
300 0 : sqrtpow = pow(y, absx / 2.0 - 0.25);
301 0 : r /= sqrtpow;
302 0 : r /= sqrtpow;
303 : }
304 : }
305 : else {
306 0 : r = lanczos_sum(absx) / exp(y);
307 0 : r += z * r;
308 0 : if (absx < 140.0) {
309 0 : r *= pow(y, absx - 0.5);
310 : }
311 : else {
312 0 : sqrtpow = pow(y, absx / 2.0 - 0.25);
313 0 : r *= sqrtpow;
314 0 : r *= sqrtpow;
315 : }
316 : }
317 0 : if (Py_IS_INFINITY(r))
318 0 : errno = ERANGE;
319 0 : return r;
320 : }
321 :
322 : /*
323 : lgamma: natural log of the absolute value of the Gamma function.
324 : For large arguments, Lanczos' formula works extremely well here.
325 : */
326 :
327 : static double
328 0 : m_lgamma(double x)
329 : {
330 : double r, absx;
331 :
332 : /* special cases */
333 0 : if (!Py_IS_FINITE(x)) {
334 0 : if (Py_IS_NAN(x))
335 0 : return x; /* lgamma(nan) = nan */
336 : else
337 0 : return Py_HUGE_VAL; /* lgamma(+-inf) = +inf */
338 : }
339 :
340 : /* integer arguments */
341 0 : if (x == floor(x) && x <= 2.0) {
342 0 : if (x <= 0.0) {
343 0 : errno = EDOM; /* lgamma(n) = inf, divide-by-zero for */
344 0 : return Py_HUGE_VAL; /* integers n <= 0 */
345 : }
346 : else {
347 0 : return 0.0; /* lgamma(1) = lgamma(2) = 0.0 */
348 : }
349 : }
350 :
351 0 : absx = fabs(x);
352 : /* tiny arguments: lgamma(x) ~ -log(fabs(x)) for small x */
353 0 : if (absx < 1e-20)
354 0 : return -log(absx);
355 :
356 : /* Lanczos' formula. We could save a fraction of a ulp in accuracy by
357 : having a second set of numerator coefficients for lanczos_sum that
358 : absorbed the exp(-lanczos_g) term, and throwing out the lanczos_g
359 : subtraction below; it's probably not worth it. */
360 0 : r = log(lanczos_sum(absx)) - lanczos_g;
361 0 : r += (absx - 0.5) * (log(absx + lanczos_g - 0.5) - 1);
362 0 : if (x < 0.0)
363 : /* Use reflection formula to get value for negative x. */
364 0 : r = logpi - log(fabs(sinpi(absx))) - log(absx) - r;
365 0 : if (Py_IS_INFINITY(r))
366 0 : errno = ERANGE;
367 0 : return r;
368 : }
369 :
370 : /*
371 : Implementations of the error function erf(x) and the complementary error
372 : function erfc(x).
373 :
374 : Method: following 'Numerical Recipes' by Flannery, Press et. al. (2nd ed.,
375 : Cambridge University Press), we use a series approximation for erf for
376 : small x, and a continued fraction approximation for erfc(x) for larger x;
377 : combined with the relations erf(-x) = -erf(x) and erfc(x) = 1.0 - erf(x),
378 : this gives us erf(x) and erfc(x) for all x.
379 :
380 : The series expansion used is:
381 :
382 : erf(x) = x*exp(-x*x)/sqrt(pi) * [
383 : 2/1 + 4/3 x**2 + 8/15 x**4 + 16/105 x**6 + ...]
384 :
385 : The coefficient of x**(2k-2) here is 4**k*factorial(k)/factorial(2*k).
386 : This series converges well for smallish x, but slowly for larger x.
387 :
388 : The continued fraction expansion used is:
389 :
390 : erfc(x) = x*exp(-x*x)/sqrt(pi) * [1/(0.5 + x**2 -) 0.5/(2.5 + x**2 - )
391 : 3.0/(4.5 + x**2 - ) 7.5/(6.5 + x**2 - ) ...]
392 :
393 : after the first term, the general term has the form:
394 :
395 : k*(k-0.5)/(2*k+0.5 + x**2 - ...).
396 :
397 : This expansion converges fast for larger x, but convergence becomes
398 : infinitely slow as x approaches 0.0. The (somewhat naive) continued
399 : fraction evaluation algorithm used below also risks overflow for large x;
400 : but for large x, erfc(x) == 0.0 to within machine precision. (For
401 : example, erfc(30.0) is approximately 2.56e-393).
402 :
403 : Parameters: use series expansion for abs(x) < ERF_SERIES_CUTOFF and
404 : continued fraction expansion for ERF_SERIES_CUTOFF <= abs(x) <
405 : ERFC_CONTFRAC_CUTOFF. ERFC_SERIES_TERMS and ERFC_CONTFRAC_TERMS are the
406 : numbers of terms to use for the relevant expansions. */
407 :
408 : #define ERF_SERIES_CUTOFF 1.5
409 : #define ERF_SERIES_TERMS 25
410 : #define ERFC_CONTFRAC_CUTOFF 30.0
411 : #define ERFC_CONTFRAC_TERMS 50
412 :
413 : /*
414 : Error function, via power series.
415 :
416 : Given a finite float x, return an approximation to erf(x).
417 : Converges reasonably fast for small x.
418 : */
419 :
420 : static double
421 0 : m_erf_series(double x)
422 : {
423 : double x2, acc, fk, result;
424 : int i, saved_errno;
425 :
426 0 : x2 = x * x;
427 0 : acc = 0.0;
428 0 : fk = (double)ERF_SERIES_TERMS + 0.5;
429 0 : for (i = 0; i < ERF_SERIES_TERMS; i++) {
430 0 : acc = 2.0 + x2 * acc / fk;
431 0 : fk -= 1.0;
432 : }
433 : /* Make sure the exp call doesn't affect errno;
434 : see m_erfc_contfrac for more. */
435 0 : saved_errno = errno;
436 0 : result = acc * x * exp(-x2) / sqrtpi;
437 0 : errno = saved_errno;
438 0 : return result;
439 : }
440 :
441 : /*
442 : Complementary error function, via continued fraction expansion.
443 :
444 : Given a positive float x, return an approximation to erfc(x). Converges
445 : reasonably fast for x large (say, x > 2.0), and should be safe from
446 : overflow if x and nterms are not too large. On an IEEE 754 machine, with x
447 : <= 30.0, we're safe up to nterms = 100. For x >= 30.0, erfc(x) is smaller
448 : than the smallest representable nonzero float. */
449 :
450 : static double
451 0 : m_erfc_contfrac(double x)
452 : {
453 : double x2, a, da, p, p_last, q, q_last, b, result;
454 : int i, saved_errno;
455 :
456 0 : if (x >= ERFC_CONTFRAC_CUTOFF)
457 0 : return 0.0;
458 :
459 0 : x2 = x*x;
460 0 : a = 0.0;
461 0 : da = 0.5;
462 0 : p = 1.0; p_last = 0.0;
463 0 : q = da + x2; q_last = 1.0;
464 0 : for (i = 0; i < ERFC_CONTFRAC_TERMS; i++) {
465 : double temp;
466 0 : a += da;
467 0 : da += 2.0;
468 0 : b = da + x2;
469 0 : temp = p; p = b*p - a*p_last; p_last = temp;
470 0 : temp = q; q = b*q - a*q_last; q_last = temp;
471 : }
472 : /* Issue #8986: On some platforms, exp sets errno on underflow to zero;
473 : save the current errno value so that we can restore it later. */
474 0 : saved_errno = errno;
475 0 : result = p / q * x * exp(-x2) / sqrtpi;
476 0 : errno = saved_errno;
477 0 : return result;
478 : }
479 :
480 : /* Error function erf(x), for general x */
481 :
482 : static double
483 0 : m_erf(double x)
484 : {
485 : double absx, cf;
486 :
487 0 : if (Py_IS_NAN(x))
488 0 : return x;
489 0 : absx = fabs(x);
490 0 : if (absx < ERF_SERIES_CUTOFF)
491 0 : return m_erf_series(x);
492 : else {
493 0 : cf = m_erfc_contfrac(absx);
494 0 : return x > 0.0 ? 1.0 - cf : cf - 1.0;
495 : }
496 : }
497 :
498 : /* Complementary error function erfc(x), for general x. */
499 :
500 : static double
501 0 : m_erfc(double x)
502 : {
503 : double absx, cf;
504 :
505 0 : if (Py_IS_NAN(x))
506 0 : return x;
507 0 : absx = fabs(x);
508 0 : if (absx < ERF_SERIES_CUTOFF)
509 0 : return 1.0 - m_erf_series(x);
510 : else {
511 0 : cf = m_erfc_contfrac(absx);
512 0 : return x > 0.0 ? cf : 2.0 - cf;
513 : }
514 : }
515 :
516 : /*
517 : wrapper for atan2 that deals directly with special cases before
518 : delegating to the platform libm for the remaining cases. This
519 : is necessary to get consistent behaviour across platforms.
520 : Windows, FreeBSD and alpha Tru64 are amongst platforms that don't
521 : always follow C99.
522 : */
523 :
524 : static double
525 0 : m_atan2(double y, double x)
526 : {
527 0 : if (Py_IS_NAN(x) || Py_IS_NAN(y))
528 0 : return Py_NAN;
529 0 : if (Py_IS_INFINITY(y)) {
530 0 : if (Py_IS_INFINITY(x)) {
531 0 : if (copysign(1., x) == 1.)
532 : /* atan2(+-inf, +inf) == +-pi/4 */
533 0 : return copysign(0.25*Py_MATH_PI, y);
534 : else
535 : /* atan2(+-inf, -inf) == +-pi*3/4 */
536 0 : return copysign(0.75*Py_MATH_PI, y);
537 : }
538 : /* atan2(+-inf, x) == +-pi/2 for finite x */
539 0 : return copysign(0.5*Py_MATH_PI, y);
540 : }
541 0 : if (Py_IS_INFINITY(x) || y == 0.) {
542 0 : if (copysign(1., x) == 1.)
543 : /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
544 0 : return copysign(0., y);
545 : else
546 : /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
547 0 : return copysign(Py_MATH_PI, y);
548 : }
549 0 : return atan2(y, x);
550 : }
551 :
552 : /*
553 : Various platforms (Solaris, OpenBSD) do nonstandard things for log(0),
554 : log(-ve), log(NaN). Here are wrappers for log and log10 that deal with
555 : special values directly, passing positive non-special values through to
556 : the system log/log10.
557 : */
558 :
559 : static double
560 0 : m_log(double x)
561 : {
562 0 : if (Py_IS_FINITE(x)) {
563 0 : if (x > 0.0)
564 0 : return log(x);
565 0 : errno = EDOM;
566 0 : if (x == 0.0)
567 0 : return -Py_HUGE_VAL; /* log(0) = -inf */
568 : else
569 0 : return Py_NAN; /* log(-ve) = nan */
570 : }
571 0 : else if (Py_IS_NAN(x))
572 0 : return x; /* log(nan) = nan */
573 0 : else if (x > 0.0)
574 0 : return x; /* log(inf) = inf */
575 : else {
576 0 : errno = EDOM;
577 0 : return Py_NAN; /* log(-inf) = nan */
578 : }
579 : }
580 :
581 : /*
582 : log2: log to base 2.
583 :
584 : Uses an algorithm that should:
585 :
586 : (a) produce exact results for powers of 2, and
587 : (b) give a monotonic log2 (for positive finite floats),
588 : assuming that the system log is monotonic.
589 : */
590 :
591 : static double
592 0 : m_log2(double x)
593 : {
594 0 : if (!Py_IS_FINITE(x)) {
595 0 : if (Py_IS_NAN(x))
596 0 : return x; /* log2(nan) = nan */
597 0 : else if (x > 0.0)
598 0 : return x; /* log2(+inf) = +inf */
599 : else {
600 0 : errno = EDOM;
601 0 : return Py_NAN; /* log2(-inf) = nan, invalid-operation */
602 : }
603 : }
604 :
605 0 : if (x > 0.0) {
606 : #ifdef HAVE_LOG2
607 0 : return log2(x);
608 : #else
609 : double m;
610 : int e;
611 : m = frexp(x, &e);
612 : /* We want log2(m * 2**e) == log(m) / log(2) + e. Care is needed when
613 : * x is just greater than 1.0: in that case e is 1, log(m) is negative,
614 : * and we get significant cancellation error from the addition of
615 : * log(m) / log(2) to e. The slight rewrite of the expression below
616 : * avoids this problem.
617 : */
618 : if (x >= 1.0) {
619 : return log(2.0 * m) / log(2.0) + (e - 1);
620 : }
621 : else {
622 : return log(m) / log(2.0) + e;
623 : }
624 : #endif
625 : }
626 0 : else if (x == 0.0) {
627 0 : errno = EDOM;
628 0 : return -Py_HUGE_VAL; /* log2(0) = -inf, divide-by-zero */
629 : }
630 : else {
631 0 : errno = EDOM;
632 0 : return Py_NAN; /* log2(-inf) = nan, invalid-operation */
633 : }
634 : }
635 :
636 : static double
637 0 : m_log10(double x)
638 : {
639 0 : if (Py_IS_FINITE(x)) {
640 0 : if (x > 0.0)
641 0 : return log10(x);
642 0 : errno = EDOM;
643 0 : if (x == 0.0)
644 0 : return -Py_HUGE_VAL; /* log10(0) = -inf */
645 : else
646 0 : return Py_NAN; /* log10(-ve) = nan */
647 : }
648 0 : else if (Py_IS_NAN(x))
649 0 : return x; /* log10(nan) = nan */
650 0 : else if (x > 0.0)
651 0 : return x; /* log10(inf) = inf */
652 : else {
653 0 : errno = EDOM;
654 0 : return Py_NAN; /* log10(-inf) = nan */
655 : }
656 : }
657 :
658 :
659 : /* Call is_error when errno != 0, and where x is the result libm
660 : * returned. is_error will usually set up an exception and return
661 : * true (1), but may return false (0) without setting up an exception.
662 : */
663 : static int
664 0 : is_error(double x)
665 : {
666 0 : int result = 1; /* presumption of guilt */
667 : assert(errno); /* non-zero errno is a precondition for calling */
668 0 : if (errno == EDOM)
669 0 : PyErr_SetString(PyExc_ValueError, "math domain error");
670 :
671 0 : else if (errno == ERANGE) {
672 : /* ANSI C generally requires libm functions to set ERANGE
673 : * on overflow, but also generally *allows* them to set
674 : * ERANGE on underflow too. There's no consistency about
675 : * the latter across platforms.
676 : * Alas, C99 never requires that errno be set.
677 : * Here we suppress the underflow errors (libm functions
678 : * should return a zero on underflow, and +- HUGE_VAL on
679 : * overflow, so testing the result for zero suffices to
680 : * distinguish the cases).
681 : *
682 : * On some platforms (Ubuntu/ia64) it seems that errno can be
683 : * set to ERANGE for subnormal results that do *not* underflow
684 : * to zero. So to be safe, we'll ignore ERANGE whenever the
685 : * function result is less than one in absolute value.
686 : */
687 0 : if (fabs(x) < 1.0)
688 0 : result = 0;
689 : else
690 0 : PyErr_SetString(PyExc_OverflowError,
691 : "math range error");
692 : }
693 : else
694 : /* Unexpected math error */
695 0 : PyErr_SetFromErrno(PyExc_ValueError);
696 0 : return result;
697 : }
698 :
699 : /*
700 : math_1 is used to wrap a libm function f that takes a double
701 : arguments and returns a double.
702 :
703 : The error reporting follows these rules, which are designed to do
704 : the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
705 : platforms.
706 :
707 : - a NaN result from non-NaN inputs causes ValueError to be raised
708 : - an infinite result from finite inputs causes OverflowError to be
709 : raised if can_overflow is 1, or raises ValueError if can_overflow
710 : is 0.
711 : - if the result is finite and errno == EDOM then ValueError is
712 : raised
713 : - if the result is finite and nonzero and errno == ERANGE then
714 : OverflowError is raised
715 :
716 : The last rule is used to catch overflow on platforms which follow
717 : C89 but for which HUGE_VAL is not an infinity.
718 :
719 : For the majority of one-argument functions these rules are enough
720 : to ensure that Python's functions behave as specified in 'Annex F'
721 : of the C99 standard, with the 'invalid' and 'divide-by-zero'
722 : floating-point exceptions mapping to Python's ValueError and the
723 : 'overflow' floating-point exception mapping to OverflowError.
724 : math_1 only works for functions that don't have singularities *and*
725 : the possibility of overflow; fortunately, that covers everything we
726 : care about right now.
727 : */
728 :
729 : static PyObject *
730 0 : math_1_to_whatever(PyObject *arg, double (*func) (double),
731 : PyObject *(*from_double_func) (double),
732 : int can_overflow)
733 : {
734 : double x, r;
735 0 : x = PyFloat_AsDouble(arg);
736 0 : if (x == -1.0 && PyErr_Occurred())
737 0 : return NULL;
738 0 : errno = 0;
739 : PyFPE_START_PROTECT("in math_1", return 0);
740 0 : r = (*func)(x);
741 : PyFPE_END_PROTECT(r);
742 0 : if (Py_IS_NAN(r) && !Py_IS_NAN(x)) {
743 0 : PyErr_SetString(PyExc_ValueError,
744 : "math domain error"); /* invalid arg */
745 0 : return NULL;
746 : }
747 0 : if (Py_IS_INFINITY(r) && Py_IS_FINITE(x)) {
748 0 : if (can_overflow)
749 0 : PyErr_SetString(PyExc_OverflowError,
750 : "math range error"); /* overflow */
751 : else
752 0 : PyErr_SetString(PyExc_ValueError,
753 : "math domain error"); /* singularity */
754 0 : return NULL;
755 : }
756 0 : if (Py_IS_FINITE(r) && errno && is_error(r))
757 : /* this branch unnecessary on most platforms */
758 0 : return NULL;
759 :
760 0 : return (*from_double_func)(r);
761 : }
762 :
763 : /* variant of math_1, to be used when the function being wrapped is known to
764 : set errno properly (that is, errno = EDOM for invalid or divide-by-zero,
765 : errno = ERANGE for overflow). */
766 :
767 : static PyObject *
768 0 : math_1a(PyObject *arg, double (*func) (double))
769 : {
770 : double x, r;
771 0 : x = PyFloat_AsDouble(arg);
772 0 : if (x == -1.0 && PyErr_Occurred())
773 0 : return NULL;
774 0 : errno = 0;
775 : PyFPE_START_PROTECT("in math_1a", return 0);
776 0 : r = (*func)(x);
777 : PyFPE_END_PROTECT(r);
778 0 : if (errno && is_error(r))
779 0 : return NULL;
780 0 : return PyFloat_FromDouble(r);
781 : }
782 :
783 : /*
784 : math_2 is used to wrap a libm function f that takes two double
785 : arguments and returns a double.
786 :
787 : The error reporting follows these rules, which are designed to do
788 : the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
789 : platforms.
790 :
791 : - a NaN result from non-NaN inputs causes ValueError to be raised
792 : - an infinite result from finite inputs causes OverflowError to be
793 : raised.
794 : - if the result is finite and errno == EDOM then ValueError is
795 : raised
796 : - if the result is finite and nonzero and errno == ERANGE then
797 : OverflowError is raised
798 :
799 : The last rule is used to catch overflow on platforms which follow
800 : C89 but for which HUGE_VAL is not an infinity.
801 :
802 : For most two-argument functions (copysign, fmod, hypot, atan2)
803 : these rules are enough to ensure that Python's functions behave as
804 : specified in 'Annex F' of the C99 standard, with the 'invalid' and
805 : 'divide-by-zero' floating-point exceptions mapping to Python's
806 : ValueError and the 'overflow' floating-point exception mapping to
807 : OverflowError.
808 : */
809 :
810 : static PyObject *
811 0 : math_1(PyObject *arg, double (*func) (double), int can_overflow)
812 : {
813 0 : return math_1_to_whatever(arg, func, PyFloat_FromDouble, can_overflow);
814 : }
815 :
816 : static PyObject *
817 0 : math_1_to_int(PyObject *arg, double (*func) (double), int can_overflow)
818 : {
819 0 : return math_1_to_whatever(arg, func, PyLong_FromDouble, can_overflow);
820 : }
821 :
822 : static PyObject *
823 0 : math_2(PyObject *args, double (*func) (double, double), char *funcname)
824 : {
825 : PyObject *ox, *oy;
826 : double x, y, r;
827 0 : if (! PyArg_UnpackTuple(args, funcname, 2, 2, &ox, &oy))
828 0 : return NULL;
829 0 : x = PyFloat_AsDouble(ox);
830 0 : y = PyFloat_AsDouble(oy);
831 0 : if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
832 0 : return NULL;
833 0 : errno = 0;
834 : PyFPE_START_PROTECT("in math_2", return 0);
835 0 : r = (*func)(x, y);
836 : PyFPE_END_PROTECT(r);
837 0 : if (Py_IS_NAN(r)) {
838 0 : if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
839 0 : errno = EDOM;
840 : else
841 0 : errno = 0;
842 : }
843 0 : else if (Py_IS_INFINITY(r)) {
844 0 : if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
845 0 : errno = ERANGE;
846 : else
847 0 : errno = 0;
848 : }
849 0 : if (errno && is_error(r))
850 0 : return NULL;
851 : else
852 0 : return PyFloat_FromDouble(r);
853 : }
854 :
855 : #define FUNC1(funcname, func, can_overflow, docstring) \
856 : static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
857 : return math_1(args, func, can_overflow); \
858 : }\
859 : PyDoc_STRVAR(math_##funcname##_doc, docstring);
860 :
861 : #define FUNC1A(funcname, func, docstring) \
862 : static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
863 : return math_1a(args, func); \
864 : }\
865 : PyDoc_STRVAR(math_##funcname##_doc, docstring);
866 :
867 : #define FUNC2(funcname, func, docstring) \
868 : static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
869 : return math_2(args, func, #funcname); \
870 : }\
871 : PyDoc_STRVAR(math_##funcname##_doc, docstring);
872 :
873 0 : FUNC1(acos, acos, 0,
874 0 : "acos(x)\n\nReturn the arc cosine (measured in radians) of x.")
875 0 : FUNC1(acosh, m_acosh, 0,
876 0 : "acosh(x)\n\nReturn the hyperbolic arc cosine (measured in radians) of x.")
877 0 : FUNC1(asin, asin, 0,
878 0 : "asin(x)\n\nReturn the arc sine (measured in radians) of x.")
879 0 : FUNC1(asinh, m_asinh, 0,
880 0 : "asinh(x)\n\nReturn the hyperbolic arc sine (measured in radians) of x.")
881 0 : FUNC1(atan, atan, 0,
882 0 : "atan(x)\n\nReturn the arc tangent (measured in radians) of x.")
883 0 : FUNC2(atan2, m_atan2,
884 : "atan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\n"
885 0 : "Unlike atan(y/x), the signs of both x and y are considered.")
886 0 : FUNC1(atanh, m_atanh, 0,
887 0 : "atanh(x)\n\nReturn the hyperbolic arc tangent (measured in radians) of x.")
888 :
889 0 : static PyObject * math_ceil(PyObject *self, PyObject *number) {
890 : _Py_IDENTIFIER(__ceil__);
891 : PyObject *method, *result;
892 :
893 0 : method = _PyObject_LookupSpecial(number, &PyId___ceil__);
894 0 : if (method == NULL) {
895 0 : if (PyErr_Occurred())
896 0 : return NULL;
897 0 : return math_1_to_int(number, ceil, 0);
898 : }
899 0 : result = PyObject_CallFunctionObjArgs(method, NULL);
900 0 : Py_DECREF(method);
901 0 : return result;
902 : }
903 :
904 : PyDoc_STRVAR(math_ceil_doc,
905 : "ceil(x)\n\nReturn the ceiling of x as an int.\n"
906 : "This is the smallest integral value >= x.");
907 :
908 0 : FUNC2(copysign, copysign,
909 0 : "copysign(x, y)\n\nReturn x with the sign of y.")
910 0 : FUNC1(cos, cos, 0,
911 0 : "cos(x)\n\nReturn the cosine of x (measured in radians).")
912 0 : FUNC1(cosh, cosh, 1,
913 0 : "cosh(x)\n\nReturn the hyperbolic cosine of x.")
914 0 : FUNC1A(erf, m_erf,
915 0 : "erf(x)\n\nError function at x.")
916 0 : FUNC1A(erfc, m_erfc,
917 0 : "erfc(x)\n\nComplementary error function at x.")
918 0 : FUNC1(exp, exp, 1,
919 0 : "exp(x)\n\nReturn e raised to the power of x.")
920 0 : FUNC1(expm1, m_expm1, 1,
921 : "expm1(x)\n\nReturn exp(x)-1.\n"
922 : "This function avoids the loss of precision involved in the direct "
923 0 : "evaluation of exp(x)-1 for small x.")
924 0 : FUNC1(fabs, fabs, 0,
925 0 : "fabs(x)\n\nReturn the absolute value of the float x.")
926 :
927 0 : static PyObject * math_floor(PyObject *self, PyObject *number) {
928 : _Py_IDENTIFIER(__floor__);
929 : PyObject *method, *result;
930 :
931 0 : method = _PyObject_LookupSpecial(number, &PyId___floor__);
932 0 : if (method == NULL) {
933 0 : if (PyErr_Occurred())
934 0 : return NULL;
935 0 : return math_1_to_int(number, floor, 0);
936 : }
937 0 : result = PyObject_CallFunctionObjArgs(method, NULL);
938 0 : Py_DECREF(method);
939 0 : return result;
940 : }
941 :
942 : PyDoc_STRVAR(math_floor_doc,
943 : "floor(x)\n\nReturn the floor of x as an int.\n"
944 : "This is the largest integral value <= x.");
945 :
946 0 : FUNC1A(gamma, m_tgamma,
947 0 : "gamma(x)\n\nGamma function at x.")
948 0 : FUNC1A(lgamma, m_lgamma,
949 0 : "lgamma(x)\n\nNatural logarithm of absolute value of Gamma function at x.")
950 0 : FUNC1(log1p, m_log1p, 0,
951 : "log1p(x)\n\nReturn the natural logarithm of 1+x (base e).\n"
952 0 : "The result is computed in a way which is accurate for x near zero.")
953 0 : FUNC1(sin, sin, 0,
954 0 : "sin(x)\n\nReturn the sine of x (measured in radians).")
955 0 : FUNC1(sinh, sinh, 1,
956 0 : "sinh(x)\n\nReturn the hyperbolic sine of x.")
957 0 : FUNC1(sqrt, sqrt, 0,
958 0 : "sqrt(x)\n\nReturn the square root of x.")
959 0 : FUNC1(tan, tan, 0,
960 0 : "tan(x)\n\nReturn the tangent of x (measured in radians).")
961 0 : FUNC1(tanh, tanh, 0,
962 0 : "tanh(x)\n\nReturn the hyperbolic tangent of x.")
963 :
964 : /* Precision summation function as msum() by Raymond Hettinger in
965 : <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393090>,
966 : enhanced with the exact partials sum and roundoff from Mark
967 : Dickinson's post at <http://bugs.python.org/file10357/msum4.py>.
968 : See those links for more details, proofs and other references.
969 :
970 : Note 1: IEEE 754R floating point semantics are assumed,
971 : but the current implementation does not re-establish special
972 : value semantics across iterations (i.e. handling -Inf + Inf).
973 :
974 : Note 2: No provision is made for intermediate overflow handling;
975 : therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while
976 : sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
977 : overflow of the first partial sum.
978 :
979 : Note 3: The intermediate values lo, yr, and hi are declared volatile so
980 : aggressive compilers won't algebraically reduce lo to always be exactly 0.0.
981 : Also, the volatile declaration forces the values to be stored in memory as
982 : regular doubles instead of extended long precision (80-bit) values. This
983 : prevents double rounding because any addition or subtraction of two doubles
984 : can be resolved exactly into double-sized hi and lo values. As long as the
985 : hi value gets forced into a double before yr and lo are computed, the extra
986 : bits in downstream extended precision operations (x87 for example) will be
987 : exactly zero and therefore can be losslessly stored back into a double,
988 : thereby preventing double rounding.
989 :
990 : Note 4: A similar implementation is in Modules/cmathmodule.c.
991 : Be sure to update both when making changes.
992 :
993 : Note 5: The signature of math.fsum() differs from __builtin__.sum()
994 : because the start argument doesn't make sense in the context of
995 : accurate summation. Since the partials table is collapsed before
996 : returning a result, sum(seq2, start=sum(seq1)) may not equal the
997 : accurate result returned by sum(itertools.chain(seq1, seq2)).
998 : */
999 :
1000 : #define NUM_PARTIALS 32 /* initial partials array size, on stack */
1001 :
1002 : /* Extend the partials array p[] by doubling its size. */
1003 : static int /* non-zero on error */
1004 0 : _fsum_realloc(double **p_ptr, Py_ssize_t n,
1005 : double *ps, Py_ssize_t *m_ptr)
1006 : {
1007 0 : void *v = NULL;
1008 0 : Py_ssize_t m = *m_ptr;
1009 :
1010 0 : m += m; /* double */
1011 0 : if (n < m && m < (PY_SSIZE_T_MAX / sizeof(double))) {
1012 0 : double *p = *p_ptr;
1013 0 : if (p == ps) {
1014 0 : v = PyMem_Malloc(sizeof(double) * m);
1015 0 : if (v != NULL)
1016 0 : memcpy(v, ps, sizeof(double) * n);
1017 : }
1018 : else
1019 0 : v = PyMem_Realloc(p, sizeof(double) * m);
1020 : }
1021 0 : if (v == NULL) { /* size overflow or no memory */
1022 0 : PyErr_SetString(PyExc_MemoryError, "math.fsum partials");
1023 0 : return 1;
1024 : }
1025 0 : *p_ptr = (double*) v;
1026 0 : *m_ptr = m;
1027 0 : return 0;
1028 : }
1029 :
1030 : /* Full precision summation of a sequence of floats.
1031 :
1032 : def msum(iterable):
1033 : partials = [] # sorted, non-overlapping partial sums
1034 : for x in iterable:
1035 : i = 0
1036 : for y in partials:
1037 : if abs(x) < abs(y):
1038 : x, y = y, x
1039 : hi = x + y
1040 : lo = y - (hi - x)
1041 : if lo:
1042 : partials[i] = lo
1043 : i += 1
1044 : x = hi
1045 : partials[i:] = [x]
1046 : return sum_exact(partials)
1047 :
1048 : Rounded x+y stored in hi with the roundoff stored in lo. Together hi+lo
1049 : are exactly equal to x+y. The inner loop applies hi/lo summation to each
1050 : partial so that the list of partial sums remains exact.
1051 :
1052 : Sum_exact() adds the partial sums exactly and correctly rounds the final
1053 : result (using the round-half-to-even rule). The items in partials remain
1054 : non-zero, non-special, non-overlapping and strictly increasing in
1055 : magnitude, but possibly not all having the same sign.
1056 :
1057 : Depends on IEEE 754 arithmetic guarantees and half-even rounding.
1058 : */
1059 :
1060 : static PyObject*
1061 0 : math_fsum(PyObject *self, PyObject *seq)
1062 : {
1063 0 : PyObject *item, *iter, *sum = NULL;
1064 0 : Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;
1065 0 : double x, y, t, ps[NUM_PARTIALS], *p = ps;
1066 0 : double xsave, special_sum = 0.0, inf_sum = 0.0;
1067 : volatile double hi, yr, lo;
1068 :
1069 0 : iter = PyObject_GetIter(seq);
1070 0 : if (iter == NULL)
1071 0 : return NULL;
1072 :
1073 : PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)
1074 :
1075 : for(;;) { /* for x in iterable */
1076 : assert(0 <= n && n <= m);
1077 : assert((m == NUM_PARTIALS && p == ps) ||
1078 : (m > NUM_PARTIALS && p != NULL));
1079 :
1080 0 : item = PyIter_Next(iter);
1081 0 : if (item == NULL) {
1082 0 : if (PyErr_Occurred())
1083 0 : goto _fsum_error;
1084 0 : break;
1085 : }
1086 0 : x = PyFloat_AsDouble(item);
1087 0 : Py_DECREF(item);
1088 0 : if (PyErr_Occurred())
1089 0 : goto _fsum_error;
1090 :
1091 0 : xsave = x;
1092 0 : for (i = j = 0; j < n; j++) { /* for y in partials */
1093 0 : y = p[j];
1094 0 : if (fabs(x) < fabs(y)) {
1095 0 : t = x; x = y; y = t;
1096 : }
1097 0 : hi = x + y;
1098 0 : yr = hi - x;
1099 0 : lo = y - yr;
1100 0 : if (lo != 0.0)
1101 0 : p[i++] = lo;
1102 0 : x = hi;
1103 : }
1104 :
1105 0 : n = i; /* ps[i:] = [x] */
1106 0 : if (x != 0.0) {
1107 0 : if (! Py_IS_FINITE(x)) {
1108 : /* a nonfinite x could arise either as
1109 : a result of intermediate overflow, or
1110 : as a result of a nan or inf in the
1111 : summands */
1112 0 : if (Py_IS_FINITE(xsave)) {
1113 0 : PyErr_SetString(PyExc_OverflowError,
1114 : "intermediate overflow in fsum");
1115 0 : goto _fsum_error;
1116 : }
1117 0 : if (Py_IS_INFINITY(xsave))
1118 0 : inf_sum += xsave;
1119 0 : special_sum += xsave;
1120 : /* reset partials */
1121 0 : n = 0;
1122 : }
1123 0 : else if (n >= m && _fsum_realloc(&p, n, ps, &m))
1124 : goto _fsum_error;
1125 : else
1126 0 : p[n++] = x;
1127 : }
1128 0 : }
1129 :
1130 0 : if (special_sum != 0.0) {
1131 0 : if (Py_IS_NAN(inf_sum))
1132 0 : PyErr_SetString(PyExc_ValueError,
1133 : "-inf + inf in fsum");
1134 : else
1135 0 : sum = PyFloat_FromDouble(special_sum);
1136 0 : goto _fsum_error;
1137 : }
1138 :
1139 0 : hi = 0.0;
1140 0 : if (n > 0) {
1141 0 : hi = p[--n];
1142 : /* sum_exact(ps, hi) from the top, stop when the sum becomes
1143 : inexact. */
1144 0 : while (n > 0) {
1145 0 : x = hi;
1146 0 : y = p[--n];
1147 : assert(fabs(y) < fabs(x));
1148 0 : hi = x + y;
1149 0 : yr = hi - x;
1150 0 : lo = y - yr;
1151 0 : if (lo != 0.0)
1152 0 : break;
1153 : }
1154 : /* Make half-even rounding work across multiple partials.
1155 : Needed so that sum([1e-16, 1, 1e16]) will round-up the last
1156 : digit to two instead of down to zero (the 1e-16 makes the 1
1157 : slightly closer to two). With a potential 1 ULP rounding
1158 : error fixed-up, math.fsum() can guarantee commutativity. */
1159 0 : if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
1160 0 : (lo > 0.0 && p[n-1] > 0.0))) {
1161 0 : y = lo * 2.0;
1162 0 : x = hi + y;
1163 0 : yr = x - hi;
1164 0 : if (y == yr)
1165 0 : hi = x;
1166 : }
1167 : }
1168 0 : sum = PyFloat_FromDouble(hi);
1169 :
1170 : _fsum_error:
1171 : PyFPE_END_PROTECT(hi)
1172 0 : Py_DECREF(iter);
1173 0 : if (p != ps)
1174 0 : PyMem_Free(p);
1175 0 : return sum;
1176 : }
1177 :
1178 : #undef NUM_PARTIALS
1179 :
1180 : PyDoc_STRVAR(math_fsum_doc,
1181 : "fsum(iterable)\n\n\
1182 : Return an accurate floating point sum of values in the iterable.\n\
1183 : Assumes IEEE-754 floating point arithmetic.");
1184 :
1185 : /* Return the smallest integer k such that n < 2**k, or 0 if n == 0.
1186 : * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type -
1187 : * count_leading_zero_bits(x)
1188 : */
1189 :
1190 : /* XXX: This routine does more or less the same thing as
1191 : * bits_in_digit() in Objects/longobject.c. Someday it would be nice to
1192 : * consolidate them. On BSD, there's a library function called fls()
1193 : * that we could use, and GCC provides __builtin_clz().
1194 : */
1195 :
1196 : static unsigned long
1197 0 : bit_length(unsigned long n)
1198 : {
1199 0 : unsigned long len = 0;
1200 0 : while (n != 0) {
1201 0 : ++len;
1202 0 : n >>= 1;
1203 : }
1204 0 : return len;
1205 : }
1206 :
1207 : static unsigned long
1208 0 : count_set_bits(unsigned long n)
1209 : {
1210 0 : unsigned long count = 0;
1211 0 : while (n != 0) {
1212 0 : ++count;
1213 0 : n &= n - 1; /* clear least significant bit */
1214 : }
1215 0 : return count;
1216 : }
1217 :
1218 : /* Divide-and-conquer factorial algorithm
1219 : *
1220 : * Based on the formula and psuedo-code provided at:
1221 : * http://www.luschny.de/math/factorial/binarysplitfact.html
1222 : *
1223 : * Faster algorithms exist, but they're more complicated and depend on
1224 : * a fast prime factorization algorithm.
1225 : *
1226 : * Notes on the algorithm
1227 : * ----------------------
1228 : *
1229 : * factorial(n) is written in the form 2**k * m, with m odd. k and m are
1230 : * computed separately, and then combined using a left shift.
1231 : *
1232 : * The function factorial_odd_part computes the odd part m (i.e., the greatest
1233 : * odd divisor) of factorial(n), using the formula:
1234 : *
1235 : * factorial_odd_part(n) =
1236 : *
1237 : * product_{i >= 0} product_{0 < j <= n / 2**i, j odd} j
1238 : *
1239 : * Example: factorial_odd_part(20) =
1240 : *
1241 : * (1) *
1242 : * (1) *
1243 : * (1 * 3 * 5) *
1244 : * (1 * 3 * 5 * 7 * 9)
1245 : * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19)
1246 : *
1247 : * Here i goes from large to small: the first term corresponds to i=4 (any
1248 : * larger i gives an empty product), and the last term corresponds to i=0.
1249 : * Each term can be computed from the last by multiplying by the extra odd
1250 : * numbers required: e.g., to get from the penultimate term to the last one,
1251 : * we multiply by (11 * 13 * 15 * 17 * 19).
1252 : *
1253 : * To see a hint of why this formula works, here are the same numbers as above
1254 : * but with the even parts (i.e., the appropriate powers of 2) included. For
1255 : * each subterm in the product for i, we multiply that subterm by 2**i:
1256 : *
1257 : * factorial(20) =
1258 : *
1259 : * (16) *
1260 : * (8) *
1261 : * (4 * 12 * 20) *
1262 : * (2 * 6 * 10 * 14 * 18) *
1263 : * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19)
1264 : *
1265 : * The factorial_partial_product function computes the product of all odd j in
1266 : * range(start, stop) for given start and stop. It's used to compute the
1267 : * partial products like (11 * 13 * 15 * 17 * 19) in the example above. It
1268 : * operates recursively, repeatedly splitting the range into two roughly equal
1269 : * pieces until the subranges are small enough to be computed using only C
1270 : * integer arithmetic.
1271 : *
1272 : * The two-valuation k (i.e., the exponent of the largest power of 2 dividing
1273 : * the factorial) is computed independently in the main math_factorial
1274 : * function. By standard results, its value is:
1275 : *
1276 : * two_valuation = n//2 + n//4 + n//8 + ....
1277 : *
1278 : * It can be shown (e.g., by complete induction on n) that two_valuation is
1279 : * equal to n - count_set_bits(n), where count_set_bits(n) gives the number of
1280 : * '1'-bits in the binary expansion of n.
1281 : */
1282 :
1283 : /* factorial_partial_product: Compute product(range(start, stop, 2)) using
1284 : * divide and conquer. Assumes start and stop are odd and stop > start.
1285 : * max_bits must be >= bit_length(stop - 2). */
1286 :
1287 : static PyObject *
1288 0 : factorial_partial_product(unsigned long start, unsigned long stop,
1289 : unsigned long max_bits)
1290 : {
1291 : unsigned long midpoint, num_operands;
1292 0 : PyObject *left = NULL, *right = NULL, *result = NULL;
1293 :
1294 : /* If the return value will fit an unsigned long, then we can
1295 : * multiply in a tight, fast loop where each multiply is O(1).
1296 : * Compute an upper bound on the number of bits required to store
1297 : * the answer.
1298 : *
1299 : * Storing some integer z requires floor(lg(z))+1 bits, which is
1300 : * conveniently the value returned by bit_length(z). The
1301 : * product x*y will require at most
1302 : * bit_length(x) + bit_length(y) bits to store, based
1303 : * on the idea that lg product = lg x + lg y.
1304 : *
1305 : * We know that stop - 2 is the largest number to be multiplied. From
1306 : * there, we have: bit_length(answer) <= num_operands *
1307 : * bit_length(stop - 2)
1308 : */
1309 :
1310 0 : num_operands = (stop - start) / 2;
1311 : /* The "num_operands <= 8 * SIZEOF_LONG" check guards against the
1312 : * unlikely case of an overflow in num_operands * max_bits. */
1313 0 : if (num_operands <= 8 * SIZEOF_LONG &&
1314 0 : num_operands * max_bits <= 8 * SIZEOF_LONG) {
1315 : unsigned long j, total;
1316 0 : for (total = start, j = start + 2; j < stop; j += 2)
1317 0 : total *= j;
1318 0 : return PyLong_FromUnsignedLong(total);
1319 : }
1320 :
1321 : /* find midpoint of range(start, stop), rounded up to next odd number. */
1322 0 : midpoint = (start + num_operands) | 1;
1323 0 : left = factorial_partial_product(start, midpoint,
1324 : bit_length(midpoint - 2));
1325 0 : if (left == NULL)
1326 0 : goto error;
1327 0 : right = factorial_partial_product(midpoint, stop, max_bits);
1328 0 : if (right == NULL)
1329 0 : goto error;
1330 0 : result = PyNumber_Multiply(left, right);
1331 :
1332 : error:
1333 0 : Py_XDECREF(left);
1334 0 : Py_XDECREF(right);
1335 0 : return result;
1336 : }
1337 :
1338 : /* factorial_odd_part: compute the odd part of factorial(n). */
1339 :
1340 : static PyObject *
1341 0 : factorial_odd_part(unsigned long n)
1342 : {
1343 : long i;
1344 : unsigned long v, lower, upper;
1345 : PyObject *partial, *tmp, *inner, *outer;
1346 :
1347 0 : inner = PyLong_FromLong(1);
1348 0 : if (inner == NULL)
1349 0 : return NULL;
1350 0 : outer = inner;
1351 0 : Py_INCREF(outer);
1352 :
1353 0 : upper = 3;
1354 0 : for (i = bit_length(n) - 2; i >= 0; i--) {
1355 0 : v = n >> i;
1356 0 : if (v <= 2)
1357 0 : continue;
1358 0 : lower = upper;
1359 : /* (v + 1) | 1 = least odd integer strictly larger than n / 2**i */
1360 0 : upper = (v + 1) | 1;
1361 : /* Here inner is the product of all odd integers j in the range (0,
1362 : n/2**(i+1)]. The factorial_partial_product call below gives the
1363 : product of all odd integers j in the range (n/2**(i+1), n/2**i]. */
1364 0 : partial = factorial_partial_product(lower, upper, bit_length(upper-2));
1365 : /* inner *= partial */
1366 0 : if (partial == NULL)
1367 0 : goto error;
1368 0 : tmp = PyNumber_Multiply(inner, partial);
1369 0 : Py_DECREF(partial);
1370 0 : if (tmp == NULL)
1371 0 : goto error;
1372 0 : Py_DECREF(inner);
1373 0 : inner = tmp;
1374 : /* Now inner is the product of all odd integers j in the range (0,
1375 : n/2**i], giving the inner product in the formula above. */
1376 :
1377 : /* outer *= inner; */
1378 0 : tmp = PyNumber_Multiply(outer, inner);
1379 0 : if (tmp == NULL)
1380 0 : goto error;
1381 0 : Py_DECREF(outer);
1382 0 : outer = tmp;
1383 : }
1384 :
1385 0 : goto done;
1386 :
1387 : error:
1388 0 : Py_DECREF(outer);
1389 : done:
1390 0 : Py_DECREF(inner);
1391 0 : return outer;
1392 : }
1393 :
1394 : /* Lookup table for small factorial values */
1395 :
1396 : static const unsigned long SmallFactorials[] = {
1397 : 1, 1, 2, 6, 24, 120, 720, 5040, 40320,
1398 : 362880, 3628800, 39916800, 479001600,
1399 : #if SIZEOF_LONG >= 8
1400 : 6227020800, 87178291200, 1307674368000,
1401 : 20922789888000, 355687428096000, 6402373705728000,
1402 : 121645100408832000, 2432902008176640000
1403 : #endif
1404 : };
1405 :
1406 : static PyObject *
1407 0 : math_factorial(PyObject *self, PyObject *arg)
1408 : {
1409 : long x;
1410 : PyObject *result, *odd_part, *two_valuation;
1411 :
1412 0 : if (PyFloat_Check(arg)) {
1413 : PyObject *lx;
1414 0 : double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);
1415 0 : if (!(Py_IS_FINITE(dx) && dx == floor(dx))) {
1416 0 : PyErr_SetString(PyExc_ValueError,
1417 : "factorial() only accepts integral values");
1418 0 : return NULL;
1419 : }
1420 0 : lx = PyLong_FromDouble(dx);
1421 0 : if (lx == NULL)
1422 0 : return NULL;
1423 0 : x = PyLong_AsLong(lx);
1424 0 : Py_DECREF(lx);
1425 : }
1426 : else
1427 0 : x = PyLong_AsLong(arg);
1428 :
1429 0 : if (x == -1 && PyErr_Occurred())
1430 0 : return NULL;
1431 0 : if (x < 0) {
1432 0 : PyErr_SetString(PyExc_ValueError,
1433 : "factorial() not defined for negative values");
1434 0 : return NULL;
1435 : }
1436 :
1437 : /* use lookup table if x is small */
1438 0 : if (x < (long)Py_ARRAY_LENGTH(SmallFactorials))
1439 0 : return PyLong_FromUnsignedLong(SmallFactorials[x]);
1440 :
1441 : /* else express in the form odd_part * 2**two_valuation, and compute as
1442 : odd_part << two_valuation. */
1443 0 : odd_part = factorial_odd_part(x);
1444 0 : if (odd_part == NULL)
1445 0 : return NULL;
1446 0 : two_valuation = PyLong_FromLong(x - count_set_bits(x));
1447 0 : if (two_valuation == NULL) {
1448 0 : Py_DECREF(odd_part);
1449 0 : return NULL;
1450 : }
1451 0 : result = PyNumber_Lshift(odd_part, two_valuation);
1452 0 : Py_DECREF(two_valuation);
1453 0 : Py_DECREF(odd_part);
1454 0 : return result;
1455 : }
1456 :
1457 : PyDoc_STRVAR(math_factorial_doc,
1458 : "factorial(x) -> Integral\n"
1459 : "\n"
1460 : "Find x!. Raise a ValueError if x is negative or non-integral.");
1461 :
1462 : static PyObject *
1463 0 : math_trunc(PyObject *self, PyObject *number)
1464 : {
1465 : _Py_IDENTIFIER(__trunc__);
1466 : PyObject *trunc, *result;
1467 :
1468 0 : if (Py_TYPE(number)->tp_dict == NULL) {
1469 0 : if (PyType_Ready(Py_TYPE(number)) < 0)
1470 0 : return NULL;
1471 : }
1472 :
1473 0 : trunc = _PyObject_LookupSpecial(number, &PyId___trunc__);
1474 0 : if (trunc == NULL) {
1475 0 : if (!PyErr_Occurred())
1476 0 : PyErr_Format(PyExc_TypeError,
1477 : "type %.100s doesn't define __trunc__ method",
1478 0 : Py_TYPE(number)->tp_name);
1479 0 : return NULL;
1480 : }
1481 0 : result = PyObject_CallFunctionObjArgs(trunc, NULL);
1482 0 : Py_DECREF(trunc);
1483 0 : return result;
1484 : }
1485 :
1486 : PyDoc_STRVAR(math_trunc_doc,
1487 : "trunc(x:Real) -> Integral\n"
1488 : "\n"
1489 : "Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");
1490 :
1491 : static PyObject *
1492 0 : math_frexp(PyObject *self, PyObject *arg)
1493 : {
1494 : int i;
1495 0 : double x = PyFloat_AsDouble(arg);
1496 0 : if (x == -1.0 && PyErr_Occurred())
1497 0 : return NULL;
1498 : /* deal with special cases directly, to sidestep platform
1499 : differences */
1500 0 : if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
1501 0 : i = 0;
1502 : }
1503 : else {
1504 : PyFPE_START_PROTECT("in math_frexp", return 0);
1505 0 : x = frexp(x, &i);
1506 : PyFPE_END_PROTECT(x);
1507 : }
1508 0 : return Py_BuildValue("(di)", x, i);
1509 : }
1510 :
1511 : PyDoc_STRVAR(math_frexp_doc,
1512 : "frexp(x)\n"
1513 : "\n"
1514 : "Return the mantissa and exponent of x, as pair (m, e).\n"
1515 : "m is a float and e is an int, such that x = m * 2.**e.\n"
1516 : "If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.");
1517 :
1518 : static PyObject *
1519 0 : math_ldexp(PyObject *self, PyObject *args)
1520 : {
1521 : double x, r;
1522 : PyObject *oexp;
1523 : long exp;
1524 : int overflow;
1525 0 : if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp))
1526 0 : return NULL;
1527 :
1528 0 : if (PyLong_Check(oexp)) {
1529 : /* on overflow, replace exponent with either LONG_MAX
1530 : or LONG_MIN, depending on the sign. */
1531 0 : exp = PyLong_AsLongAndOverflow(oexp, &overflow);
1532 0 : if (exp == -1 && PyErr_Occurred())
1533 0 : return NULL;
1534 0 : if (overflow)
1535 0 : exp = overflow < 0 ? LONG_MIN : LONG_MAX;
1536 : }
1537 : else {
1538 0 : PyErr_SetString(PyExc_TypeError,
1539 : "Expected an int or long as second argument "
1540 : "to ldexp.");
1541 0 : return NULL;
1542 : }
1543 :
1544 0 : if (x == 0. || !Py_IS_FINITE(x)) {
1545 : /* NaNs, zeros and infinities are returned unchanged */
1546 0 : r = x;
1547 0 : errno = 0;
1548 : } else if (exp > INT_MAX) {
1549 : /* overflow */
1550 : r = copysign(Py_HUGE_VAL, x);
1551 : errno = ERANGE;
1552 : } else if (exp < INT_MIN) {
1553 : /* underflow to +-0 */
1554 : r = copysign(0., x);
1555 : errno = 0;
1556 : } else {
1557 0 : errno = 0;
1558 : PyFPE_START_PROTECT("in math_ldexp", return 0);
1559 0 : r = ldexp(x, (int)exp);
1560 : PyFPE_END_PROTECT(r);
1561 0 : if (Py_IS_INFINITY(r))
1562 0 : errno = ERANGE;
1563 : }
1564 :
1565 0 : if (errno && is_error(r))
1566 0 : return NULL;
1567 0 : return PyFloat_FromDouble(r);
1568 : }
1569 :
1570 : PyDoc_STRVAR(math_ldexp_doc,
1571 : "ldexp(x, i)\n\n\
1572 : Return x * (2**i).");
1573 :
1574 : static PyObject *
1575 0 : math_modf(PyObject *self, PyObject *arg)
1576 : {
1577 0 : double y, x = PyFloat_AsDouble(arg);
1578 0 : if (x == -1.0 && PyErr_Occurred())
1579 0 : return NULL;
1580 : /* some platforms don't do the right thing for NaNs and
1581 : infinities, so we take care of special cases directly. */
1582 0 : if (!Py_IS_FINITE(x)) {
1583 0 : if (Py_IS_INFINITY(x))
1584 0 : return Py_BuildValue("(dd)", copysign(0., x), x);
1585 0 : else if (Py_IS_NAN(x))
1586 0 : return Py_BuildValue("(dd)", x, x);
1587 : }
1588 :
1589 0 : errno = 0;
1590 : PyFPE_START_PROTECT("in math_modf", return 0);
1591 0 : x = modf(x, &y);
1592 : PyFPE_END_PROTECT(x);
1593 0 : return Py_BuildValue("(dd)", x, y);
1594 : }
1595 :
1596 : PyDoc_STRVAR(math_modf_doc,
1597 : "modf(x)\n"
1598 : "\n"
1599 : "Return the fractional and integer parts of x. Both results carry the sign\n"
1600 : "of x and are floats.");
1601 :
1602 : /* A decent logarithm is easy to compute even for huge longs, but libm can't
1603 : do that by itself -- loghelper can. func is log or log10, and name is
1604 : "log" or "log10". Note that overflow of the result isn't possible: a long
1605 : can contain no more than INT_MAX * SHIFT bits, so has value certainly less
1606 : than 2**(2**64 * 2**16) == 2**2**80, and log2 of that is 2**80, which is
1607 : small enough to fit in an IEEE single. log and log10 are even smaller.
1608 : However, intermediate overflow is possible for a long if the number of bits
1609 : in that long is larger than PY_SSIZE_T_MAX. */
1610 :
1611 : static PyObject*
1612 0 : loghelper(PyObject* arg, double (*func)(double), char *funcname)
1613 : {
1614 : /* If it is long, do it ourselves. */
1615 0 : if (PyLong_Check(arg)) {
1616 : double x, result;
1617 : Py_ssize_t e;
1618 :
1619 : /* Negative or zero inputs give a ValueError. */
1620 0 : if (Py_SIZE(arg) <= 0) {
1621 0 : PyErr_SetString(PyExc_ValueError,
1622 : "math domain error");
1623 0 : return NULL;
1624 : }
1625 :
1626 0 : x = PyLong_AsDouble(arg);
1627 0 : if (x == -1.0 && PyErr_Occurred()) {
1628 0 : if (!PyErr_ExceptionMatches(PyExc_OverflowError))
1629 0 : return NULL;
1630 : /* Here the conversion to double overflowed, but it's possible
1631 : to compute the log anyway. Clear the exception and continue. */
1632 0 : PyErr_Clear();
1633 0 : x = _PyLong_Frexp((PyLongObject *)arg, &e);
1634 0 : if (x == -1.0 && PyErr_Occurred())
1635 0 : return NULL;
1636 : /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */
1637 0 : result = func(x) + func(2.0) * e;
1638 : }
1639 : else
1640 : /* Successfully converted x to a double. */
1641 0 : result = func(x);
1642 0 : return PyFloat_FromDouble(result);
1643 : }
1644 :
1645 : /* Else let libm handle it by itself. */
1646 0 : return math_1(arg, func, 0);
1647 : }
1648 :
1649 : static PyObject *
1650 0 : math_log(PyObject *self, PyObject *args)
1651 : {
1652 : PyObject *arg;
1653 0 : PyObject *base = NULL;
1654 : PyObject *num, *den;
1655 : PyObject *ans;
1656 :
1657 0 : if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))
1658 0 : return NULL;
1659 :
1660 0 : num = loghelper(arg, m_log, "log");
1661 0 : if (num == NULL || base == NULL)
1662 0 : return num;
1663 :
1664 0 : den = loghelper(base, m_log, "log");
1665 0 : if (den == NULL) {
1666 0 : Py_DECREF(num);
1667 0 : return NULL;
1668 : }
1669 :
1670 0 : ans = PyNumber_TrueDivide(num, den);
1671 0 : Py_DECREF(num);
1672 0 : Py_DECREF(den);
1673 0 : return ans;
1674 : }
1675 :
1676 : PyDoc_STRVAR(math_log_doc,
1677 : "log(x[, base])\n\n\
1678 : Return the logarithm of x to the given base.\n\
1679 : If the base not specified, returns the natural logarithm (base e) of x.");
1680 :
1681 : static PyObject *
1682 0 : math_log2(PyObject *self, PyObject *arg)
1683 : {
1684 0 : return loghelper(arg, m_log2, "log2");
1685 : }
1686 :
1687 : PyDoc_STRVAR(math_log2_doc,
1688 : "log2(x)\n\nReturn the base 2 logarithm of x.");
1689 :
1690 : static PyObject *
1691 0 : math_log10(PyObject *self, PyObject *arg)
1692 : {
1693 0 : return loghelper(arg, m_log10, "log10");
1694 : }
1695 :
1696 : PyDoc_STRVAR(math_log10_doc,
1697 : "log10(x)\n\nReturn the base 10 logarithm of x.");
1698 :
1699 : static PyObject *
1700 0 : math_fmod(PyObject *self, PyObject *args)
1701 : {
1702 : PyObject *ox, *oy;
1703 : double r, x, y;
1704 0 : if (! PyArg_UnpackTuple(args, "fmod", 2, 2, &ox, &oy))
1705 0 : return NULL;
1706 0 : x = PyFloat_AsDouble(ox);
1707 0 : y = PyFloat_AsDouble(oy);
1708 0 : if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1709 0 : return NULL;
1710 : /* fmod(x, +/-Inf) returns x for finite x. */
1711 0 : if (Py_IS_INFINITY(y) && Py_IS_FINITE(x))
1712 0 : return PyFloat_FromDouble(x);
1713 0 : errno = 0;
1714 : PyFPE_START_PROTECT("in math_fmod", return 0);
1715 0 : r = fmod(x, y);
1716 : PyFPE_END_PROTECT(r);
1717 0 : if (Py_IS_NAN(r)) {
1718 0 : if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
1719 0 : errno = EDOM;
1720 : else
1721 0 : errno = 0;
1722 : }
1723 0 : if (errno && is_error(r))
1724 0 : return NULL;
1725 : else
1726 0 : return PyFloat_FromDouble(r);
1727 : }
1728 :
1729 : PyDoc_STRVAR(math_fmod_doc,
1730 : "fmod(x, y)\n\nReturn fmod(x, y), according to platform C."
1731 : " x % y may differ.");
1732 :
1733 : static PyObject *
1734 0 : math_hypot(PyObject *self, PyObject *args)
1735 : {
1736 : PyObject *ox, *oy;
1737 : double r, x, y;
1738 0 : if (! PyArg_UnpackTuple(args, "hypot", 2, 2, &ox, &oy))
1739 0 : return NULL;
1740 0 : x = PyFloat_AsDouble(ox);
1741 0 : y = PyFloat_AsDouble(oy);
1742 0 : if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1743 0 : return NULL;
1744 : /* hypot(x, +/-Inf) returns Inf, even if x is a NaN. */
1745 0 : if (Py_IS_INFINITY(x))
1746 0 : return PyFloat_FromDouble(fabs(x));
1747 0 : if (Py_IS_INFINITY(y))
1748 0 : return PyFloat_FromDouble(fabs(y));
1749 0 : errno = 0;
1750 : PyFPE_START_PROTECT("in math_hypot", return 0);
1751 0 : r = hypot(x, y);
1752 : PyFPE_END_PROTECT(r);
1753 0 : if (Py_IS_NAN(r)) {
1754 0 : if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
1755 0 : errno = EDOM;
1756 : else
1757 0 : errno = 0;
1758 : }
1759 0 : else if (Py_IS_INFINITY(r)) {
1760 0 : if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
1761 0 : errno = ERANGE;
1762 : else
1763 0 : errno = 0;
1764 : }
1765 0 : if (errno && is_error(r))
1766 0 : return NULL;
1767 : else
1768 0 : return PyFloat_FromDouble(r);
1769 : }
1770 :
1771 : PyDoc_STRVAR(math_hypot_doc,
1772 : "hypot(x, y)\n\nReturn the Euclidean distance, sqrt(x*x + y*y).");
1773 :
1774 : /* pow can't use math_2, but needs its own wrapper: the problem is
1775 : that an infinite result can arise either as a result of overflow
1776 : (in which case OverflowError should be raised) or as a result of
1777 : e.g. 0.**-5. (for which ValueError needs to be raised.)
1778 : */
1779 :
1780 : static PyObject *
1781 0 : math_pow(PyObject *self, PyObject *args)
1782 : {
1783 : PyObject *ox, *oy;
1784 : double r, x, y;
1785 : int odd_y;
1786 :
1787 0 : if (! PyArg_UnpackTuple(args, "pow", 2, 2, &ox, &oy))
1788 0 : return NULL;
1789 0 : x = PyFloat_AsDouble(ox);
1790 0 : y = PyFloat_AsDouble(oy);
1791 0 : if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1792 0 : return NULL;
1793 :
1794 : /* deal directly with IEEE specials, to cope with problems on various
1795 : platforms whose semantics don't exactly match C99 */
1796 0 : r = 0.; /* silence compiler warning */
1797 0 : if (!Py_IS_FINITE(x) || !Py_IS_FINITE(y)) {
1798 0 : errno = 0;
1799 0 : if (Py_IS_NAN(x))
1800 0 : r = y == 0. ? 1. : x; /* NaN**0 = 1 */
1801 0 : else if (Py_IS_NAN(y))
1802 0 : r = x == 1. ? 1. : y; /* 1**NaN = 1 */
1803 0 : else if (Py_IS_INFINITY(x)) {
1804 0 : odd_y = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;
1805 0 : if (y > 0.)
1806 0 : r = odd_y ? x : fabs(x);
1807 0 : else if (y == 0.)
1808 0 : r = 1.;
1809 : else /* y < 0. */
1810 0 : r = odd_y ? copysign(0., x) : 0.;
1811 : }
1812 0 : else if (Py_IS_INFINITY(y)) {
1813 0 : if (fabs(x) == 1.0)
1814 0 : r = 1.;
1815 0 : else if (y > 0. && fabs(x) > 1.0)
1816 0 : r = y;
1817 0 : else if (y < 0. && fabs(x) < 1.0) {
1818 0 : r = -y; /* result is +inf */
1819 0 : if (x == 0.) /* 0**-inf: divide-by-zero */
1820 0 : errno = EDOM;
1821 : }
1822 : else
1823 0 : r = 0.;
1824 : }
1825 : }
1826 : else {
1827 : /* let libm handle finite**finite */
1828 0 : errno = 0;
1829 : PyFPE_START_PROTECT("in math_pow", return 0);
1830 0 : r = pow(x, y);
1831 : PyFPE_END_PROTECT(r);
1832 : /* a NaN result should arise only from (-ve)**(finite
1833 : non-integer); in this case we want to raise ValueError. */
1834 0 : if (!Py_IS_FINITE(r)) {
1835 0 : if (Py_IS_NAN(r)) {
1836 0 : errno = EDOM;
1837 : }
1838 : /*
1839 : an infinite result here arises either from:
1840 : (A) (+/-0.)**negative (-> divide-by-zero)
1841 : (B) overflow of x**y with x and y finite
1842 : */
1843 0 : else if (Py_IS_INFINITY(r)) {
1844 0 : if (x == 0.)
1845 0 : errno = EDOM;
1846 : else
1847 0 : errno = ERANGE;
1848 : }
1849 : }
1850 : }
1851 :
1852 0 : if (errno && is_error(r))
1853 0 : return NULL;
1854 : else
1855 0 : return PyFloat_FromDouble(r);
1856 : }
1857 :
1858 : PyDoc_STRVAR(math_pow_doc,
1859 : "pow(x, y)\n\nReturn x**y (x to the power of y).");
1860 :
1861 : static const double degToRad = Py_MATH_PI / 180.0;
1862 : static const double radToDeg = 180.0 / Py_MATH_PI;
1863 :
1864 : static PyObject *
1865 0 : math_degrees(PyObject *self, PyObject *arg)
1866 : {
1867 0 : double x = PyFloat_AsDouble(arg);
1868 0 : if (x == -1.0 && PyErr_Occurred())
1869 0 : return NULL;
1870 0 : return PyFloat_FromDouble(x * radToDeg);
1871 : }
1872 :
1873 : PyDoc_STRVAR(math_degrees_doc,
1874 : "degrees(x)\n\n\
1875 : Convert angle x from radians to degrees.");
1876 :
1877 : static PyObject *
1878 0 : math_radians(PyObject *self, PyObject *arg)
1879 : {
1880 0 : double x = PyFloat_AsDouble(arg);
1881 0 : if (x == -1.0 && PyErr_Occurred())
1882 0 : return NULL;
1883 0 : return PyFloat_FromDouble(x * degToRad);
1884 : }
1885 :
1886 : PyDoc_STRVAR(math_radians_doc,
1887 : "radians(x)\n\n\
1888 : Convert angle x from degrees to radians.");
1889 :
1890 : static PyObject *
1891 0 : math_isfinite(PyObject *self, PyObject *arg)
1892 : {
1893 0 : double x = PyFloat_AsDouble(arg);
1894 0 : if (x == -1.0 && PyErr_Occurred())
1895 0 : return NULL;
1896 0 : return PyBool_FromLong((long)Py_IS_FINITE(x));
1897 : }
1898 :
1899 : PyDoc_STRVAR(math_isfinite_doc,
1900 : "isfinite(x) -> bool\n\n\
1901 : Return True if x is neither an infinity nor a NaN, and False otherwise.");
1902 :
1903 : static PyObject *
1904 0 : math_isnan(PyObject *self, PyObject *arg)
1905 : {
1906 0 : double x = PyFloat_AsDouble(arg);
1907 0 : if (x == -1.0 && PyErr_Occurred())
1908 0 : return NULL;
1909 0 : return PyBool_FromLong((long)Py_IS_NAN(x));
1910 : }
1911 :
1912 : PyDoc_STRVAR(math_isnan_doc,
1913 : "isnan(x) -> bool\n\n\
1914 : Return True if x is a NaN (not a number), and False otherwise.");
1915 :
1916 : static PyObject *
1917 0 : math_isinf(PyObject *self, PyObject *arg)
1918 : {
1919 0 : double x = PyFloat_AsDouble(arg);
1920 0 : if (x == -1.0 && PyErr_Occurred())
1921 0 : return NULL;
1922 0 : return PyBool_FromLong((long)Py_IS_INFINITY(x));
1923 : }
1924 :
1925 : PyDoc_STRVAR(math_isinf_doc,
1926 : "isinf(x) -> bool\n\n\
1927 : Return True if x is a positive or negative infinity, and False otherwise.");
1928 :
1929 : static PyMethodDef math_methods[] = {
1930 : {"acos", math_acos, METH_O, math_acos_doc},
1931 : {"acosh", math_acosh, METH_O, math_acosh_doc},
1932 : {"asin", math_asin, METH_O, math_asin_doc},
1933 : {"asinh", math_asinh, METH_O, math_asinh_doc},
1934 : {"atan", math_atan, METH_O, math_atan_doc},
1935 : {"atan2", math_atan2, METH_VARARGS, math_atan2_doc},
1936 : {"atanh", math_atanh, METH_O, math_atanh_doc},
1937 : {"ceil", math_ceil, METH_O, math_ceil_doc},
1938 : {"copysign", math_copysign, METH_VARARGS, math_copysign_doc},
1939 : {"cos", math_cos, METH_O, math_cos_doc},
1940 : {"cosh", math_cosh, METH_O, math_cosh_doc},
1941 : {"degrees", math_degrees, METH_O, math_degrees_doc},
1942 : {"erf", math_erf, METH_O, math_erf_doc},
1943 : {"erfc", math_erfc, METH_O, math_erfc_doc},
1944 : {"exp", math_exp, METH_O, math_exp_doc},
1945 : {"expm1", math_expm1, METH_O, math_expm1_doc},
1946 : {"fabs", math_fabs, METH_O, math_fabs_doc},
1947 : {"factorial", math_factorial, METH_O, math_factorial_doc},
1948 : {"floor", math_floor, METH_O, math_floor_doc},
1949 : {"fmod", math_fmod, METH_VARARGS, math_fmod_doc},
1950 : {"frexp", math_frexp, METH_O, math_frexp_doc},
1951 : {"fsum", math_fsum, METH_O, math_fsum_doc},
1952 : {"gamma", math_gamma, METH_O, math_gamma_doc},
1953 : {"hypot", math_hypot, METH_VARARGS, math_hypot_doc},
1954 : {"isfinite", math_isfinite, METH_O, math_isfinite_doc},
1955 : {"isinf", math_isinf, METH_O, math_isinf_doc},
1956 : {"isnan", math_isnan, METH_O, math_isnan_doc},
1957 : {"ldexp", math_ldexp, METH_VARARGS, math_ldexp_doc},
1958 : {"lgamma", math_lgamma, METH_O, math_lgamma_doc},
1959 : {"log", math_log, METH_VARARGS, math_log_doc},
1960 : {"log1p", math_log1p, METH_O, math_log1p_doc},
1961 : {"log10", math_log10, METH_O, math_log10_doc},
1962 : {"log2", math_log2, METH_O, math_log2_doc},
1963 : {"modf", math_modf, METH_O, math_modf_doc},
1964 : {"pow", math_pow, METH_VARARGS, math_pow_doc},
1965 : {"radians", math_radians, METH_O, math_radians_doc},
1966 : {"sin", math_sin, METH_O, math_sin_doc},
1967 : {"sinh", math_sinh, METH_O, math_sinh_doc},
1968 : {"sqrt", math_sqrt, METH_O, math_sqrt_doc},
1969 : {"tan", math_tan, METH_O, math_tan_doc},
1970 : {"tanh", math_tanh, METH_O, math_tanh_doc},
1971 : {"trunc", math_trunc, METH_O, math_trunc_doc},
1972 : {NULL, NULL} /* sentinel */
1973 : };
1974 :
1975 :
1976 : PyDoc_STRVAR(module_doc,
1977 : "This module is always available. It provides access to the\n"
1978 : "mathematical functions defined by the C standard.");
1979 :
1980 :
1981 : static struct PyModuleDef mathmodule = {
1982 : PyModuleDef_HEAD_INIT,
1983 : "math",
1984 : module_doc,
1985 : -1,
1986 : math_methods,
1987 : NULL,
1988 : NULL,
1989 : NULL,
1990 : NULL
1991 : };
1992 :
1993 : PyMODINIT_FUNC
1994 0 : PyInit_math(void)
1995 : {
1996 : PyObject *m;
1997 :
1998 0 : m = PyModule_Create(&mathmodule);
1999 0 : if (m == NULL)
2000 0 : goto finally;
2001 :
2002 0 : PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));
2003 0 : PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
2004 :
2005 : finally:
2006 0 : return m;
2007 : }
|