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 #include "clinic/mathmodule.c.h"
59
60 /*[clinic input]
61 module math
62 [clinic start generated code]*/
63 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=76bc7002685dd942]*/
64
65
66 /*
67 sin(pi*x), giving accurate results for all finite x (especially x
68 integral or close to an integer). This is here for use in the
69 reflection formula for the gamma function. It conforms to IEEE
70 754-2008 for finite arguments, but not for infinities or nans.
71 */
72
73 static const double pi = 3.141592653589793238462643383279502884197;
74 static const double logpi = 1.144729885849400174143427351353058711647;
75 #if !defined(HAVE_ERF) || !defined(HAVE_ERFC)
76 static const double sqrtpi = 1.772453850905516027298167483341145182798;
77 #endif /* !defined(HAVE_ERF) || !defined(HAVE_ERFC) */
78
79
80 /* Version of PyFloat_AsDouble() with in-line fast paths
81 for exact floats and integers. Gives a substantial
82 speed improvement for extracting float arguments.
83 */
84
85 #define ASSIGN_DOUBLE(target_var, obj, error_label) \
86 if (PyFloat_CheckExact(obj)) { \
87 target_var = PyFloat_AS_DOUBLE(obj); \
88 } \
89 else if (PyLong_CheckExact(obj)) { \
90 target_var = PyLong_AsDouble(obj); \
91 if (target_var == -1.0 && PyErr_Occurred()) { \
92 goto error_label; \
93 } \
94 } \
95 else { \
96 target_var = PyFloat_AsDouble(obj); \
97 if (target_var == -1.0 && PyErr_Occurred()) { \
98 goto error_label; \
99 } \
100 }
101
102 static double
m_sinpi(double x)103 m_sinpi(double x)
104 {
105 double y, r;
106 int n;
107 /* this function should only ever be called for finite arguments */
108 assert(Py_IS_FINITE(x));
109 y = fmod(fabs(x), 2.0);
110 n = (int)round(2.0*y);
111 assert(0 <= n && n <= 4);
112 switch (n) {
113 case 0:
114 r = sin(pi*y);
115 break;
116 case 1:
117 r = cos(pi*(y-0.5));
118 break;
119 case 2:
120 /* N.B. -sin(pi*(y-1.0)) is *not* equivalent: it would give
121 -0.0 instead of 0.0 when y == 1.0. */
122 r = sin(pi*(1.0-y));
123 break;
124 case 3:
125 r = -cos(pi*(y-1.5));
126 break;
127 case 4:
128 r = sin(pi*(y-2.0));
129 break;
130 default:
131 Py_UNREACHABLE();
132 }
133 return copysign(1.0, x)*r;
134 }
135
136 /* Implementation of the real gamma function. In extensive but non-exhaustive
137 random tests, this function proved accurate to within <= 10 ulps across the
138 entire float domain. Note that accuracy may depend on the quality of the
139 system math functions, the pow function in particular. Special cases
140 follow C99 annex F. The parameters and method are tailored to platforms
141 whose double format is the IEEE 754 binary64 format.
142
143 Method: for x > 0.0 we use the Lanczos approximation with parameters N=13
144 and g=6.024680040776729583740234375; these parameters are amongst those
145 used by the Boost library. Following Boost (again), we re-express the
146 Lanczos sum as a rational function, and compute it that way. The
147 coefficients below were computed independently using MPFR, and have been
148 double-checked against the coefficients in the Boost source code.
149
150 For x < 0.0 we use the reflection formula.
151
152 There's one minor tweak that deserves explanation: Lanczos' formula for
153 Gamma(x) involves computing pow(x+g-0.5, x-0.5) / exp(x+g-0.5). For many x
154 values, x+g-0.5 can be represented exactly. However, in cases where it
155 can't be represented exactly the small error in x+g-0.5 can be magnified
156 significantly by the pow and exp calls, especially for large x. A cheap
157 correction is to multiply by (1 + e*g/(x+g-0.5)), where e is the error
158 involved in the computation of x+g-0.5 (that is, e = computed value of
159 x+g-0.5 - exact value of x+g-0.5). Here's the proof:
160
161 Correction factor
162 -----------------
163 Write x+g-0.5 = y-e, where y is exactly representable as an IEEE 754
164 double, and e is tiny. Then:
165
166 pow(x+g-0.5,x-0.5)/exp(x+g-0.5) = pow(y-e, x-0.5)/exp(y-e)
167 = pow(y, x-0.5)/exp(y) * C,
168
169 where the correction_factor C is given by
170
171 C = pow(1-e/y, x-0.5) * exp(e)
172
173 Since e is tiny, pow(1-e/y, x-0.5) ~ 1-(x-0.5)*e/y, and exp(x) ~ 1+e, so:
174
175 C ~ (1-(x-0.5)*e/y) * (1+e) ~ 1 + e*(y-(x-0.5))/y
176
177 But y-(x-0.5) = g+e, and g+e ~ g. So we get C ~ 1 + e*g/y, and
178
179 pow(x+g-0.5,x-0.5)/exp(x+g-0.5) ~ pow(y, x-0.5)/exp(y) * (1 + e*g/y),
180
181 Note that for accuracy, when computing r*C it's better to do
182
183 r + e*g/y*r;
184
185 than
186
187 r * (1 + e*g/y);
188
189 since the addition in the latter throws away most of the bits of
190 information in e*g/y.
191 */
192
193 #define LANCZOS_N 13
194 static const double lanczos_g = 6.024680040776729583740234375;
195 static const double lanczos_g_minus_half = 5.524680040776729583740234375;
196 static const double lanczos_num_coeffs[LANCZOS_N] = {
197 23531376880.410759688572007674451636754734846804940,
198 42919803642.649098768957899047001988850926355848959,
199 35711959237.355668049440185451547166705960488635843,
200 17921034426.037209699919755754458931112671403265390,
201 6039542586.3520280050642916443072979210699388420708,
202 1439720407.3117216736632230727949123939715485786772,
203 248874557.86205415651146038641322942321632125127801,
204 31426415.585400194380614231628318205362874684987640,
205 2876370.6289353724412254090516208496135991145378768,
206 186056.26539522349504029498971604569928220784236328,
207 8071.6720023658162106380029022722506138218516325024,
208 210.82427775157934587250973392071336271166969580291,
209 2.5066282746310002701649081771338373386264310793408
210 };
211
212 /* denominator is x*(x+1)*...*(x+LANCZOS_N-2) */
213 static const double lanczos_den_coeffs[LANCZOS_N] = {
214 0.0, 39916800.0, 120543840.0, 150917976.0, 105258076.0, 45995730.0,
215 13339535.0, 2637558.0, 357423.0, 32670.0, 1925.0, 66.0, 1.0};
216
217 /* gamma values for small positive integers, 1 though NGAMMA_INTEGRAL */
218 #define NGAMMA_INTEGRAL 23
219 static const double gamma_integral[NGAMMA_INTEGRAL] = {
220 1.0, 1.0, 2.0, 6.0, 24.0, 120.0, 720.0, 5040.0, 40320.0, 362880.0,
221 3628800.0, 39916800.0, 479001600.0, 6227020800.0, 87178291200.0,
222 1307674368000.0, 20922789888000.0, 355687428096000.0,
223 6402373705728000.0, 121645100408832000.0, 2432902008176640000.0,
224 51090942171709440000.0, 1124000727777607680000.0,
225 };
226
227 /* Lanczos' sum L_g(x), for positive x */
228
229 static double
lanczos_sum(double x)230 lanczos_sum(double x)
231 {
232 double num = 0.0, den = 0.0;
233 int i;
234 assert(x > 0.0);
235 /* evaluate the rational function lanczos_sum(x). For large
236 x, the obvious algorithm risks overflow, so we instead
237 rescale the denominator and numerator of the rational
238 function by x**(1-LANCZOS_N) and treat this as a
239 rational function in 1/x. This also reduces the error for
240 larger x values. The choice of cutoff point (5.0 below) is
241 somewhat arbitrary; in tests, smaller cutoff values than
242 this resulted in lower accuracy. */
243 if (x < 5.0) {
244 for (i = LANCZOS_N; --i >= 0; ) {
245 num = num * x + lanczos_num_coeffs[i];
246 den = den * x + lanczos_den_coeffs[i];
247 }
248 }
249 else {
250 for (i = 0; i < LANCZOS_N; i++) {
251 num = num / x + lanczos_num_coeffs[i];
252 den = den / x + lanczos_den_coeffs[i];
253 }
254 }
255 return num/den;
256 }
257
258 /* Constant for +infinity, generated in the same way as float('inf'). */
259
260 static double
m_inf(void)261 m_inf(void)
262 {
263 #ifndef PY_NO_SHORT_FLOAT_REPR
264 return _Py_dg_infinity(0);
265 #else
266 return Py_HUGE_VAL;
267 #endif
268 }
269
270 /* Constant nan value, generated in the same way as float('nan'). */
271 /* We don't currently assume that Py_NAN is defined everywhere. */
272
273 #if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN)
274
275 static double
m_nan(void)276 m_nan(void)
277 {
278 #ifndef PY_NO_SHORT_FLOAT_REPR
279 return _Py_dg_stdnan(0);
280 #else
281 return Py_NAN;
282 #endif
283 }
284
285 #endif
286
287 static double
m_tgamma(double x)288 m_tgamma(double x)
289 {
290 double absx, r, y, z, sqrtpow;
291
292 /* special cases */
293 if (!Py_IS_FINITE(x)) {
294 if (Py_IS_NAN(x) || x > 0.0)
295 return x; /* tgamma(nan) = nan, tgamma(inf) = inf */
296 else {
297 errno = EDOM;
298 return Py_NAN; /* tgamma(-inf) = nan, invalid */
299 }
300 }
301 if (x == 0.0) {
302 errno = EDOM;
303 /* tgamma(+-0.0) = +-inf, divide-by-zero */
304 return copysign(Py_HUGE_VAL, x);
305 }
306
307 /* integer arguments */
308 if (x == floor(x)) {
309 if (x < 0.0) {
310 errno = EDOM; /* tgamma(n) = nan, invalid for */
311 return Py_NAN; /* negative integers n */
312 }
313 if (x <= NGAMMA_INTEGRAL)
314 return gamma_integral[(int)x - 1];
315 }
316 absx = fabs(x);
317
318 /* tiny arguments: tgamma(x) ~ 1/x for x near 0 */
319 if (absx < 1e-20) {
320 r = 1.0/x;
321 if (Py_IS_INFINITY(r))
322 errno = ERANGE;
323 return r;
324 }
325
326 /* large arguments: assuming IEEE 754 doubles, tgamma(x) overflows for
327 x > 200, and underflows to +-0.0 for x < -200, not a negative
328 integer. */
329 if (absx > 200.0) {
330 if (x < 0.0) {
331 return 0.0/m_sinpi(x);
332 }
333 else {
334 errno = ERANGE;
335 return Py_HUGE_VAL;
336 }
337 }
338
339 y = absx + lanczos_g_minus_half;
340 /* compute error in sum */
341 if (absx > lanczos_g_minus_half) {
342 /* note: the correction can be foiled by an optimizing
343 compiler that (incorrectly) thinks that an expression like
344 a + b - a - b can be optimized to 0.0. This shouldn't
345 happen in a standards-conforming compiler. */
346 double q = y - absx;
347 z = q - lanczos_g_minus_half;
348 }
349 else {
350 double q = y - lanczos_g_minus_half;
351 z = q - absx;
352 }
353 z = z * lanczos_g / y;
354 if (x < 0.0) {
355 r = -pi / m_sinpi(absx) / absx * exp(y) / lanczos_sum(absx);
356 r -= z * r;
357 if (absx < 140.0) {
358 r /= pow(y, absx - 0.5);
359 }
360 else {
361 sqrtpow = pow(y, absx / 2.0 - 0.25);
362 r /= sqrtpow;
363 r /= sqrtpow;
364 }
365 }
366 else {
367 r = lanczos_sum(absx) / exp(y);
368 r += z * r;
369 if (absx < 140.0) {
370 r *= pow(y, absx - 0.5);
371 }
372 else {
373 sqrtpow = pow(y, absx / 2.0 - 0.25);
374 r *= sqrtpow;
375 r *= sqrtpow;
376 }
377 }
378 if (Py_IS_INFINITY(r))
379 errno = ERANGE;
380 return r;
381 }
382
383 /*
384 lgamma: natural log of the absolute value of the Gamma function.
385 For large arguments, Lanczos' formula works extremely well here.
386 */
387
388 static double
m_lgamma(double x)389 m_lgamma(double x)
390 {
391 double r;
392 double absx;
393
394 /* special cases */
395 if (!Py_IS_FINITE(x)) {
396 if (Py_IS_NAN(x))
397 return x; /* lgamma(nan) = nan */
398 else
399 return Py_HUGE_VAL; /* lgamma(+-inf) = +inf */
400 }
401
402 /* integer arguments */
403 if (x == floor(x) && x <= 2.0) {
404 if (x <= 0.0) {
405 errno = EDOM; /* lgamma(n) = inf, divide-by-zero for */
406 return Py_HUGE_VAL; /* integers n <= 0 */
407 }
408 else {
409 return 0.0; /* lgamma(1) = lgamma(2) = 0.0 */
410 }
411 }
412
413 absx = fabs(x);
414 /* tiny arguments: lgamma(x) ~ -log(fabs(x)) for small x */
415 if (absx < 1e-20)
416 return -log(absx);
417
418 /* Lanczos' formula. We could save a fraction of a ulp in accuracy by
419 having a second set of numerator coefficients for lanczos_sum that
420 absorbed the exp(-lanczos_g) term, and throwing out the lanczos_g
421 subtraction below; it's probably not worth it. */
422 r = log(lanczos_sum(absx)) - lanczos_g;
423 r += (absx - 0.5) * (log(absx + lanczos_g - 0.5) - 1);
424 if (x < 0.0)
425 /* Use reflection formula to get value for negative x. */
426 r = logpi - log(fabs(m_sinpi(absx))) - log(absx) - r;
427 if (Py_IS_INFINITY(r))
428 errno = ERANGE;
429 return r;
430 }
431
432 #if !defined(HAVE_ERF) || !defined(HAVE_ERFC)
433
434 /*
435 Implementations of the error function erf(x) and the complementary error
436 function erfc(x).
437
438 Method: we use a series approximation for erf for small x, and a continued
439 fraction approximation for erfc(x) for larger x;
440 combined with the relations erf(-x) = -erf(x) and erfc(x) = 1.0 - erf(x),
441 this gives us erf(x) and erfc(x) for all x.
442
443 The series expansion used is:
444
445 erf(x) = x*exp(-x*x)/sqrt(pi) * [
446 2/1 + 4/3 x**2 + 8/15 x**4 + 16/105 x**6 + ...]
447
448 The coefficient of x**(2k-2) here is 4**k*factorial(k)/factorial(2*k).
449 This series converges well for smallish x, but slowly for larger x.
450
451 The continued fraction expansion used is:
452
453 erfc(x) = x*exp(-x*x)/sqrt(pi) * [1/(0.5 + x**2 -) 0.5/(2.5 + x**2 - )
454 3.0/(4.5 + x**2 - ) 7.5/(6.5 + x**2 - ) ...]
455
456 after the first term, the general term has the form:
457
458 k*(k-0.5)/(2*k+0.5 + x**2 - ...).
459
460 This expansion converges fast for larger x, but convergence becomes
461 infinitely slow as x approaches 0.0. The (somewhat naive) continued
462 fraction evaluation algorithm used below also risks overflow for large x;
463 but for large x, erfc(x) == 0.0 to within machine precision. (For
464 example, erfc(30.0) is approximately 2.56e-393).
465
466 Parameters: use series expansion for abs(x) < ERF_SERIES_CUTOFF and
467 continued fraction expansion for ERF_SERIES_CUTOFF <= abs(x) <
468 ERFC_CONTFRAC_CUTOFF. ERFC_SERIES_TERMS and ERFC_CONTFRAC_TERMS are the
469 numbers of terms to use for the relevant expansions. */
470
471 #define ERF_SERIES_CUTOFF 1.5
472 #define ERF_SERIES_TERMS 25
473 #define ERFC_CONTFRAC_CUTOFF 30.0
474 #define ERFC_CONTFRAC_TERMS 50
475
476 /*
477 Error function, via power series.
478
479 Given a finite float x, return an approximation to erf(x).
480 Converges reasonably fast for small x.
481 */
482
483 static double
m_erf_series(double x)484 m_erf_series(double x)
485 {
486 double x2, acc, fk, result;
487 int i, saved_errno;
488
489 x2 = x * x;
490 acc = 0.0;
491 fk = (double)ERF_SERIES_TERMS + 0.5;
492 for (i = 0; i < ERF_SERIES_TERMS; i++) {
493 acc = 2.0 + x2 * acc / fk;
494 fk -= 1.0;
495 }
496 /* Make sure the exp call doesn't affect errno;
497 see m_erfc_contfrac for more. */
498 saved_errno = errno;
499 result = acc * x * exp(-x2) / sqrtpi;
500 errno = saved_errno;
501 return result;
502 }
503
504 /*
505 Complementary error function, via continued fraction expansion.
506
507 Given a positive float x, return an approximation to erfc(x). Converges
508 reasonably fast for x large (say, x > 2.0), and should be safe from
509 overflow if x and nterms are not too large. On an IEEE 754 machine, with x
510 <= 30.0, we're safe up to nterms = 100. For x >= 30.0, erfc(x) is smaller
511 than the smallest representable nonzero float. */
512
513 static double
m_erfc_contfrac(double x)514 m_erfc_contfrac(double x)
515 {
516 double x2, a, da, p, p_last, q, q_last, b, result;
517 int i, saved_errno;
518
519 if (x >= ERFC_CONTFRAC_CUTOFF)
520 return 0.0;
521
522 x2 = x*x;
523 a = 0.0;
524 da = 0.5;
525 p = 1.0; p_last = 0.0;
526 q = da + x2; q_last = 1.0;
527 for (i = 0; i < ERFC_CONTFRAC_TERMS; i++) {
528 double temp;
529 a += da;
530 da += 2.0;
531 b = da + x2;
532 temp = p; p = b*p - a*p_last; p_last = temp;
533 temp = q; q = b*q - a*q_last; q_last = temp;
534 }
535 /* Issue #8986: On some platforms, exp sets errno on underflow to zero;
536 save the current errno value so that we can restore it later. */
537 saved_errno = errno;
538 result = p / q * x * exp(-x2) / sqrtpi;
539 errno = saved_errno;
540 return result;
541 }
542
543 #endif /* !defined(HAVE_ERF) || !defined(HAVE_ERFC) */
544
545 /* Error function erf(x), for general x */
546
547 static double
m_erf(double x)548 m_erf(double x)
549 {
550 #ifdef HAVE_ERF
551 return erf(x);
552 #else
553 double absx, cf;
554
555 if (Py_IS_NAN(x))
556 return x;
557 absx = fabs(x);
558 if (absx < ERF_SERIES_CUTOFF)
559 return m_erf_series(x);
560 else {
561 cf = m_erfc_contfrac(absx);
562 return x > 0.0 ? 1.0 - cf : cf - 1.0;
563 }
564 #endif
565 }
566
567 /* Complementary error function erfc(x), for general x. */
568
569 static double
m_erfc(double x)570 m_erfc(double x)
571 {
572 #ifdef HAVE_ERFC
573 return erfc(x);
574 #else
575 double absx, cf;
576
577 if (Py_IS_NAN(x))
578 return x;
579 absx = fabs(x);
580 if (absx < ERF_SERIES_CUTOFF)
581 return 1.0 - m_erf_series(x);
582 else {
583 cf = m_erfc_contfrac(absx);
584 return x > 0.0 ? cf : 2.0 - cf;
585 }
586 #endif
587 }
588
589 /*
590 wrapper for atan2 that deals directly with special cases before
591 delegating to the platform libm for the remaining cases. This
592 is necessary to get consistent behaviour across platforms.
593 Windows, FreeBSD and alpha Tru64 are amongst platforms that don't
594 always follow C99.
595 */
596
597 static double
m_atan2(double y,double x)598 m_atan2(double y, double x)
599 {
600 if (Py_IS_NAN(x) || Py_IS_NAN(y))
601 return Py_NAN;
602 if (Py_IS_INFINITY(y)) {
603 if (Py_IS_INFINITY(x)) {
604 if (copysign(1., x) == 1.)
605 /* atan2(+-inf, +inf) == +-pi/4 */
606 return copysign(0.25*Py_MATH_PI, y);
607 else
608 /* atan2(+-inf, -inf) == +-pi*3/4 */
609 return copysign(0.75*Py_MATH_PI, y);
610 }
611 /* atan2(+-inf, x) == +-pi/2 for finite x */
612 return copysign(0.5*Py_MATH_PI, y);
613 }
614 if (Py_IS_INFINITY(x) || y == 0.) {
615 if (copysign(1., x) == 1.)
616 /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
617 return copysign(0., y);
618 else
619 /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
620 return copysign(Py_MATH_PI, y);
621 }
622 return atan2(y, x);
623 }
624
625
626 /* IEEE 754-style remainder operation: x - n*y where n*y is the nearest
627 multiple of y to x, taking n even in the case of a tie. Assuming an IEEE 754
628 binary floating-point format, the result is always exact. */
629
630 static double
m_remainder(double x,double y)631 m_remainder(double x, double y)
632 {
633 /* Deal with most common case first. */
634 if (Py_IS_FINITE(x) && Py_IS_FINITE(y)) {
635 double absx, absy, c, m, r;
636
637 if (y == 0.0) {
638 return Py_NAN;
639 }
640
641 absx = fabs(x);
642 absy = fabs(y);
643 m = fmod(absx, absy);
644
645 /*
646 Warning: some subtlety here. What we *want* to know at this point is
647 whether the remainder m is less than, equal to, or greater than half
648 of absy. However, we can't do that comparison directly because we
649 can't be sure that 0.5*absy is representable (the mutiplication
650 might incur precision loss due to underflow). So instead we compare
651 m with the complement c = absy - m: m < 0.5*absy if and only if m <
652 c, and so on. The catch is that absy - m might also not be
653 representable, but it turns out that it doesn't matter:
654
655 - if m > 0.5*absy then absy - m is exactly representable, by
656 Sterbenz's lemma, so m > c
657 - if m == 0.5*absy then again absy - m is exactly representable
658 and m == c
659 - if m < 0.5*absy then either (i) 0.5*absy is exactly representable,
660 in which case 0.5*absy < absy - m, so 0.5*absy <= c and hence m <
661 c, or (ii) absy is tiny, either subnormal or in the lowest normal
662 binade. Then absy - m is exactly representable and again m < c.
663 */
664
665 c = absy - m;
666 if (m < c) {
667 r = m;
668 }
669 else if (m > c) {
670 r = -c;
671 }
672 else {
673 /*
674 Here absx is exactly halfway between two multiples of absy,
675 and we need to choose the even multiple. x now has the form
676
677 absx = n * absy + m
678
679 for some integer n (recalling that m = 0.5*absy at this point).
680 If n is even we want to return m; if n is odd, we need to
681 return -m.
682
683 So
684
685 0.5 * (absx - m) = (n/2) * absy
686
687 and now reducing modulo absy gives us:
688
689 | m, if n is odd
690 fmod(0.5 * (absx - m), absy) = |
691 | 0, if n is even
692
693 Now m - 2.0 * fmod(...) gives the desired result: m
694 if n is even, -m if m is odd.
695
696 Note that all steps in fmod(0.5 * (absx - m), absy)
697 will be computed exactly, with no rounding error
698 introduced.
699 */
700 assert(m == c);
701 r = m - 2.0 * fmod(0.5 * (absx - m), absy);
702 }
703 return copysign(1.0, x) * r;
704 }
705
706 /* Special values. */
707 if (Py_IS_NAN(x)) {
708 return x;
709 }
710 if (Py_IS_NAN(y)) {
711 return y;
712 }
713 if (Py_IS_INFINITY(x)) {
714 return Py_NAN;
715 }
716 assert(Py_IS_INFINITY(y));
717 return x;
718 }
719
720
721 /*
722 Various platforms (Solaris, OpenBSD) do nonstandard things for log(0),
723 log(-ve), log(NaN). Here are wrappers for log and log10 that deal with
724 special values directly, passing positive non-special values through to
725 the system log/log10.
726 */
727
728 static double
m_log(double x)729 m_log(double x)
730 {
731 if (Py_IS_FINITE(x)) {
732 if (x > 0.0)
733 return log(x);
734 errno = EDOM;
735 if (x == 0.0)
736 return -Py_HUGE_VAL; /* log(0) = -inf */
737 else
738 return Py_NAN; /* log(-ve) = nan */
739 }
740 else if (Py_IS_NAN(x))
741 return x; /* log(nan) = nan */
742 else if (x > 0.0)
743 return x; /* log(inf) = inf */
744 else {
745 errno = EDOM;
746 return Py_NAN; /* log(-inf) = nan */
747 }
748 }
749
750 /*
751 log2: log to base 2.
752
753 Uses an algorithm that should:
754
755 (a) produce exact results for powers of 2, and
756 (b) give a monotonic log2 (for positive finite floats),
757 assuming that the system log is monotonic.
758 */
759
760 static double
m_log2(double x)761 m_log2(double x)
762 {
763 if (!Py_IS_FINITE(x)) {
764 if (Py_IS_NAN(x))
765 return x; /* log2(nan) = nan */
766 else if (x > 0.0)
767 return x; /* log2(+inf) = +inf */
768 else {
769 errno = EDOM;
770 return Py_NAN; /* log2(-inf) = nan, invalid-operation */
771 }
772 }
773
774 if (x > 0.0) {
775 #ifdef HAVE_LOG2
776 return log2(x);
777 #else
778 double m;
779 int e;
780 m = frexp(x, &e);
781 /* We want log2(m * 2**e) == log(m) / log(2) + e. Care is needed when
782 * x is just greater than 1.0: in that case e is 1, log(m) is negative,
783 * and we get significant cancellation error from the addition of
784 * log(m) / log(2) to e. The slight rewrite of the expression below
785 * avoids this problem.
786 */
787 if (x >= 1.0) {
788 return log(2.0 * m) / log(2.0) + (e - 1);
789 }
790 else {
791 return log(m) / log(2.0) + e;
792 }
793 #endif
794 }
795 else if (x == 0.0) {
796 errno = EDOM;
797 return -Py_HUGE_VAL; /* log2(0) = -inf, divide-by-zero */
798 }
799 else {
800 errno = EDOM;
801 return Py_NAN; /* log2(-inf) = nan, invalid-operation */
802 }
803 }
804
805 static double
m_log10(double x)806 m_log10(double x)
807 {
808 if (Py_IS_FINITE(x)) {
809 if (x > 0.0)
810 return log10(x);
811 errno = EDOM;
812 if (x == 0.0)
813 return -Py_HUGE_VAL; /* log10(0) = -inf */
814 else
815 return Py_NAN; /* log10(-ve) = nan */
816 }
817 else if (Py_IS_NAN(x))
818 return x; /* log10(nan) = nan */
819 else if (x > 0.0)
820 return x; /* log10(inf) = inf */
821 else {
822 errno = EDOM;
823 return Py_NAN; /* log10(-inf) = nan */
824 }
825 }
826
827
828 /*[clinic input]
829 math.gcd
830
831 x as a: object
832 y as b: object
833 /
834
835 greatest common divisor of x and y
836 [clinic start generated code]*/
837
838 static PyObject *
math_gcd_impl(PyObject * module,PyObject * a,PyObject * b)839 math_gcd_impl(PyObject *module, PyObject *a, PyObject *b)
840 /*[clinic end generated code: output=7b2e0c151bd7a5d8 input=c2691e57fb2a98fa]*/
841 {
842 PyObject *g;
843
844 a = PyNumber_Index(a);
845 if (a == NULL)
846 return NULL;
847 b = PyNumber_Index(b);
848 if (b == NULL) {
849 Py_DECREF(a);
850 return NULL;
851 }
852 g = _PyLong_GCD(a, b);
853 Py_DECREF(a);
854 Py_DECREF(b);
855 return g;
856 }
857
858
859 /* Call is_error when errno != 0, and where x is the result libm
860 * returned. is_error will usually set up an exception and return
861 * true (1), but may return false (0) without setting up an exception.
862 */
863 static int
is_error(double x)864 is_error(double x)
865 {
866 int result = 1; /* presumption of guilt */
867 assert(errno); /* non-zero errno is a precondition for calling */
868 if (errno == EDOM)
869 PyErr_SetString(PyExc_ValueError, "math domain error");
870
871 else if (errno == ERANGE) {
872 /* ANSI C generally requires libm functions to set ERANGE
873 * on overflow, but also generally *allows* them to set
874 * ERANGE on underflow too. There's no consistency about
875 * the latter across platforms.
876 * Alas, C99 never requires that errno be set.
877 * Here we suppress the underflow errors (libm functions
878 * should return a zero on underflow, and +- HUGE_VAL on
879 * overflow, so testing the result for zero suffices to
880 * distinguish the cases).
881 *
882 * On some platforms (Ubuntu/ia64) it seems that errno can be
883 * set to ERANGE for subnormal results that do *not* underflow
884 * to zero. So to be safe, we'll ignore ERANGE whenever the
885 * function result is less than one in absolute value.
886 */
887 if (fabs(x) < 1.0)
888 result = 0;
889 else
890 PyErr_SetString(PyExc_OverflowError,
891 "math range error");
892 }
893 else
894 /* Unexpected math error */
895 PyErr_SetFromErrno(PyExc_ValueError);
896 return result;
897 }
898
899 /*
900 math_1 is used to wrap a libm function f that takes a double
901 argument and returns a double.
902
903 The error reporting follows these rules, which are designed to do
904 the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
905 platforms.
906
907 - a NaN result from non-NaN inputs causes ValueError to be raised
908 - an infinite result from finite inputs causes OverflowError to be
909 raised if can_overflow is 1, or raises ValueError if can_overflow
910 is 0.
911 - if the result is finite and errno == EDOM then ValueError is
912 raised
913 - if the result is finite and nonzero and errno == ERANGE then
914 OverflowError is raised
915
916 The last rule is used to catch overflow on platforms which follow
917 C89 but for which HUGE_VAL is not an infinity.
918
919 For the majority of one-argument functions these rules are enough
920 to ensure that Python's functions behave as specified in 'Annex F'
921 of the C99 standard, with the 'invalid' and 'divide-by-zero'
922 floating-point exceptions mapping to Python's ValueError and the
923 'overflow' floating-point exception mapping to OverflowError.
924 math_1 only works for functions that don't have singularities *and*
925 the possibility of overflow; fortunately, that covers everything we
926 care about right now.
927 */
928
929 static PyObject *
math_1_to_whatever(PyObject * arg,double (* func)(double),PyObject * (* from_double_func)(double),int can_overflow)930 math_1_to_whatever(PyObject *arg, double (*func) (double),
931 PyObject *(*from_double_func) (double),
932 int can_overflow)
933 {
934 double x, r;
935 x = PyFloat_AsDouble(arg);
936 if (x == -1.0 && PyErr_Occurred())
937 return NULL;
938 errno = 0;
939 PyFPE_START_PROTECT("in math_1", return 0);
940 r = (*func)(x);
941 PyFPE_END_PROTECT(r);
942 if (Py_IS_NAN(r) && !Py_IS_NAN(x)) {
943 PyErr_SetString(PyExc_ValueError,
944 "math domain error"); /* invalid arg */
945 return NULL;
946 }
947 if (Py_IS_INFINITY(r) && Py_IS_FINITE(x)) {
948 if (can_overflow)
949 PyErr_SetString(PyExc_OverflowError,
950 "math range error"); /* overflow */
951 else
952 PyErr_SetString(PyExc_ValueError,
953 "math domain error"); /* singularity */
954 return NULL;
955 }
956 if (Py_IS_FINITE(r) && errno && is_error(r))
957 /* this branch unnecessary on most platforms */
958 return NULL;
959
960 return (*from_double_func)(r);
961 }
962
963 /* variant of math_1, to be used when the function being wrapped is known to
964 set errno properly (that is, errno = EDOM for invalid or divide-by-zero,
965 errno = ERANGE for overflow). */
966
967 static PyObject *
math_1a(PyObject * arg,double (* func)(double))968 math_1a(PyObject *arg, double (*func) (double))
969 {
970 double x, r;
971 x = PyFloat_AsDouble(arg);
972 if (x == -1.0 && PyErr_Occurred())
973 return NULL;
974 errno = 0;
975 PyFPE_START_PROTECT("in math_1a", return 0);
976 r = (*func)(x);
977 PyFPE_END_PROTECT(r);
978 if (errno && is_error(r))
979 return NULL;
980 return PyFloat_FromDouble(r);
981 }
982
983 /*
984 math_2 is used to wrap a libm function f that takes two double
985 arguments and returns a double.
986
987 The error reporting follows these rules, which are designed to do
988 the right thing on C89/C99 platforms and IEEE 754/non IEEE 754
989 platforms.
990
991 - a NaN result from non-NaN inputs causes ValueError to be raised
992 - an infinite result from finite inputs causes OverflowError to be
993 raised.
994 - if the result is finite and errno == EDOM then ValueError is
995 raised
996 - if the result is finite and nonzero and errno == ERANGE then
997 OverflowError is raised
998
999 The last rule is used to catch overflow on platforms which follow
1000 C89 but for which HUGE_VAL is not an infinity.
1001
1002 For most two-argument functions (copysign, fmod, hypot, atan2)
1003 these rules are enough to ensure that Python's functions behave as
1004 specified in 'Annex F' of the C99 standard, with the 'invalid' and
1005 'divide-by-zero' floating-point exceptions mapping to Python's
1006 ValueError and the 'overflow' floating-point exception mapping to
1007 OverflowError.
1008 */
1009
1010 static PyObject *
math_1(PyObject * arg,double (* func)(double),int can_overflow)1011 math_1(PyObject *arg, double (*func) (double), int can_overflow)
1012 {
1013 return math_1_to_whatever(arg, func, PyFloat_FromDouble, can_overflow);
1014 }
1015
1016 static PyObject *
math_1_to_int(PyObject * arg,double (* func)(double),int can_overflow)1017 math_1_to_int(PyObject *arg, double (*func) (double), int can_overflow)
1018 {
1019 return math_1_to_whatever(arg, func, PyLong_FromDouble, can_overflow);
1020 }
1021
1022 static PyObject *
math_2(PyObject * const * args,Py_ssize_t nargs,double (* func)(double,double),const char * funcname)1023 math_2(PyObject *const *args, Py_ssize_t nargs,
1024 double (*func) (double, double), const char *funcname)
1025 {
1026 double x, y, r;
1027 if (!_PyArg_CheckPositional(funcname, nargs, 2, 2))
1028 return NULL;
1029 x = PyFloat_AsDouble(args[0]);
1030 y = PyFloat_AsDouble(args[1]);
1031 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1032 return NULL;
1033 errno = 0;
1034 PyFPE_START_PROTECT("in math_2", return 0);
1035 r = (*func)(x, y);
1036 PyFPE_END_PROTECT(r);
1037 if (Py_IS_NAN(r)) {
1038 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
1039 errno = EDOM;
1040 else
1041 errno = 0;
1042 }
1043 else if (Py_IS_INFINITY(r)) {
1044 if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
1045 errno = ERANGE;
1046 else
1047 errno = 0;
1048 }
1049 if (errno && is_error(r))
1050 return NULL;
1051 else
1052 return PyFloat_FromDouble(r);
1053 }
1054
1055 #define FUNC1(funcname, func, can_overflow, docstring) \
1056 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
1057 return math_1(args, func, can_overflow); \
1058 }\
1059 PyDoc_STRVAR(math_##funcname##_doc, docstring);
1060
1061 #define FUNC1A(funcname, func, docstring) \
1062 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
1063 return math_1a(args, func); \
1064 }\
1065 PyDoc_STRVAR(math_##funcname##_doc, docstring);
1066
1067 #define FUNC2(funcname, func, docstring) \
1068 static PyObject * math_##funcname(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { \
1069 return math_2(args, nargs, func, #funcname); \
1070 }\
1071 PyDoc_STRVAR(math_##funcname##_doc, docstring);
1072
1073 FUNC1(acos, acos, 0,
1074 "acos($module, x, /)\n--\n\n"
1075 "Return the arc cosine (measured in radians) of x.")
1076 FUNC1(acosh, m_acosh, 0,
1077 "acosh($module, x, /)\n--\n\n"
1078 "Return the inverse hyperbolic cosine of x.")
1079 FUNC1(asin, asin, 0,
1080 "asin($module, x, /)\n--\n\n"
1081 "Return the arc sine (measured in radians) of x.")
1082 FUNC1(asinh, m_asinh, 0,
1083 "asinh($module, x, /)\n--\n\n"
1084 "Return the inverse hyperbolic sine of x.")
1085 FUNC1(atan, atan, 0,
1086 "atan($module, x, /)\n--\n\n"
1087 "Return the arc tangent (measured in radians) of x.")
1088 FUNC2(atan2, m_atan2,
1089 "atan2($module, y, x, /)\n--\n\n"
1090 "Return the arc tangent (measured in radians) of y/x.\n\n"
1091 "Unlike atan(y/x), the signs of both x and y are considered.")
1092 FUNC1(atanh, m_atanh, 0,
1093 "atanh($module, x, /)\n--\n\n"
1094 "Return the inverse hyperbolic tangent of x.")
1095
1096 /*[clinic input]
1097 math.ceil
1098
1099 x as number: object
1100 /
1101
1102 Return the ceiling of x as an Integral.
1103
1104 This is the smallest integer >= x.
1105 [clinic start generated code]*/
1106
1107 static PyObject *
math_ceil(PyObject * module,PyObject * number)1108 math_ceil(PyObject *module, PyObject *number)
1109 /*[clinic end generated code: output=6c3b8a78bc201c67 input=2725352806399cab]*/
1110 {
1111 _Py_IDENTIFIER(__ceil__);
1112 PyObject *method, *result;
1113
1114 method = _PyObject_LookupSpecial(number, &PyId___ceil__);
1115 if (method == NULL) {
1116 if (PyErr_Occurred())
1117 return NULL;
1118 return math_1_to_int(number, ceil, 0);
1119 }
1120 result = _PyObject_CallNoArg(method);
1121 Py_DECREF(method);
1122 return result;
1123 }
1124
1125 FUNC2(copysign, copysign,
1126 "copysign($module, x, y, /)\n--\n\n"
1127 "Return a float with the magnitude (absolute value) of x but the sign of y.\n\n"
1128 "On platforms that support signed zeros, copysign(1.0, -0.0)\n"
1129 "returns -1.0.\n")
1130 FUNC1(cos, cos, 0,
1131 "cos($module, x, /)\n--\n\n"
1132 "Return the cosine of x (measured in radians).")
1133 FUNC1(cosh, cosh, 1,
1134 "cosh($module, x, /)\n--\n\n"
1135 "Return the hyperbolic cosine of x.")
1136 FUNC1A(erf, m_erf,
1137 "erf($module, x, /)\n--\n\n"
1138 "Error function at x.")
1139 FUNC1A(erfc, m_erfc,
1140 "erfc($module, x, /)\n--\n\n"
1141 "Complementary error function at x.")
1142 FUNC1(exp, exp, 1,
1143 "exp($module, x, /)\n--\n\n"
1144 "Return e raised to the power of x.")
1145 FUNC1(expm1, m_expm1, 1,
1146 "expm1($module, x, /)\n--\n\n"
1147 "Return exp(x)-1.\n\n"
1148 "This function avoids the loss of precision involved in the direct "
1149 "evaluation of exp(x)-1 for small x.")
1150 FUNC1(fabs, fabs, 0,
1151 "fabs($module, x, /)\n--\n\n"
1152 "Return the absolute value of the float x.")
1153
1154 /*[clinic input]
1155 math.floor
1156
1157 x as number: object
1158 /
1159
1160 Return the floor of x as an Integral.
1161
1162 This is the largest integer <= x.
1163 [clinic start generated code]*/
1164
1165 static PyObject *
math_floor(PyObject * module,PyObject * number)1166 math_floor(PyObject *module, PyObject *number)
1167 /*[clinic end generated code: output=c6a65c4884884b8a input=63af6b5d7ebcc3d6]*/
1168 {
1169 _Py_IDENTIFIER(__floor__);
1170 PyObject *method, *result;
1171
1172 method = _PyObject_LookupSpecial(number, &PyId___floor__);
1173 if (method == NULL) {
1174 if (PyErr_Occurred())
1175 return NULL;
1176 return math_1_to_int(number, floor, 0);
1177 }
1178 result = _PyObject_CallNoArg(method);
1179 Py_DECREF(method);
1180 return result;
1181 }
1182
1183 FUNC1A(gamma, m_tgamma,
1184 "gamma($module, x, /)\n--\n\n"
1185 "Gamma function at x.")
1186 FUNC1A(lgamma, m_lgamma,
1187 "lgamma($module, x, /)\n--\n\n"
1188 "Natural logarithm of absolute value of Gamma function at x.")
1189 FUNC1(log1p, m_log1p, 0,
1190 "log1p($module, x, /)\n--\n\n"
1191 "Return the natural logarithm of 1+x (base e).\n\n"
1192 "The result is computed in a way which is accurate for x near zero.")
1193 FUNC2(remainder, m_remainder,
1194 "remainder($module, x, y, /)\n--\n\n"
1195 "Difference between x and the closest integer multiple of y.\n\n"
1196 "Return x - n*y where n*y is the closest integer multiple of y.\n"
1197 "In the case where x is exactly halfway between two multiples of\n"
1198 "y, the nearest even value of n is used. The result is always exact.")
1199 FUNC1(sin, sin, 0,
1200 "sin($module, x, /)\n--\n\n"
1201 "Return the sine of x (measured in radians).")
1202 FUNC1(sinh, sinh, 1,
1203 "sinh($module, x, /)\n--\n\n"
1204 "Return the hyperbolic sine of x.")
1205 FUNC1(sqrt, sqrt, 0,
1206 "sqrt($module, x, /)\n--\n\n"
1207 "Return the square root of x.")
1208 FUNC1(tan, tan, 0,
1209 "tan($module, x, /)\n--\n\n"
1210 "Return the tangent of x (measured in radians).")
1211 FUNC1(tanh, tanh, 0,
1212 "tanh($module, x, /)\n--\n\n"
1213 "Return the hyperbolic tangent of x.")
1214
1215 /* Precision summation function as msum() by Raymond Hettinger in
1216 <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393090>,
1217 enhanced with the exact partials sum and roundoff from Mark
1218 Dickinson's post at <http://bugs.python.org/file10357/msum4.py>.
1219 See those links for more details, proofs and other references.
1220
1221 Note 1: IEEE 754R floating point semantics are assumed,
1222 but the current implementation does not re-establish special
1223 value semantics across iterations (i.e. handling -Inf + Inf).
1224
1225 Note 2: No provision is made for intermediate overflow handling;
1226 therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while
1227 sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
1228 overflow of the first partial sum.
1229
1230 Note 3: The intermediate values lo, yr, and hi are declared volatile so
1231 aggressive compilers won't algebraically reduce lo to always be exactly 0.0.
1232 Also, the volatile declaration forces the values to be stored in memory as
1233 regular doubles instead of extended long precision (80-bit) values. This
1234 prevents double rounding because any addition or subtraction of two doubles
1235 can be resolved exactly into double-sized hi and lo values. As long as the
1236 hi value gets forced into a double before yr and lo are computed, the extra
1237 bits in downstream extended precision operations (x87 for example) will be
1238 exactly zero and therefore can be losslessly stored back into a double,
1239 thereby preventing double rounding.
1240
1241 Note 4: A similar implementation is in Modules/cmathmodule.c.
1242 Be sure to update both when making changes.
1243
1244 Note 5: The signature of math.fsum() differs from builtins.sum()
1245 because the start argument doesn't make sense in the context of
1246 accurate summation. Since the partials table is collapsed before
1247 returning a result, sum(seq2, start=sum(seq1)) may not equal the
1248 accurate result returned by sum(itertools.chain(seq1, seq2)).
1249 */
1250
1251 #define NUM_PARTIALS 32 /* initial partials array size, on stack */
1252
1253 /* Extend the partials array p[] by doubling its size. */
1254 static int /* non-zero on error */
_fsum_realloc(double ** p_ptr,Py_ssize_t n,double * ps,Py_ssize_t * m_ptr)1255 _fsum_realloc(double **p_ptr, Py_ssize_t n,
1256 double *ps, Py_ssize_t *m_ptr)
1257 {
1258 void *v = NULL;
1259 Py_ssize_t m = *m_ptr;
1260
1261 m += m; /* double */
1262 if (n < m && (size_t)m < ((size_t)PY_SSIZE_T_MAX / sizeof(double))) {
1263 double *p = *p_ptr;
1264 if (p == ps) {
1265 v = PyMem_Malloc(sizeof(double) * m);
1266 if (v != NULL)
1267 memcpy(v, ps, sizeof(double) * n);
1268 }
1269 else
1270 v = PyMem_Realloc(p, sizeof(double) * m);
1271 }
1272 if (v == NULL) { /* size overflow or no memory */
1273 PyErr_SetString(PyExc_MemoryError, "math.fsum partials");
1274 return 1;
1275 }
1276 *p_ptr = (double*) v;
1277 *m_ptr = m;
1278 return 0;
1279 }
1280
1281 /* Full precision summation of a sequence of floats.
1282
1283 def msum(iterable):
1284 partials = [] # sorted, non-overlapping partial sums
1285 for x in iterable:
1286 i = 0
1287 for y in partials:
1288 if abs(x) < abs(y):
1289 x, y = y, x
1290 hi = x + y
1291 lo = y - (hi - x)
1292 if lo:
1293 partials[i] = lo
1294 i += 1
1295 x = hi
1296 partials[i:] = [x]
1297 return sum_exact(partials)
1298
1299 Rounded x+y stored in hi with the roundoff stored in lo. Together hi+lo
1300 are exactly equal to x+y. The inner loop applies hi/lo summation to each
1301 partial so that the list of partial sums remains exact.
1302
1303 Sum_exact() adds the partial sums exactly and correctly rounds the final
1304 result (using the round-half-to-even rule). The items in partials remain
1305 non-zero, non-special, non-overlapping and strictly increasing in
1306 magnitude, but possibly not all having the same sign.
1307
1308 Depends on IEEE 754 arithmetic guarantees and half-even rounding.
1309 */
1310
1311 /*[clinic input]
1312 math.fsum
1313
1314 seq: object
1315 /
1316
1317 Return an accurate floating point sum of values in the iterable seq.
1318
1319 Assumes IEEE-754 floating point arithmetic.
1320 [clinic start generated code]*/
1321
1322 static PyObject *
math_fsum(PyObject * module,PyObject * seq)1323 math_fsum(PyObject *module, PyObject *seq)
1324 /*[clinic end generated code: output=ba5c672b87fe34fc input=c51b7d8caf6f6e82]*/
1325 {
1326 PyObject *item, *iter, *sum = NULL;
1327 Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;
1328 double x, y, t, ps[NUM_PARTIALS], *p = ps;
1329 double xsave, special_sum = 0.0, inf_sum = 0.0;
1330 volatile double hi, yr, lo;
1331
1332 iter = PyObject_GetIter(seq);
1333 if (iter == NULL)
1334 return NULL;
1335
1336 PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)
1337
1338 for(;;) { /* for x in iterable */
1339 assert(0 <= n && n <= m);
1340 assert((m == NUM_PARTIALS && p == ps) ||
1341 (m > NUM_PARTIALS && p != NULL));
1342
1343 item = PyIter_Next(iter);
1344 if (item == NULL) {
1345 if (PyErr_Occurred())
1346 goto _fsum_error;
1347 break;
1348 }
1349 ASSIGN_DOUBLE(x, item, error_with_item);
1350 Py_DECREF(item);
1351
1352 xsave = x;
1353 for (i = j = 0; j < n; j++) { /* for y in partials */
1354 y = p[j];
1355 if (fabs(x) < fabs(y)) {
1356 t = x; x = y; y = t;
1357 }
1358 hi = x + y;
1359 yr = hi - x;
1360 lo = y - yr;
1361 if (lo != 0.0)
1362 p[i++] = lo;
1363 x = hi;
1364 }
1365
1366 n = i; /* ps[i:] = [x] */
1367 if (x != 0.0) {
1368 if (! Py_IS_FINITE(x)) {
1369 /* a nonfinite x could arise either as
1370 a result of intermediate overflow, or
1371 as a result of a nan or inf in the
1372 summands */
1373 if (Py_IS_FINITE(xsave)) {
1374 PyErr_SetString(PyExc_OverflowError,
1375 "intermediate overflow in fsum");
1376 goto _fsum_error;
1377 }
1378 if (Py_IS_INFINITY(xsave))
1379 inf_sum += xsave;
1380 special_sum += xsave;
1381 /* reset partials */
1382 n = 0;
1383 }
1384 else if (n >= m && _fsum_realloc(&p, n, ps, &m))
1385 goto _fsum_error;
1386 else
1387 p[n++] = x;
1388 }
1389 }
1390
1391 if (special_sum != 0.0) {
1392 if (Py_IS_NAN(inf_sum))
1393 PyErr_SetString(PyExc_ValueError,
1394 "-inf + inf in fsum");
1395 else
1396 sum = PyFloat_FromDouble(special_sum);
1397 goto _fsum_error;
1398 }
1399
1400 hi = 0.0;
1401 if (n > 0) {
1402 hi = p[--n];
1403 /* sum_exact(ps, hi) from the top, stop when the sum becomes
1404 inexact. */
1405 while (n > 0) {
1406 x = hi;
1407 y = p[--n];
1408 assert(fabs(y) < fabs(x));
1409 hi = x + y;
1410 yr = hi - x;
1411 lo = y - yr;
1412 if (lo != 0.0)
1413 break;
1414 }
1415 /* Make half-even rounding work across multiple partials.
1416 Needed so that sum([1e-16, 1, 1e16]) will round-up the last
1417 digit to two instead of down to zero (the 1e-16 makes the 1
1418 slightly closer to two). With a potential 1 ULP rounding
1419 error fixed-up, math.fsum() can guarantee commutativity. */
1420 if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
1421 (lo > 0.0 && p[n-1] > 0.0))) {
1422 y = lo * 2.0;
1423 x = hi + y;
1424 yr = x - hi;
1425 if (y == yr)
1426 hi = x;
1427 }
1428 }
1429 sum = PyFloat_FromDouble(hi);
1430
1431 _fsum_error:
1432 PyFPE_END_PROTECT(hi)
1433 Py_DECREF(iter);
1434 if (p != ps)
1435 PyMem_Free(p);
1436 return sum;
1437
1438 error_with_item:
1439 Py_DECREF(item);
1440 goto _fsum_error;
1441 }
1442
1443 #undef NUM_PARTIALS
1444
1445
1446 /* Return the smallest integer k such that n < 2**k, or 0 if n == 0.
1447 * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type -
1448 * count_leading_zero_bits(x)
1449 */
1450
1451 /* XXX: This routine does more or less the same thing as
1452 * bits_in_digit() in Objects/longobject.c. Someday it would be nice to
1453 * consolidate them. On BSD, there's a library function called fls()
1454 * that we could use, and GCC provides __builtin_clz().
1455 */
1456
1457 static unsigned long
bit_length(unsigned long n)1458 bit_length(unsigned long n)
1459 {
1460 unsigned long len = 0;
1461 while (n != 0) {
1462 ++len;
1463 n >>= 1;
1464 }
1465 return len;
1466 }
1467
1468 static unsigned long
count_set_bits(unsigned long n)1469 count_set_bits(unsigned long n)
1470 {
1471 unsigned long count = 0;
1472 while (n != 0) {
1473 ++count;
1474 n &= n - 1; /* clear least significant bit */
1475 }
1476 return count;
1477 }
1478
1479 /* Integer square root
1480
1481 Given a nonnegative integer `n`, we want to compute the largest integer
1482 `a` for which `a * a <= n`, or equivalently the integer part of the exact
1483 square root of `n`.
1484
1485 We use an adaptive-precision pure-integer version of Newton's iteration. Given
1486 a positive integer `n`, the algorithm produces at each iteration an integer
1487 approximation `a` to the square root of `n >> s` for some even integer `s`,
1488 with `s` decreasing as the iterations progress. On the final iteration, `s` is
1489 zero and we have an approximation to the square root of `n` itself.
1490
1491 At every step, the approximation `a` is strictly within 1.0 of the true square
1492 root, so we have
1493
1494 (a - 1)**2 < (n >> s) < (a + 1)**2
1495
1496 After the final iteration, a check-and-correct step is needed to determine
1497 whether `a` or `a - 1` gives the desired integer square root of `n`.
1498
1499 The algorithm is remarkable in its simplicity. There's no need for a
1500 per-iteration check-and-correct step, and termination is straightforward: the
1501 number of iterations is known in advance (it's exactly `floor(log2(log2(n)))`
1502 for `n > 1`). The only tricky part of the correctness proof is in establishing
1503 that the bound `(a - 1)**2 < (n >> s) < (a + 1)**2` is maintained from one
1504 iteration to the next. A sketch of the proof of this is given below.
1505
1506 In addition to the proof sketch, a formal, computer-verified proof
1507 of correctness (using Lean) of an equivalent recursive algorithm can be found
1508 here:
1509
1510 https://github.com/mdickinson/snippets/blob/master/proofs/isqrt/src/isqrt.lean
1511
1512
1513 Here's Python code equivalent to the C implementation below:
1514
1515 def isqrt(n):
1516 """
1517 Return the integer part of the square root of the input.
1518 """
1519 n = operator.index(n)
1520
1521 if n < 0:
1522 raise ValueError("isqrt() argument must be nonnegative")
1523 if n == 0:
1524 return 0
1525
1526 c = (n.bit_length() - 1) // 2
1527 a = 1
1528 d = 0
1529 for s in reversed(range(c.bit_length())):
1530 # Loop invariant: (a-1)**2 < (n >> 2*(c - d)) < (a+1)**2
1531 e = d
1532 d = c >> s
1533 a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a
1534
1535 return a - (a*a > n)
1536
1537
1538 Sketch of proof of correctness
1539 ------------------------------
1540
1541 The delicate part of the correctness proof is showing that the loop invariant
1542 is preserved from one iteration to the next. That is, just before the line
1543
1544 a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a
1545
1546 is executed in the above code, we know that
1547
1548 (1) (a - 1)**2 < (n >> 2*(c - e)) < (a + 1)**2.
1549
1550 (since `e` is always the value of `d` from the previous iteration). We must
1551 prove that after that line is executed, we have
1552
1553 (a - 1)**2 < (n >> 2*(c - d)) < (a + 1)**2
1554
1555 To facilitate the proof, we make some changes of notation. Write `m` for
1556 `n >> 2*(c-d)`, and write `b` for the new value of `a`, so
1557
1558 b = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a
1559
1560 or equivalently:
1561
1562 (2) b = (a << d - e - 1) + (m >> d - e + 1) // a
1563
1564 Then we can rewrite (1) as:
1565
1566 (3) (a - 1)**2 < (m >> 2*(d - e)) < (a + 1)**2
1567
1568 and we must show that (b - 1)**2 < m < (b + 1)**2.
1569
1570 From this point on, we switch to mathematical notation, so `/` means exact
1571 division rather than integer division and `^` is used for exponentiation. We
1572 use the `√` symbol for the exact square root. In (3), we can remove the
1573 implicit floor operation to give:
1574
1575 (4) (a - 1)^2 < m / 4^(d - e) < (a + 1)^2
1576
1577 Taking square roots throughout (4), scaling by `2^(d-e)`, and rearranging gives
1578
1579 (5) 0 <= | 2^(d-e)a - √m | < 2^(d-e)
1580
1581 Squaring and dividing through by `2^(d-e+1) a` gives
1582
1583 (6) 0 <= 2^(d-e-1) a + m / (2^(d-e+1) a) - √m < 2^(d-e-1) / a
1584
1585 We'll show below that `2^(d-e-1) <= a`. Given that, we can replace the
1586 right-hand side of (6) with `1`, and now replacing the central
1587 term `m / (2^(d-e+1) a)` with its floor in (6) gives
1588
1589 (7) -1 < 2^(d-e-1) a + m // 2^(d-e+1) a - √m < 1
1590
1591 Or equivalently, from (2):
1592
1593 (7) -1 < b - √m < 1
1594
1595 and rearranging gives that `(b-1)^2 < m < (b+1)^2`, which is what we needed
1596 to prove.
1597
1598 We're not quite done: we still have to prove the inequality `2^(d - e - 1) <=
1599 a` that was used to get line (7) above. From the definition of `c`, we have
1600 `4^c <= n`, which implies
1601
1602 (8) 4^d <= m
1603
1604 also, since `e == d >> 1`, `d` is at most `2e + 1`, from which it follows
1605 that `2d - 2e - 1 <= d` and hence that
1606
1607 (9) 4^(2d - 2e - 1) <= m
1608
1609 Dividing both sides by `4^(d - e)` gives
1610
1611 (10) 4^(d - e - 1) <= m / 4^(d - e)
1612
1613 But we know from (4) that `m / 4^(d-e) < (a + 1)^2`, hence
1614
1615 (11) 4^(d - e - 1) < (a + 1)^2
1616
1617 Now taking square roots of both sides and observing that both `2^(d-e-1)` and
1618 `a` are integers gives `2^(d - e - 1) <= a`, which is what we needed. This
1619 completes the proof sketch.
1620
1621 */
1622
1623
1624 /* Approximate square root of a large 64-bit integer.
1625
1626 Given `n` satisfying `2**62 <= n < 2**64`, return `a`
1627 satisfying `(a - 1)**2 < n < (a + 1)**2`. */
1628
1629 static uint64_t
_approximate_isqrt(uint64_t n)1630 _approximate_isqrt(uint64_t n)
1631 {
1632 uint32_t u = 1U + (n >> 62);
1633 u = (u << 1) + (n >> 59) / u;
1634 u = (u << 3) + (n >> 53) / u;
1635 u = (u << 7) + (n >> 41) / u;
1636 return (u << 15) + (n >> 17) / u;
1637 }
1638
1639 /*[clinic input]
1640 math.isqrt
1641
1642 n: object
1643 /
1644
1645 Return the integer part of the square root of the input.
1646 [clinic start generated code]*/
1647
1648 static PyObject *
math_isqrt(PyObject * module,PyObject * n)1649 math_isqrt(PyObject *module, PyObject *n)
1650 /*[clinic end generated code: output=35a6f7f980beab26 input=5b6e7ae4fa6c43d6]*/
1651 {
1652 int a_too_large, c_bit_length;
1653 size_t c, d;
1654 uint64_t m, u;
1655 PyObject *a = NULL, *b;
1656
1657 n = PyNumber_Index(n);
1658 if (n == NULL) {
1659 return NULL;
1660 }
1661
1662 if (_PyLong_Sign(n) < 0) {
1663 PyErr_SetString(
1664 PyExc_ValueError,
1665 "isqrt() argument must be nonnegative");
1666 goto error;
1667 }
1668 if (_PyLong_Sign(n) == 0) {
1669 Py_DECREF(n);
1670 return PyLong_FromLong(0);
1671 }
1672
1673 /* c = (n.bit_length() - 1) // 2 */
1674 c = _PyLong_NumBits(n);
1675 if (c == (size_t)(-1)) {
1676 goto error;
1677 }
1678 c = (c - 1U) / 2U;
1679
1680 /* Fast path: if c <= 31 then n < 2**64 and we can compute directly with a
1681 fast, almost branch-free algorithm. In the final correction, we use `u*u
1682 - 1 >= m` instead of the simpler `u*u > m` in order to get the correct
1683 result in the corner case where `u=2**32`. */
1684 if (c <= 31U) {
1685 m = (uint64_t)PyLong_AsUnsignedLongLong(n);
1686 Py_DECREF(n);
1687 if (m == (uint64_t)(-1) && PyErr_Occurred()) {
1688 return NULL;
1689 }
1690 u = _approximate_isqrt(m << (62U - 2U*c)) >> (31U - c);
1691 u -= u * u - 1U >= m;
1692 return PyLong_FromUnsignedLongLong((unsigned long long)u);
1693 }
1694
1695 /* Slow path: n >= 2**64. We perform the first five iterations in C integer
1696 arithmetic, then switch to using Python long integers. */
1697
1698 /* From n >= 2**64 it follows that c.bit_length() >= 6. */
1699 c_bit_length = 6;
1700 while ((c >> c_bit_length) > 0U) {
1701 ++c_bit_length;
1702 }
1703
1704 /* Initialise d and a. */
1705 d = c >> (c_bit_length - 5);
1706 b = _PyLong_Rshift(n, 2U*c - 62U);
1707 if (b == NULL) {
1708 goto error;
1709 }
1710 m = (uint64_t)PyLong_AsUnsignedLongLong(b);
1711 Py_DECREF(b);
1712 if (m == (uint64_t)(-1) && PyErr_Occurred()) {
1713 goto error;
1714 }
1715 u = _approximate_isqrt(m) >> (31U - d);
1716 a = PyLong_FromUnsignedLongLong((unsigned long long)u);
1717 if (a == NULL) {
1718 goto error;
1719 }
1720
1721 for (int s = c_bit_length - 6; s >= 0; --s) {
1722 PyObject *q;
1723 size_t e = d;
1724
1725 d = c >> s;
1726
1727 /* q = (n >> 2*c - e - d + 1) // a */
1728 q = _PyLong_Rshift(n, 2U*c - d - e + 1U);
1729 if (q == NULL) {
1730 goto error;
1731 }
1732 Py_SETREF(q, PyNumber_FloorDivide(q, a));
1733 if (q == NULL) {
1734 goto error;
1735 }
1736
1737 /* a = (a << d - 1 - e) + q */
1738 Py_SETREF(a, _PyLong_Lshift(a, d - 1U - e));
1739 if (a == NULL) {
1740 Py_DECREF(q);
1741 goto error;
1742 }
1743 Py_SETREF(a, PyNumber_Add(a, q));
1744 Py_DECREF(q);
1745 if (a == NULL) {
1746 goto error;
1747 }
1748 }
1749
1750 /* The correct result is either a or a - 1. Figure out which, and
1751 decrement a if necessary. */
1752
1753 /* a_too_large = n < a * a */
1754 b = PyNumber_Multiply(a, a);
1755 if (b == NULL) {
1756 goto error;
1757 }
1758 a_too_large = PyObject_RichCompareBool(n, b, Py_LT);
1759 Py_DECREF(b);
1760 if (a_too_large == -1) {
1761 goto error;
1762 }
1763
1764 if (a_too_large) {
1765 Py_SETREF(a, PyNumber_Subtract(a, _PyLong_One));
1766 }
1767 Py_DECREF(n);
1768 return a;
1769
1770 error:
1771 Py_XDECREF(a);
1772 Py_DECREF(n);
1773 return NULL;
1774 }
1775
1776 /* Divide-and-conquer factorial algorithm
1777 *
1778 * Based on the formula and pseudo-code provided at:
1779 * http://www.luschny.de/math/factorial/binarysplitfact.html
1780 *
1781 * Faster algorithms exist, but they're more complicated and depend on
1782 * a fast prime factorization algorithm.
1783 *
1784 * Notes on the algorithm
1785 * ----------------------
1786 *
1787 * factorial(n) is written in the form 2**k * m, with m odd. k and m are
1788 * computed separately, and then combined using a left shift.
1789 *
1790 * The function factorial_odd_part computes the odd part m (i.e., the greatest
1791 * odd divisor) of factorial(n), using the formula:
1792 *
1793 * factorial_odd_part(n) =
1794 *
1795 * product_{i >= 0} product_{0 < j <= n / 2**i, j odd} j
1796 *
1797 * Example: factorial_odd_part(20) =
1798 *
1799 * (1) *
1800 * (1) *
1801 * (1 * 3 * 5) *
1802 * (1 * 3 * 5 * 7 * 9)
1803 * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19)
1804 *
1805 * Here i goes from large to small: the first term corresponds to i=4 (any
1806 * larger i gives an empty product), and the last term corresponds to i=0.
1807 * Each term can be computed from the last by multiplying by the extra odd
1808 * numbers required: e.g., to get from the penultimate term to the last one,
1809 * we multiply by (11 * 13 * 15 * 17 * 19).
1810 *
1811 * To see a hint of why this formula works, here are the same numbers as above
1812 * but with the even parts (i.e., the appropriate powers of 2) included. For
1813 * each subterm in the product for i, we multiply that subterm by 2**i:
1814 *
1815 * factorial(20) =
1816 *
1817 * (16) *
1818 * (8) *
1819 * (4 * 12 * 20) *
1820 * (2 * 6 * 10 * 14 * 18) *
1821 * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19)
1822 *
1823 * The factorial_partial_product function computes the product of all odd j in
1824 * range(start, stop) for given start and stop. It's used to compute the
1825 * partial products like (11 * 13 * 15 * 17 * 19) in the example above. It
1826 * operates recursively, repeatedly splitting the range into two roughly equal
1827 * pieces until the subranges are small enough to be computed using only C
1828 * integer arithmetic.
1829 *
1830 * The two-valuation k (i.e., the exponent of the largest power of 2 dividing
1831 * the factorial) is computed independently in the main math_factorial
1832 * function. By standard results, its value is:
1833 *
1834 * two_valuation = n//2 + n//4 + n//8 + ....
1835 *
1836 * It can be shown (e.g., by complete induction on n) that two_valuation is
1837 * equal to n - count_set_bits(n), where count_set_bits(n) gives the number of
1838 * '1'-bits in the binary expansion of n.
1839 */
1840
1841 /* factorial_partial_product: Compute product(range(start, stop, 2)) using
1842 * divide and conquer. Assumes start and stop are odd and stop > start.
1843 * max_bits must be >= bit_length(stop - 2). */
1844
1845 static PyObject *
factorial_partial_product(unsigned long start,unsigned long stop,unsigned long max_bits)1846 factorial_partial_product(unsigned long start, unsigned long stop,
1847 unsigned long max_bits)
1848 {
1849 unsigned long midpoint, num_operands;
1850 PyObject *left = NULL, *right = NULL, *result = NULL;
1851
1852 /* If the return value will fit an unsigned long, then we can
1853 * multiply in a tight, fast loop where each multiply is O(1).
1854 * Compute an upper bound on the number of bits required to store
1855 * the answer.
1856 *
1857 * Storing some integer z requires floor(lg(z))+1 bits, which is
1858 * conveniently the value returned by bit_length(z). The
1859 * product x*y will require at most
1860 * bit_length(x) + bit_length(y) bits to store, based
1861 * on the idea that lg product = lg x + lg y.
1862 *
1863 * We know that stop - 2 is the largest number to be multiplied. From
1864 * there, we have: bit_length(answer) <= num_operands *
1865 * bit_length(stop - 2)
1866 */
1867
1868 num_operands = (stop - start) / 2;
1869 /* The "num_operands <= 8 * SIZEOF_LONG" check guards against the
1870 * unlikely case of an overflow in num_operands * max_bits. */
1871 if (num_operands <= 8 * SIZEOF_LONG &&
1872 num_operands * max_bits <= 8 * SIZEOF_LONG) {
1873 unsigned long j, total;
1874 for (total = start, j = start + 2; j < stop; j += 2)
1875 total *= j;
1876 return PyLong_FromUnsignedLong(total);
1877 }
1878
1879 /* find midpoint of range(start, stop), rounded up to next odd number. */
1880 midpoint = (start + num_operands) | 1;
1881 left = factorial_partial_product(start, midpoint,
1882 bit_length(midpoint - 2));
1883 if (left == NULL)
1884 goto error;
1885 right = factorial_partial_product(midpoint, stop, max_bits);
1886 if (right == NULL)
1887 goto error;
1888 result = PyNumber_Multiply(left, right);
1889
1890 error:
1891 Py_XDECREF(left);
1892 Py_XDECREF(right);
1893 return result;
1894 }
1895
1896 /* factorial_odd_part: compute the odd part of factorial(n). */
1897
1898 static PyObject *
factorial_odd_part(unsigned long n)1899 factorial_odd_part(unsigned long n)
1900 {
1901 long i;
1902 unsigned long v, lower, upper;
1903 PyObject *partial, *tmp, *inner, *outer;
1904
1905 inner = PyLong_FromLong(1);
1906 if (inner == NULL)
1907 return NULL;
1908 outer = inner;
1909 Py_INCREF(outer);
1910
1911 upper = 3;
1912 for (i = bit_length(n) - 2; i >= 0; i--) {
1913 v = n >> i;
1914 if (v <= 2)
1915 continue;
1916 lower = upper;
1917 /* (v + 1) | 1 = least odd integer strictly larger than n / 2**i */
1918 upper = (v + 1) | 1;
1919 /* Here inner is the product of all odd integers j in the range (0,
1920 n/2**(i+1)]. The factorial_partial_product call below gives the
1921 product of all odd integers j in the range (n/2**(i+1), n/2**i]. */
1922 partial = factorial_partial_product(lower, upper, bit_length(upper-2));
1923 /* inner *= partial */
1924 if (partial == NULL)
1925 goto error;
1926 tmp = PyNumber_Multiply(inner, partial);
1927 Py_DECREF(partial);
1928 if (tmp == NULL)
1929 goto error;
1930 Py_DECREF(inner);
1931 inner = tmp;
1932 /* Now inner is the product of all odd integers j in the range (0,
1933 n/2**i], giving the inner product in the formula above. */
1934
1935 /* outer *= inner; */
1936 tmp = PyNumber_Multiply(outer, inner);
1937 if (tmp == NULL)
1938 goto error;
1939 Py_DECREF(outer);
1940 outer = tmp;
1941 }
1942 Py_DECREF(inner);
1943 return outer;
1944
1945 error:
1946 Py_DECREF(outer);
1947 Py_DECREF(inner);
1948 return NULL;
1949 }
1950
1951
1952 /* Lookup table for small factorial values */
1953
1954 static const unsigned long SmallFactorials[] = {
1955 1, 1, 2, 6, 24, 120, 720, 5040, 40320,
1956 362880, 3628800, 39916800, 479001600,
1957 #if SIZEOF_LONG >= 8
1958 6227020800, 87178291200, 1307674368000,
1959 20922789888000, 355687428096000, 6402373705728000,
1960 121645100408832000, 2432902008176640000
1961 #endif
1962 };
1963
1964 /*[clinic input]
1965 math.factorial
1966
1967 x as arg: object
1968 /
1969
1970 Find x!.
1971
1972 Raise a ValueError if x is negative or non-integral.
1973 [clinic start generated code]*/
1974
1975 static PyObject *
math_factorial(PyObject * module,PyObject * arg)1976 math_factorial(PyObject *module, PyObject *arg)
1977 /*[clinic end generated code: output=6686f26fae00e9ca input=6d1c8105c0d91fb4]*/
1978 {
1979 long x, two_valuation;
1980 int overflow;
1981 PyObject *result, *odd_part, *pyint_form;
1982
1983 if (PyFloat_Check(arg)) {
1984 PyObject *lx;
1985 double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);
1986 if (!(Py_IS_FINITE(dx) && dx == floor(dx))) {
1987 PyErr_SetString(PyExc_ValueError,
1988 "factorial() only accepts integral values");
1989 return NULL;
1990 }
1991 lx = PyLong_FromDouble(dx);
1992 if (lx == NULL)
1993 return NULL;
1994 x = PyLong_AsLongAndOverflow(lx, &overflow);
1995 Py_DECREF(lx);
1996 }
1997 else {
1998 pyint_form = PyNumber_Index(arg);
1999 if (pyint_form == NULL) {
2000 return NULL;
2001 }
2002 x = PyLong_AsLongAndOverflow(pyint_form, &overflow);
2003 Py_DECREF(pyint_form);
2004 }
2005
2006 if (x == -1 && PyErr_Occurred()) {
2007 return NULL;
2008 }
2009 else if (overflow == 1) {
2010 PyErr_Format(PyExc_OverflowError,
2011 "factorial() argument should not exceed %ld",
2012 LONG_MAX);
2013 return NULL;
2014 }
2015 else if (overflow == -1 || x < 0) {
2016 PyErr_SetString(PyExc_ValueError,
2017 "factorial() not defined for negative values");
2018 return NULL;
2019 }
2020
2021 /* use lookup table if x is small */
2022 if (x < (long)Py_ARRAY_LENGTH(SmallFactorials))
2023 return PyLong_FromUnsignedLong(SmallFactorials[x]);
2024
2025 /* else express in the form odd_part * 2**two_valuation, and compute as
2026 odd_part << two_valuation. */
2027 odd_part = factorial_odd_part(x);
2028 if (odd_part == NULL)
2029 return NULL;
2030 two_valuation = x - count_set_bits(x);
2031 result = _PyLong_Lshift(odd_part, two_valuation);
2032 Py_DECREF(odd_part);
2033 return result;
2034 }
2035
2036
2037 /*[clinic input]
2038 math.trunc
2039
2040 x: object
2041 /
2042
2043 Truncates the Real x to the nearest Integral toward 0.
2044
2045 Uses the __trunc__ magic method.
2046 [clinic start generated code]*/
2047
2048 static PyObject *
math_trunc(PyObject * module,PyObject * x)2049 math_trunc(PyObject *module, PyObject *x)
2050 /*[clinic end generated code: output=34b9697b707e1031 input=2168b34e0a09134d]*/
2051 {
2052 _Py_IDENTIFIER(__trunc__);
2053 PyObject *trunc, *result;
2054
2055 if (Py_TYPE(x)->tp_dict == NULL) {
2056 if (PyType_Ready(Py_TYPE(x)) < 0)
2057 return NULL;
2058 }
2059
2060 trunc = _PyObject_LookupSpecial(x, &PyId___trunc__);
2061 if (trunc == NULL) {
2062 if (!PyErr_Occurred())
2063 PyErr_Format(PyExc_TypeError,
2064 "type %.100s doesn't define __trunc__ method",
2065 Py_TYPE(x)->tp_name);
2066 return NULL;
2067 }
2068 result = _PyObject_CallNoArg(trunc);
2069 Py_DECREF(trunc);
2070 return result;
2071 }
2072
2073
2074 /*[clinic input]
2075 math.frexp
2076
2077 x: double
2078 /
2079
2080 Return the mantissa and exponent of x, as pair (m, e).
2081
2082 m is a float and e is an int, such that x = m * 2.**e.
2083 If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.
2084 [clinic start generated code]*/
2085
2086 static PyObject *
math_frexp_impl(PyObject * module,double x)2087 math_frexp_impl(PyObject *module, double x)
2088 /*[clinic end generated code: output=03e30d252a15ad4a input=96251c9e208bc6e9]*/
2089 {
2090 int i;
2091 /* deal with special cases directly, to sidestep platform
2092 differences */
2093 if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
2094 i = 0;
2095 }
2096 else {
2097 PyFPE_START_PROTECT("in math_frexp", return 0);
2098 x = frexp(x, &i);
2099 PyFPE_END_PROTECT(x);
2100 }
2101 return Py_BuildValue("(di)", x, i);
2102 }
2103
2104
2105 /*[clinic input]
2106 math.ldexp
2107
2108 x: double
2109 i: object
2110 /
2111
2112 Return x * (2**i).
2113
2114 This is essentially the inverse of frexp().
2115 [clinic start generated code]*/
2116
2117 static PyObject *
math_ldexp_impl(PyObject * module,double x,PyObject * i)2118 math_ldexp_impl(PyObject *module, double x, PyObject *i)
2119 /*[clinic end generated code: output=b6892f3c2df9cc6a input=17d5970c1a40a8c1]*/
2120 {
2121 double r;
2122 long exp;
2123 int overflow;
2124
2125 if (PyLong_Check(i)) {
2126 /* on overflow, replace exponent with either LONG_MAX
2127 or LONG_MIN, depending on the sign. */
2128 exp = PyLong_AsLongAndOverflow(i, &overflow);
2129 if (exp == -1 && PyErr_Occurred())
2130 return NULL;
2131 if (overflow)
2132 exp = overflow < 0 ? LONG_MIN : LONG_MAX;
2133 }
2134 else {
2135 PyErr_SetString(PyExc_TypeError,
2136 "Expected an int as second argument to ldexp.");
2137 return NULL;
2138 }
2139
2140 if (x == 0. || !Py_IS_FINITE(x)) {
2141 /* NaNs, zeros and infinities are returned unchanged */
2142 r = x;
2143 errno = 0;
2144 } else if (exp > INT_MAX) {
2145 /* overflow */
2146 r = copysign(Py_HUGE_VAL, x);
2147 errno = ERANGE;
2148 } else if (exp < INT_MIN) {
2149 /* underflow to +-0 */
2150 r = copysign(0., x);
2151 errno = 0;
2152 } else {
2153 errno = 0;
2154 PyFPE_START_PROTECT("in math_ldexp", return 0);
2155 r = ldexp(x, (int)exp);
2156 PyFPE_END_PROTECT(r);
2157 if (Py_IS_INFINITY(r))
2158 errno = ERANGE;
2159 }
2160
2161 if (errno && is_error(r))
2162 return NULL;
2163 return PyFloat_FromDouble(r);
2164 }
2165
2166
2167 /*[clinic input]
2168 math.modf
2169
2170 x: double
2171 /
2172
2173 Return the fractional and integer parts of x.
2174
2175 Both results carry the sign of x and are floats.
2176 [clinic start generated code]*/
2177
2178 static PyObject *
math_modf_impl(PyObject * module,double x)2179 math_modf_impl(PyObject *module, double x)
2180 /*[clinic end generated code: output=90cee0260014c3c0 input=b4cfb6786afd9035]*/
2181 {
2182 double y;
2183 /* some platforms don't do the right thing for NaNs and
2184 infinities, so we take care of special cases directly. */
2185 if (!Py_IS_FINITE(x)) {
2186 if (Py_IS_INFINITY(x))
2187 return Py_BuildValue("(dd)", copysign(0., x), x);
2188 else if (Py_IS_NAN(x))
2189 return Py_BuildValue("(dd)", x, x);
2190 }
2191
2192 errno = 0;
2193 PyFPE_START_PROTECT("in math_modf", return 0);
2194 x = modf(x, &y);
2195 PyFPE_END_PROTECT(x);
2196 return Py_BuildValue("(dd)", x, y);
2197 }
2198
2199
2200 /* A decent logarithm is easy to compute even for huge ints, but libm can't
2201 do that by itself -- loghelper can. func is log or log10, and name is
2202 "log" or "log10". Note that overflow of the result isn't possible: an int
2203 can contain no more than INT_MAX * SHIFT bits, so has value certainly less
2204 than 2**(2**64 * 2**16) == 2**2**80, and log2 of that is 2**80, which is
2205 small enough to fit in an IEEE single. log and log10 are even smaller.
2206 However, intermediate overflow is possible for an int if the number of bits
2207 in that int is larger than PY_SSIZE_T_MAX. */
2208
2209 static PyObject*
loghelper(PyObject * arg,double (* func)(double),const char * funcname)2210 loghelper(PyObject* arg, double (*func)(double), const char *funcname)
2211 {
2212 /* If it is int, do it ourselves. */
2213 if (PyLong_Check(arg)) {
2214 double x, result;
2215 Py_ssize_t e;
2216
2217 /* Negative or zero inputs give a ValueError. */
2218 if (Py_SIZE(arg) <= 0) {
2219 PyErr_SetString(PyExc_ValueError,
2220 "math domain error");
2221 return NULL;
2222 }
2223
2224 x = PyLong_AsDouble(arg);
2225 if (x == -1.0 && PyErr_Occurred()) {
2226 if (!PyErr_ExceptionMatches(PyExc_OverflowError))
2227 return NULL;
2228 /* Here the conversion to double overflowed, but it's possible
2229 to compute the log anyway. Clear the exception and continue. */
2230 PyErr_Clear();
2231 x = _PyLong_Frexp((PyLongObject *)arg, &e);
2232 if (x == -1.0 && PyErr_Occurred())
2233 return NULL;
2234 /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */
2235 result = func(x) + func(2.0) * e;
2236 }
2237 else
2238 /* Successfully converted x to a double. */
2239 result = func(x);
2240 return PyFloat_FromDouble(result);
2241 }
2242
2243 /* Else let libm handle it by itself. */
2244 return math_1(arg, func, 0);
2245 }
2246
2247
2248 /*[clinic input]
2249 math.log
2250
2251 x: object
2252 [
2253 base: object(c_default="NULL") = math.e
2254 ]
2255 /
2256
2257 Return the logarithm of x to the given base.
2258
2259 If the base not specified, returns the natural logarithm (base e) of x.
2260 [clinic start generated code]*/
2261
2262 static PyObject *
math_log_impl(PyObject * module,PyObject * x,int group_right_1,PyObject * base)2263 math_log_impl(PyObject *module, PyObject *x, int group_right_1,
2264 PyObject *base)
2265 /*[clinic end generated code: output=7b5a39e526b73fc9 input=0f62d5726cbfebbd]*/
2266 {
2267 PyObject *num, *den;
2268 PyObject *ans;
2269
2270 num = loghelper(x, m_log, "log");
2271 if (num == NULL || base == NULL)
2272 return num;
2273
2274 den = loghelper(base, m_log, "log");
2275 if (den == NULL) {
2276 Py_DECREF(num);
2277 return NULL;
2278 }
2279
2280 ans = PyNumber_TrueDivide(num, den);
2281 Py_DECREF(num);
2282 Py_DECREF(den);
2283 return ans;
2284 }
2285
2286
2287 /*[clinic input]
2288 math.log2
2289
2290 x: object
2291 /
2292
2293 Return the base 2 logarithm of x.
2294 [clinic start generated code]*/
2295
2296 static PyObject *
math_log2(PyObject * module,PyObject * x)2297 math_log2(PyObject *module, PyObject *x)
2298 /*[clinic end generated code: output=5425899a4d5d6acb input=08321262bae4f39b]*/
2299 {
2300 return loghelper(x, m_log2, "log2");
2301 }
2302
2303
2304 /*[clinic input]
2305 math.log10
2306
2307 x: object
2308 /
2309
2310 Return the base 10 logarithm of x.
2311 [clinic start generated code]*/
2312
2313 static PyObject *
math_log10(PyObject * module,PyObject * x)2314 math_log10(PyObject *module, PyObject *x)
2315 /*[clinic end generated code: output=be72a64617df9c6f input=b2469d02c6469e53]*/
2316 {
2317 return loghelper(x, m_log10, "log10");
2318 }
2319
2320
2321 /*[clinic input]
2322 math.fmod
2323
2324 x: double
2325 y: double
2326 /
2327
2328 Return fmod(x, y), according to platform C.
2329
2330 x % y may differ.
2331 [clinic start generated code]*/
2332
2333 static PyObject *
math_fmod_impl(PyObject * module,double x,double y)2334 math_fmod_impl(PyObject *module, double x, double y)
2335 /*[clinic end generated code: output=7559d794343a27b5 input=4f84caa8cfc26a03]*/
2336 {
2337 double r;
2338 /* fmod(x, +/-Inf) returns x for finite x. */
2339 if (Py_IS_INFINITY(y) && Py_IS_FINITE(x))
2340 return PyFloat_FromDouble(x);
2341 errno = 0;
2342 PyFPE_START_PROTECT("in math_fmod", return 0);
2343 r = fmod(x, y);
2344 PyFPE_END_PROTECT(r);
2345 if (Py_IS_NAN(r)) {
2346 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
2347 errno = EDOM;
2348 else
2349 errno = 0;
2350 }
2351 if (errno && is_error(r))
2352 return NULL;
2353 else
2354 return PyFloat_FromDouble(r);
2355 }
2356
2357 /*
2358 Given an *n* length *vec* of values and a value *max*, compute:
2359
2360 max * sqrt(sum((x / max) ** 2 for x in vec))
2361
2362 The value of the *max* variable must be non-negative and
2363 equal to the absolute value of the largest magnitude
2364 entry in the vector. If n==0, then *max* should be 0.0.
2365 If an infinity is present in the vec, *max* should be INF.
2366
2367 The *found_nan* variable indicates whether some member of
2368 the *vec* is a NaN.
2369
2370 To improve accuracy and to increase the number of cases where
2371 vector_norm() is commutative, we use a variant of Neumaier
2372 summation specialized to exploit that we always know that
2373 |csum| >= |x|.
2374
2375 The *csum* variable tracks the cumulative sum and *frac* tracks
2376 the cumulative fractional errors at each step. Since this
2377 variant assumes that |csum| >= |x| at each step, we establish
2378 the precondition by starting the accumulation from 1.0 which
2379 represents the largest possible value of (x/max)**2.
2380
2381 After the loop is finished, the initial 1.0 is subtracted out
2382 for a net zero effect on the final sum. Since *csum* will be
2383 greater than 1.0, the subtraction of 1.0 will not cause
2384 fractional digits to be dropped from *csum*.
2385
2386 */
2387
2388 static inline double
vector_norm(Py_ssize_t n,double * vec,double max,int found_nan)2389 vector_norm(Py_ssize_t n, double *vec, double max, int found_nan)
2390 {
2391 double x, csum = 1.0, oldcsum, frac = 0.0;
2392 Py_ssize_t i;
2393
2394 if (Py_IS_INFINITY(max)) {
2395 return max;
2396 }
2397 if (found_nan) {
2398 return Py_NAN;
2399 }
2400 if (max == 0.0 || n <= 1) {
2401 return max;
2402 }
2403 for (i=0 ; i < n ; i++) {
2404 x = vec[i];
2405 assert(Py_IS_FINITE(x) && fabs(x) <= max);
2406 x /= max;
2407 x = x*x;
2408 oldcsum = csum;
2409 csum += x;
2410 assert(csum >= x);
2411 frac += (oldcsum - csum) + x;
2412 }
2413 return max * sqrt(csum - 1.0 + frac);
2414 }
2415
2416 #define NUM_STACK_ELEMS 16
2417
2418 /*[clinic input]
2419 math.dist
2420
2421 p: object
2422 q: object
2423 /
2424
2425 Return the Euclidean distance between two points p and q.
2426
2427 The points should be specified as sequences (or iterables) of
2428 coordinates. Both inputs must have the same dimension.
2429
2430 Roughly equivalent to:
2431 sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
2432 [clinic start generated code]*/
2433
2434 static PyObject *
math_dist_impl(PyObject * module,PyObject * p,PyObject * q)2435 math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
2436 /*[clinic end generated code: output=56bd9538d06bbcfe input=74e85e1b6092e68e]*/
2437 {
2438 PyObject *item;
2439 double max = 0.0;
2440 double x, px, qx, result;
2441 Py_ssize_t i, m, n;
2442 int found_nan = 0, p_allocated = 0, q_allocated = 0;
2443 double diffs_on_stack[NUM_STACK_ELEMS];
2444 double *diffs = diffs_on_stack;
2445
2446 if (!PyTuple_Check(p)) {
2447 p = PySequence_Tuple(p);
2448 if (p == NULL) {
2449 return NULL;
2450 }
2451 p_allocated = 1;
2452 }
2453 if (!PyTuple_Check(q)) {
2454 q = PySequence_Tuple(q);
2455 if (q == NULL) {
2456 if (p_allocated) {
2457 Py_DECREF(p);
2458 }
2459 return NULL;
2460 }
2461 q_allocated = 1;
2462 }
2463
2464 m = PyTuple_GET_SIZE(p);
2465 n = PyTuple_GET_SIZE(q);
2466 if (m != n) {
2467 PyErr_SetString(PyExc_ValueError,
2468 "both points must have the same number of dimensions");
2469 return NULL;
2470
2471 }
2472 if (n > NUM_STACK_ELEMS) {
2473 diffs = (double *) PyObject_Malloc(n * sizeof(double));
2474 if (diffs == NULL) {
2475 return PyErr_NoMemory();
2476 }
2477 }
2478 for (i=0 ; i<n ; i++) {
2479 item = PyTuple_GET_ITEM(p, i);
2480 ASSIGN_DOUBLE(px, item, error_exit);
2481 item = PyTuple_GET_ITEM(q, i);
2482 ASSIGN_DOUBLE(qx, item, error_exit);
2483 x = fabs(px - qx);
2484 diffs[i] = x;
2485 found_nan |= Py_IS_NAN(x);
2486 if (x > max) {
2487 max = x;
2488 }
2489 }
2490 result = vector_norm(n, diffs, max, found_nan);
2491 if (diffs != diffs_on_stack) {
2492 PyObject_Free(diffs);
2493 }
2494 if (p_allocated) {
2495 Py_DECREF(p);
2496 }
2497 if (q_allocated) {
2498 Py_DECREF(q);
2499 }
2500 return PyFloat_FromDouble(result);
2501
2502 error_exit:
2503 if (diffs != diffs_on_stack) {
2504 PyObject_Free(diffs);
2505 }
2506 if (p_allocated) {
2507 Py_DECREF(p);
2508 }
2509 if (q_allocated) {
2510 Py_DECREF(q);
2511 }
2512 return NULL;
2513 }
2514
2515 /* AC: cannot convert yet, waiting for *args support */
2516 static PyObject *
math_hypot(PyObject * self,PyObject * const * args,Py_ssize_t nargs)2517 math_hypot(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
2518 {
2519 Py_ssize_t i;
2520 PyObject *item;
2521 double max = 0.0;
2522 double x, result;
2523 int found_nan = 0;
2524 double coord_on_stack[NUM_STACK_ELEMS];
2525 double *coordinates = coord_on_stack;
2526
2527 if (nargs > NUM_STACK_ELEMS) {
2528 coordinates = (double *) PyObject_Malloc(nargs * sizeof(double));
2529 if (coordinates == NULL) {
2530 return PyErr_NoMemory();
2531 }
2532 }
2533 for (i = 0; i < nargs; i++) {
2534 item = args[i];
2535 ASSIGN_DOUBLE(x, item, error_exit);
2536 x = fabs(x);
2537 coordinates[i] = x;
2538 found_nan |= Py_IS_NAN(x);
2539 if (x > max) {
2540 max = x;
2541 }
2542 }
2543 result = vector_norm(nargs, coordinates, max, found_nan);
2544 if (coordinates != coord_on_stack) {
2545 PyObject_Free(coordinates);
2546 }
2547 return PyFloat_FromDouble(result);
2548
2549 error_exit:
2550 if (coordinates != coord_on_stack) {
2551 PyObject_Free(coordinates);
2552 }
2553 return NULL;
2554 }
2555
2556 #undef NUM_STACK_ELEMS
2557
2558 PyDoc_STRVAR(math_hypot_doc,
2559 "hypot(*coordinates) -> value\n\n\
2560 Multidimensional Euclidean distance from the origin to a point.\n\
2561 \n\
2562 Roughly equivalent to:\n\
2563 sqrt(sum(x**2 for x in coordinates))\n\
2564 \n\
2565 For a two dimensional point (x, y), gives the hypotenuse\n\
2566 using the Pythagorean theorem: sqrt(x*x + y*y).\n\
2567 \n\
2568 For example, the hypotenuse of a 3/4/5 right triangle is:\n\
2569 \n\
2570 >>> hypot(3.0, 4.0)\n\
2571 5.0\n\
2572 ");
2573
2574 /* pow can't use math_2, but needs its own wrapper: the problem is
2575 that an infinite result can arise either as a result of overflow
2576 (in which case OverflowError should be raised) or as a result of
2577 e.g. 0.**-5. (for which ValueError needs to be raised.)
2578 */
2579
2580 /*[clinic input]
2581 math.pow
2582
2583 x: double
2584 y: double
2585 /
2586
2587 Return x**y (x to the power of y).
2588 [clinic start generated code]*/
2589
2590 static PyObject *
math_pow_impl(PyObject * module,double x,double y)2591 math_pow_impl(PyObject *module, double x, double y)
2592 /*[clinic end generated code: output=fff93e65abccd6b0 input=c26f1f6075088bfd]*/
2593 {
2594 double r;
2595 int odd_y;
2596
2597 /* deal directly with IEEE specials, to cope with problems on various
2598 platforms whose semantics don't exactly match C99 */
2599 r = 0.; /* silence compiler warning */
2600 if (!Py_IS_FINITE(x) || !Py_IS_FINITE(y)) {
2601 errno = 0;
2602 if (Py_IS_NAN(x))
2603 r = y == 0. ? 1. : x; /* NaN**0 = 1 */
2604 else if (Py_IS_NAN(y))
2605 r = x == 1. ? 1. : y; /* 1**NaN = 1 */
2606 else if (Py_IS_INFINITY(x)) {
2607 odd_y = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;
2608 if (y > 0.)
2609 r = odd_y ? x : fabs(x);
2610 else if (y == 0.)
2611 r = 1.;
2612 else /* y < 0. */
2613 r = odd_y ? copysign(0., x) : 0.;
2614 }
2615 else if (Py_IS_INFINITY(y)) {
2616 if (fabs(x) == 1.0)
2617 r = 1.;
2618 else if (y > 0. && fabs(x) > 1.0)
2619 r = y;
2620 else if (y < 0. && fabs(x) < 1.0) {
2621 r = -y; /* result is +inf */
2622 if (x == 0.) /* 0**-inf: divide-by-zero */
2623 errno = EDOM;
2624 }
2625 else
2626 r = 0.;
2627 }
2628 }
2629 else {
2630 /* let libm handle finite**finite */
2631 errno = 0;
2632 PyFPE_START_PROTECT("in math_pow", return 0);
2633 r = pow(x, y);
2634 PyFPE_END_PROTECT(r);
2635 /* a NaN result should arise only from (-ve)**(finite
2636 non-integer); in this case we want to raise ValueError. */
2637 if (!Py_IS_FINITE(r)) {
2638 if (Py_IS_NAN(r)) {
2639 errno = EDOM;
2640 }
2641 /*
2642 an infinite result here arises either from:
2643 (A) (+/-0.)**negative (-> divide-by-zero)
2644 (B) overflow of x**y with x and y finite
2645 */
2646 else if (Py_IS_INFINITY(r)) {
2647 if (x == 0.)
2648 errno = EDOM;
2649 else
2650 errno = ERANGE;
2651 }
2652 }
2653 }
2654
2655 if (errno && is_error(r))
2656 return NULL;
2657 else
2658 return PyFloat_FromDouble(r);
2659 }
2660
2661
2662 static const double degToRad = Py_MATH_PI / 180.0;
2663 static const double radToDeg = 180.0 / Py_MATH_PI;
2664
2665 /*[clinic input]
2666 math.degrees
2667
2668 x: double
2669 /
2670
2671 Convert angle x from radians to degrees.
2672 [clinic start generated code]*/
2673
2674 static PyObject *
math_degrees_impl(PyObject * module,double x)2675 math_degrees_impl(PyObject *module, double x)
2676 /*[clinic end generated code: output=7fea78b294acd12f input=81e016555d6e3660]*/
2677 {
2678 return PyFloat_FromDouble(x * radToDeg);
2679 }
2680
2681
2682 /*[clinic input]
2683 math.radians
2684
2685 x: double
2686 /
2687
2688 Convert angle x from degrees to radians.
2689 [clinic start generated code]*/
2690
2691 static PyObject *
math_radians_impl(PyObject * module,double x)2692 math_radians_impl(PyObject *module, double x)
2693 /*[clinic end generated code: output=34daa47caf9b1590 input=91626fc489fe3d63]*/
2694 {
2695 return PyFloat_FromDouble(x * degToRad);
2696 }
2697
2698
2699 /*[clinic input]
2700 math.isfinite
2701
2702 x: double
2703 /
2704
2705 Return True if x is neither an infinity nor a NaN, and False otherwise.
2706 [clinic start generated code]*/
2707
2708 static PyObject *
math_isfinite_impl(PyObject * module,double x)2709 math_isfinite_impl(PyObject *module, double x)
2710 /*[clinic end generated code: output=8ba1f396440c9901 input=46967d254812e54a]*/
2711 {
2712 return PyBool_FromLong((long)Py_IS_FINITE(x));
2713 }
2714
2715
2716 /*[clinic input]
2717 math.isnan
2718
2719 x: double
2720 /
2721
2722 Return True if x is a NaN (not a number), and False otherwise.
2723 [clinic start generated code]*/
2724
2725 static PyObject *
math_isnan_impl(PyObject * module,double x)2726 math_isnan_impl(PyObject *module, double x)
2727 /*[clinic end generated code: output=f537b4d6df878c3e input=935891e66083f46a]*/
2728 {
2729 return PyBool_FromLong((long)Py_IS_NAN(x));
2730 }
2731
2732
2733 /*[clinic input]
2734 math.isinf
2735
2736 x: double
2737 /
2738
2739 Return True if x is a positive or negative infinity, and False otherwise.
2740 [clinic start generated code]*/
2741
2742 static PyObject *
math_isinf_impl(PyObject * module,double x)2743 math_isinf_impl(PyObject *module, double x)
2744 /*[clinic end generated code: output=9f00cbec4de7b06b input=32630e4212cf961f]*/
2745 {
2746 return PyBool_FromLong((long)Py_IS_INFINITY(x));
2747 }
2748
2749
2750 /*[clinic input]
2751 math.isclose -> bool
2752
2753 a: double
2754 b: double
2755 *
2756 rel_tol: double = 1e-09
2757 maximum difference for being considered "close", relative to the
2758 magnitude of the input values
2759 abs_tol: double = 0.0
2760 maximum difference for being considered "close", regardless of the
2761 magnitude of the input values
2762
2763 Determine whether two floating point numbers are close in value.
2764
2765 Return True if a is close in value to b, and False otherwise.
2766
2767 For the values to be considered close, the difference between them
2768 must be smaller than at least one of the tolerances.
2769
2770 -inf, inf and NaN behave similarly to the IEEE 754 Standard. That
2771 is, NaN is not close to anything, even itself. inf and -inf are
2772 only close to themselves.
2773 [clinic start generated code]*/
2774
2775 static int
math_isclose_impl(PyObject * module,double a,double b,double rel_tol,double abs_tol)2776 math_isclose_impl(PyObject *module, double a, double b, double rel_tol,
2777 double abs_tol)
2778 /*[clinic end generated code: output=b73070207511952d input=f28671871ea5bfba]*/
2779 {
2780 double diff = 0.0;
2781
2782 /* sanity check on the inputs */
2783 if (rel_tol < 0.0 || abs_tol < 0.0 ) {
2784 PyErr_SetString(PyExc_ValueError,
2785 "tolerances must be non-negative");
2786 return -1;
2787 }
2788
2789 if ( a == b ) {
2790 /* short circuit exact equality -- needed to catch two infinities of
2791 the same sign. And perhaps speeds things up a bit sometimes.
2792 */
2793 return 1;
2794 }
2795
2796 /* This catches the case of two infinities of opposite sign, or
2797 one infinity and one finite number. Two infinities of opposite
2798 sign would otherwise have an infinite relative tolerance.
2799 Two infinities of the same sign are caught by the equality check
2800 above.
2801 */
2802
2803 if (Py_IS_INFINITY(a) || Py_IS_INFINITY(b)) {
2804 return 0;
2805 }
2806
2807 /* now do the regular computation
2808 this is essentially the "weak" test from the Boost library
2809 */
2810
2811 diff = fabs(b - a);
2812
2813 return (((diff <= fabs(rel_tol * b)) ||
2814 (diff <= fabs(rel_tol * a))) ||
2815 (diff <= abs_tol));
2816 }
2817
2818 static inline int
_check_long_mult_overflow(long a,long b)2819 _check_long_mult_overflow(long a, long b) {
2820
2821 /* From Python2's int_mul code:
2822
2823 Integer overflow checking for * is painful: Python tried a couple ways, but
2824 they didn't work on all platforms, or failed in endcases (a product of
2825 -sys.maxint-1 has been a particular pain).
2826
2827 Here's another way:
2828
2829 The native long product x*y is either exactly right or *way* off, being
2830 just the last n bits of the true product, where n is the number of bits
2831 in a long (the delivered product is the true product plus i*2**n for
2832 some integer i).
2833
2834 The native double product (double)x * (double)y is subject to three
2835 rounding errors: on a sizeof(long)==8 box, each cast to double can lose
2836 info, and even on a sizeof(long)==4 box, the multiplication can lose info.
2837 But, unlike the native long product, it's not in *range* trouble: even
2838 if sizeof(long)==32 (256-bit longs), the product easily fits in the
2839 dynamic range of a double. So the leading 50 (or so) bits of the double
2840 product are correct.
2841
2842 We check these two ways against each other, and declare victory if they're
2843 approximately the same. Else, because the native long product is the only
2844 one that can lose catastrophic amounts of information, it's the native long
2845 product that must have overflowed.
2846
2847 */
2848
2849 long longprod = (long)((unsigned long)a * b);
2850 double doubleprod = (double)a * (double)b;
2851 double doubled_longprod = (double)longprod;
2852
2853 if (doubled_longprod == doubleprod) {
2854 return 0;
2855 }
2856
2857 const double diff = doubled_longprod - doubleprod;
2858 const double absdiff = diff >= 0.0 ? diff : -diff;
2859 const double absprod = doubleprod >= 0.0 ? doubleprod : -doubleprod;
2860
2861 if (32.0 * absdiff <= absprod) {
2862 return 0;
2863 }
2864
2865 return 1;
2866 }
2867
2868 /*[clinic input]
2869 math.prod
2870
2871 iterable: object
2872 /
2873 *
2874 start: object(c_default="NULL") = 1
2875
2876 Calculate the product of all the elements in the input iterable.
2877
2878 The default start value for the product is 1.
2879
2880 When the iterable is empty, return the start value. This function is
2881 intended specifically for use with numeric values and may reject
2882 non-numeric types.
2883 [clinic start generated code]*/
2884
2885 static PyObject *
math_prod_impl(PyObject * module,PyObject * iterable,PyObject * start)2886 math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
2887 /*[clinic end generated code: output=36153bedac74a198 input=4c5ab0682782ed54]*/
2888 {
2889 PyObject *result = start;
2890 PyObject *temp, *item, *iter;
2891
2892 iter = PyObject_GetIter(iterable);
2893 if (iter == NULL) {
2894 return NULL;
2895 }
2896
2897 if (result == NULL) {
2898 result = PyLong_FromLong(1);
2899 if (result == NULL) {
2900 Py_DECREF(iter);
2901 return NULL;
2902 }
2903 } else {
2904 Py_INCREF(result);
2905 }
2906 #ifndef SLOW_PROD
2907 /* Fast paths for integers keeping temporary products in C.
2908 * Assumes all inputs are the same type.
2909 * If the assumption fails, default to use PyObjects instead.
2910 */
2911 if (PyLong_CheckExact(result)) {
2912 int overflow;
2913 long i_result = PyLong_AsLongAndOverflow(result, &overflow);
2914 /* If this already overflowed, don't even enter the loop. */
2915 if (overflow == 0) {
2916 Py_DECREF(result);
2917 result = NULL;
2918 }
2919 /* Loop over all the items in the iterable until we finish, we overflow
2920 * or we found a non integer element */
2921 while(result == NULL) {
2922 item = PyIter_Next(iter);
2923 if (item == NULL) {
2924 Py_DECREF(iter);
2925 if (PyErr_Occurred()) {
2926 return NULL;
2927 }
2928 return PyLong_FromLong(i_result);
2929 }
2930 if (PyLong_CheckExact(item)) {
2931 long b = PyLong_AsLongAndOverflow(item, &overflow);
2932 if (overflow == 0 && !_check_long_mult_overflow(i_result, b)) {
2933 long x = i_result * b;
2934 i_result = x;
2935 Py_DECREF(item);
2936 continue;
2937 }
2938 }
2939 /* Either overflowed or is not an int.
2940 * Restore real objects and process normally */
2941 result = PyLong_FromLong(i_result);
2942 if (result == NULL) {
2943 Py_DECREF(item);
2944 Py_DECREF(iter);
2945 return NULL;
2946 }
2947 temp = PyNumber_Multiply(result, item);
2948 Py_DECREF(result);
2949 Py_DECREF(item);
2950 result = temp;
2951 if (result == NULL) {
2952 Py_DECREF(iter);
2953 return NULL;
2954 }
2955 }
2956 }
2957
2958 /* Fast paths for floats keeping temporary products in C.
2959 * Assumes all inputs are the same type.
2960 * If the assumption fails, default to use PyObjects instead.
2961 */
2962 if (PyFloat_CheckExact(result)) {
2963 double f_result = PyFloat_AS_DOUBLE(result);
2964 Py_DECREF(result);
2965 result = NULL;
2966 while(result == NULL) {
2967 item = PyIter_Next(iter);
2968 if (item == NULL) {
2969 Py_DECREF(iter);
2970 if (PyErr_Occurred()) {
2971 return NULL;
2972 }
2973 return PyFloat_FromDouble(f_result);
2974 }
2975 if (PyFloat_CheckExact(item)) {
2976 f_result *= PyFloat_AS_DOUBLE(item);
2977 Py_DECREF(item);
2978 continue;
2979 }
2980 if (PyLong_CheckExact(item)) {
2981 long value;
2982 int overflow;
2983 value = PyLong_AsLongAndOverflow(item, &overflow);
2984 if (!overflow) {
2985 f_result *= (double)value;
2986 Py_DECREF(item);
2987 continue;
2988 }
2989 }
2990 result = PyFloat_FromDouble(f_result);
2991 if (result == NULL) {
2992 Py_DECREF(item);
2993 Py_DECREF(iter);
2994 return NULL;
2995 }
2996 temp = PyNumber_Multiply(result, item);
2997 Py_DECREF(result);
2998 Py_DECREF(item);
2999 result = temp;
3000 if (result == NULL) {
3001 Py_DECREF(iter);
3002 return NULL;
3003 }
3004 }
3005 }
3006 #endif
3007 /* Consume rest of the iterable (if any) that could not be handled
3008 * by specialized functions above.*/
3009 for(;;) {
3010 item = PyIter_Next(iter);
3011 if (item == NULL) {
3012 /* error, or end-of-sequence */
3013 if (PyErr_Occurred()) {
3014 Py_DECREF(result);
3015 result = NULL;
3016 }
3017 break;
3018 }
3019 temp = PyNumber_Multiply(result, item);
3020 Py_DECREF(result);
3021 Py_DECREF(item);
3022 result = temp;
3023 if (result == NULL)
3024 break;
3025 }
3026 Py_DECREF(iter);
3027 return result;
3028 }
3029
3030
3031 /*[clinic input]
3032 math.perm
3033
3034 n: object
3035 k: object = None
3036 /
3037
3038 Number of ways to choose k items from n items without repetition and with order.
3039
3040 Evaluates to n! / (n - k)! when k <= n and evaluates
3041 to zero when k > n.
3042
3043 If k is not specified or is None, then k defaults to n
3044 and the function returns n!.
3045
3046 Raises TypeError if either of the arguments are not integers.
3047 Raises ValueError if either of the arguments are negative.
3048 [clinic start generated code]*/
3049
3050 static PyObject *
math_perm_impl(PyObject * module,PyObject * n,PyObject * k)3051 math_perm_impl(PyObject *module, PyObject *n, PyObject *k)
3052 /*[clinic end generated code: output=e021a25469653e23 input=5311c5a00f359b53]*/
3053 {
3054 PyObject *result = NULL, *factor = NULL;
3055 int overflow, cmp;
3056 long long i, factors;
3057
3058 if (k == Py_None) {
3059 return math_factorial(module, n);
3060 }
3061 n = PyNumber_Index(n);
3062 if (n == NULL) {
3063 return NULL;
3064 }
3065 if (!PyLong_CheckExact(n)) {
3066 Py_SETREF(n, _PyLong_Copy((PyLongObject *)n));
3067 if (n == NULL) {
3068 return NULL;
3069 }
3070 }
3071 k = PyNumber_Index(k);
3072 if (k == NULL) {
3073 Py_DECREF(n);
3074 return NULL;
3075 }
3076 if (!PyLong_CheckExact(k)) {
3077 Py_SETREF(k, _PyLong_Copy((PyLongObject *)k));
3078 if (k == NULL) {
3079 Py_DECREF(n);
3080 return NULL;
3081 }
3082 }
3083
3084 if (Py_SIZE(n) < 0) {
3085 PyErr_SetString(PyExc_ValueError,
3086 "n must be a non-negative integer");
3087 goto error;
3088 }
3089 if (Py_SIZE(k) < 0) {
3090 PyErr_SetString(PyExc_ValueError,
3091 "k must be a non-negative integer");
3092 goto error;
3093 }
3094
3095 cmp = PyObject_RichCompareBool(n, k, Py_LT);
3096 if (cmp != 0) {
3097 if (cmp > 0) {
3098 result = PyLong_FromLong(0);
3099 goto done;
3100 }
3101 goto error;
3102 }
3103
3104 factors = PyLong_AsLongLongAndOverflow(k, &overflow);
3105 if (overflow > 0) {
3106 PyErr_Format(PyExc_OverflowError,
3107 "k must not exceed %lld",
3108 LLONG_MAX);
3109 goto error;
3110 }
3111 else if (factors == -1) {
3112 /* k is nonnegative, so a return value of -1 can only indicate error */
3113 goto error;
3114 }
3115
3116 if (factors == 0) {
3117 result = PyLong_FromLong(1);
3118 goto done;
3119 }
3120
3121 result = n;
3122 Py_INCREF(result);
3123 if (factors == 1) {
3124 goto done;
3125 }
3126
3127 factor = n;
3128 Py_INCREF(factor);
3129 for (i = 1; i < factors; ++i) {
3130 Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One));
3131 if (factor == NULL) {
3132 goto error;
3133 }
3134 Py_SETREF(result, PyNumber_Multiply(result, factor));
3135 if (result == NULL) {
3136 goto error;
3137 }
3138 }
3139 Py_DECREF(factor);
3140
3141 done:
3142 Py_DECREF(n);
3143 Py_DECREF(k);
3144 return result;
3145
3146 error:
3147 Py_XDECREF(factor);
3148 Py_XDECREF(result);
3149 Py_DECREF(n);
3150 Py_DECREF(k);
3151 return NULL;
3152 }
3153
3154
3155 /*[clinic input]
3156 math.comb
3157
3158 n: object
3159 k: object
3160 /
3161
3162 Number of ways to choose k items from n items without repetition and without order.
3163
3164 Evaluates to n! / (k! * (n - k)!) when k <= n and evaluates
3165 to zero when k > n.
3166
3167 Also called the binomial coefficient because it is equivalent
3168 to the coefficient of k-th term in polynomial expansion of the
3169 expression (1 + x)**n.
3170
3171 Raises TypeError if either of the arguments are not integers.
3172 Raises ValueError if either of the arguments are negative.
3173
3174 [clinic start generated code]*/
3175
3176 static PyObject *
math_comb_impl(PyObject * module,PyObject * n,PyObject * k)3177 math_comb_impl(PyObject *module, PyObject *n, PyObject *k)
3178 /*[clinic end generated code: output=bd2cec8d854f3493 input=9a05315af2518709]*/
3179 {
3180 PyObject *result = NULL, *factor = NULL, *temp;
3181 int overflow, cmp;
3182 long long i, factors;
3183
3184 n = PyNumber_Index(n);
3185 if (n == NULL) {
3186 return NULL;
3187 }
3188 if (!PyLong_CheckExact(n)) {
3189 Py_SETREF(n, _PyLong_Copy((PyLongObject *)n));
3190 if (n == NULL) {
3191 return NULL;
3192 }
3193 }
3194 k = PyNumber_Index(k);
3195 if (k == NULL) {
3196 Py_DECREF(n);
3197 return NULL;
3198 }
3199 if (!PyLong_CheckExact(k)) {
3200 Py_SETREF(k, _PyLong_Copy((PyLongObject *)k));
3201 if (k == NULL) {
3202 Py_DECREF(n);
3203 return NULL;
3204 }
3205 }
3206
3207 if (Py_SIZE(n) < 0) {
3208 PyErr_SetString(PyExc_ValueError,
3209 "n must be a non-negative integer");
3210 goto error;
3211 }
3212 if (Py_SIZE(k) < 0) {
3213 PyErr_SetString(PyExc_ValueError,
3214 "k must be a non-negative integer");
3215 goto error;
3216 }
3217
3218 /* k = min(k, n - k) */
3219 temp = PyNumber_Subtract(n, k);
3220 if (temp == NULL) {
3221 goto error;
3222 }
3223 if (Py_SIZE(temp) < 0) {
3224 Py_DECREF(temp);
3225 result = PyLong_FromLong(0);
3226 goto done;
3227 }
3228 cmp = PyObject_RichCompareBool(temp, k, Py_LT);
3229 if (cmp > 0) {
3230 Py_SETREF(k, temp);
3231 }
3232 else {
3233 Py_DECREF(temp);
3234 if (cmp < 0) {
3235 goto error;
3236 }
3237 }
3238
3239 factors = PyLong_AsLongLongAndOverflow(k, &overflow);
3240 if (overflow > 0) {
3241 PyErr_Format(PyExc_OverflowError,
3242 "min(n - k, k) must not exceed %lld",
3243 LLONG_MAX);
3244 goto error;
3245 }
3246 if (factors == -1) {
3247 /* k is nonnegative, so a return value of -1 can only indicate error */
3248 goto error;
3249 }
3250
3251 if (factors == 0) {
3252 result = PyLong_FromLong(1);
3253 goto done;
3254 }
3255
3256 result = n;
3257 Py_INCREF(result);
3258 if (factors == 1) {
3259 goto done;
3260 }
3261
3262 factor = n;
3263 Py_INCREF(factor);
3264 for (i = 1; i < factors; ++i) {
3265 Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One));
3266 if (factor == NULL) {
3267 goto error;
3268 }
3269 Py_SETREF(result, PyNumber_Multiply(result, factor));
3270 if (result == NULL) {
3271 goto error;
3272 }
3273
3274 temp = PyLong_FromUnsignedLongLong((unsigned long long)i + 1);
3275 if (temp == NULL) {
3276 goto error;
3277 }
3278 Py_SETREF(result, PyNumber_FloorDivide(result, temp));
3279 Py_DECREF(temp);
3280 if (result == NULL) {
3281 goto error;
3282 }
3283 }
3284 Py_DECREF(factor);
3285
3286 done:
3287 Py_DECREF(n);
3288 Py_DECREF(k);
3289 return result;
3290
3291 error:
3292 Py_XDECREF(factor);
3293 Py_XDECREF(result);
3294 Py_DECREF(n);
3295 Py_DECREF(k);
3296 return NULL;
3297 }
3298
3299
3300 static PyMethodDef math_methods[] = {
3301 {"acos", math_acos, METH_O, math_acos_doc},
3302 {"acosh", math_acosh, METH_O, math_acosh_doc},
3303 {"asin", math_asin, METH_O, math_asin_doc},
3304 {"asinh", math_asinh, METH_O, math_asinh_doc},
3305 {"atan", math_atan, METH_O, math_atan_doc},
3306 {"atan2", (PyCFunction)(void(*)(void))math_atan2, METH_FASTCALL, math_atan2_doc},
3307 {"atanh", math_atanh, METH_O, math_atanh_doc},
3308 MATH_CEIL_METHODDEF
3309 {"copysign", (PyCFunction)(void(*)(void))math_copysign, METH_FASTCALL, math_copysign_doc},
3310 {"cos", math_cos, METH_O, math_cos_doc},
3311 {"cosh", math_cosh, METH_O, math_cosh_doc},
3312 MATH_DEGREES_METHODDEF
3313 MATH_DIST_METHODDEF
3314 {"erf", math_erf, METH_O, math_erf_doc},
3315 {"erfc", math_erfc, METH_O, math_erfc_doc},
3316 {"exp", math_exp, METH_O, math_exp_doc},
3317 {"expm1", math_expm1, METH_O, math_expm1_doc},
3318 {"fabs", math_fabs, METH_O, math_fabs_doc},
3319 MATH_FACTORIAL_METHODDEF
3320 MATH_FLOOR_METHODDEF
3321 MATH_FMOD_METHODDEF
3322 MATH_FREXP_METHODDEF
3323 MATH_FSUM_METHODDEF
3324 {"gamma", math_gamma, METH_O, math_gamma_doc},
3325 MATH_GCD_METHODDEF
3326 {"hypot", (PyCFunction)(void(*)(void))math_hypot, METH_FASTCALL, math_hypot_doc},
3327 MATH_ISCLOSE_METHODDEF
3328 MATH_ISFINITE_METHODDEF
3329 MATH_ISINF_METHODDEF
3330 MATH_ISNAN_METHODDEF
3331 MATH_ISQRT_METHODDEF
3332 MATH_LDEXP_METHODDEF
3333 {"lgamma", math_lgamma, METH_O, math_lgamma_doc},
3334 MATH_LOG_METHODDEF
3335 {"log1p", math_log1p, METH_O, math_log1p_doc},
3336 MATH_LOG10_METHODDEF
3337 MATH_LOG2_METHODDEF
3338 MATH_MODF_METHODDEF
3339 MATH_POW_METHODDEF
3340 MATH_RADIANS_METHODDEF
3341 {"remainder", (PyCFunction)(void(*)(void))math_remainder, METH_FASTCALL, math_remainder_doc},
3342 {"sin", math_sin, METH_O, math_sin_doc},
3343 {"sinh", math_sinh, METH_O, math_sinh_doc},
3344 {"sqrt", math_sqrt, METH_O, math_sqrt_doc},
3345 {"tan", math_tan, METH_O, math_tan_doc},
3346 {"tanh", math_tanh, METH_O, math_tanh_doc},
3347 MATH_TRUNC_METHODDEF
3348 MATH_PROD_METHODDEF
3349 MATH_PERM_METHODDEF
3350 MATH_COMB_METHODDEF
3351 {NULL, NULL} /* sentinel */
3352 };
3353
3354
3355 PyDoc_STRVAR(module_doc,
3356 "This module provides access to the mathematical functions\n"
3357 "defined by the C standard.");
3358
3359
3360 static struct PyModuleDef mathmodule = {
3361 PyModuleDef_HEAD_INIT,
3362 "math",
3363 module_doc,
3364 -1,
3365 math_methods,
3366 NULL,
3367 NULL,
3368 NULL,
3369 NULL
3370 };
3371
3372 PyMODINIT_FUNC
PyInit_math(void)3373 PyInit_math(void)
3374 {
3375 PyObject *m;
3376
3377 m = PyModule_Create(&mathmodule);
3378 if (m == NULL)
3379 goto finally;
3380
3381 PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));
3382 PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
3383 PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */
3384 PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf()));
3385 #if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN)
3386 PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan()));
3387 #endif
3388
3389 finally:
3390 return m;
3391 }
3392