blob: eaaeedbef3823b4a08d55e4125469d4d21f82c0b [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Math module -- standard C math library functions, pi and e */
2
Christian Heimes53876d92008-04-19 00:31:39 +00003/* Here are some comments from Tim Peters, extracted from the
4 discussion attached to http://bugs.python.org/issue1640. They
5 describe the general aims of the math module with respect to
6 special values, IEEE-754 floating-point exceptions, and Python
7 exceptions.
8
9These are the "spirit of 754" rules:
10
111. If the mathematical result is a real number, but of magnitude too
12large to approximate by a machine float, overflow is signaled and the
13result is an infinity (with the appropriate sign).
14
152. If the mathematical result is a real number, but of magnitude too
16small to approximate by a machine float, underflow is signaled and the
17result is a zero (with the appropriate sign).
18
193. At a singularity (a value x such that the limit of f(y) as y
20approaches x exists and is an infinity), "divide by zero" is signaled
21and the result is an infinity (with the appropriate sign). This is
22complicated a little by that the left-side and right-side limits may
23not be the same; e.g., 1/x approaches +inf or -inf as x approaches 0
24from the positive or negative directions. In that specific case, the
25sign of the zero determines the result of 1/0.
26
274. At a point where a function has no defined result in the extended
28reals (i.e., the reals plus an infinity or two), invalid operation is
29signaled and a NaN is returned.
30
31And these are what Python has historically /tried/ to do (but not
32always successfully, as platform libm behavior varies a lot):
33
34For #1, raise OverflowError.
35
36For #2, return a zero (with the appropriate sign if that happens by
37accident ;-)).
38
39For #3 and #4, raise ValueError. It may have made sense to raise
40Python's ZeroDivisionError in #3, but historically that's only been
41raised for division by zero and mod by zero.
42
43*/
44
45/*
46 In general, on an IEEE-754 platform the aim is to follow the C99
47 standard, including Annex 'F', whenever possible. Where the
48 standard recommends raising the 'divide-by-zero' or 'invalid'
49 floating-point exceptions, Python should raise a ValueError. Where
50 the standard recommends raising 'overflow', Python should raise an
51 OverflowError. In all other circumstances a value should be
52 returned.
53 */
54
Barry Warsaw8b43b191996-12-09 22:32:36 +000055#include "Python.h"
Mark Dickinson664b5112009-12-16 20:23:42 +000056#include "_math.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057
Serhiy Storchakac9ea9332017-01-19 18:13:09 +020058#include "clinic/mathmodule.c.h"
59
60/*[clinic input]
61module math
62[clinic start generated code]*/
63/*[clinic end generated code: output=da39a3ee5e6b4b0d input=76bc7002685dd942]*/
64
65
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000066/*
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*/
Tim Petersa40c7932001-09-05 22:36:56 +000072
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000073static const double pi = 3.141592653589793238462643383279502884197;
Mark Dickinson9c91eb82010-07-07 16:17:31 +000074static const double logpi = 1.144729885849400174143427351353058711647;
Louie Lu7a264642017-03-31 01:05:10 +080075#if !defined(HAVE_ERF) || !defined(HAVE_ERFC)
76static const double sqrtpi = 1.772453850905516027298167483341145182798;
77#endif /* !defined(HAVE_ERF) || !defined(HAVE_ERFC) */
Mark Dickinson12c4bdb2009-09-28 19:21:11 +000078
Raymond Hettingercfd735e2019-01-29 20:39:53 -080079
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
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000102static double
Dima Pasechnikf57cd822019-02-26 06:36:11 +0000103m_sinpi(double x)
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 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:
Barry Warsawb2e57942017-09-14 18:13:16 -0700131 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 }
133 return copysign(1.0, x)*r;
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000134}
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
194static const double lanczos_g = 6.024680040776729583740234375;
195static const double lanczos_g_minus_half = 5.524680040776729583740234375;
196static const double lanczos_num_coeffs[LANCZOS_N] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 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
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000210};
211
212/* denominator is x*(x+1)*...*(x+LANCZOS_N-2) */
213static const double lanczos_den_coeffs[LANCZOS_N] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 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};
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000216
217/* gamma values for small positive integers, 1 though NGAMMA_INTEGRAL */
218#define NGAMMA_INTEGRAL 23
219static const double gamma_integral[NGAMMA_INTEGRAL] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 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,
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000225};
226
227/* Lanczos' sum L_g(x), for positive x */
228
229static double
230lanczos_sum(double x)
231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 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;
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000256}
257
Mark Dickinsona5d0c7c2015-01-11 11:55:29 +0000258/* Constant for +infinity, generated in the same way as float('inf'). */
259
260static double
261m_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
275static double
276m_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
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000287static double
288m_tgamma(double x)
289{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 double absx, r, y, z, sqrtpow;
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 /* 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;
Mark Dickinson50203a62011-09-25 15:26:43 +0100303 /* tgamma(+-0.0) = +-inf, divide-by-zero */
304 return copysign(Py_HUGE_VAL, x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 }
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 /* 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);
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 /* 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 }
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 /* 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) {
Dima Pasechnikf57cd822019-02-26 06:36:11 +0000331 return 0.0/m_sinpi(x);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 }
333 else {
334 errno = ERANGE;
335 return Py_HUGE_VAL;
336 }
337 }
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 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) {
Dima Pasechnikf57cd822019-02-26 06:36:11 +0000355 r = -pi / m_sinpi(absx) / absx * exp(y) / lanczos_sum(absx);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 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;
Guido van Rossum8832b621991-12-16 15:44:24 +0000381}
382
Christian Heimes53876d92008-04-19 00:31:39 +0000383/*
Mark Dickinson05d2e082009-12-11 20:17:17 +0000384 lgamma: natural log of the absolute value of the Gamma function.
385 For large arguments, Lanczos' formula works extremely well here.
386*/
387
388static double
389m_lgamma(double x)
390{
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200391 double r;
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200392 double absx;
Mark Dickinson05d2e082009-12-11 20:17:17 +0000393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 /* 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 }
Mark Dickinson05d2e082009-12-11 20:17:17 +0000401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 /* 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 }
Mark Dickinson05d2e082009-12-11 20:17:17 +0000412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 absx = fabs(x);
414 /* tiny arguments: lgamma(x) ~ -log(fabs(x)) for small x */
415 if (absx < 1e-20)
416 return -log(absx);
Mark Dickinson05d2e082009-12-11 20:17:17 +0000417
Mark Dickinson9c91eb82010-07-07 16:17:31 +0000418 /* 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. */
Dima Pasechnikf57cd822019-02-26 06:36:11 +0000426 r = logpi - log(fabs(m_sinpi(absx))) - log(absx) - r;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 if (Py_IS_INFINITY(r))
428 errno = ERANGE;
429 return r;
Mark Dickinson05d2e082009-12-11 20:17:17 +0000430}
431
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200432#if !defined(HAVE_ERF) || !defined(HAVE_ERFC)
433
Mark Dickinson45f992a2009-12-19 11:20:49 +0000434/*
435 Implementations of the error function erf(x) and the complementary error
436 function erfc(x).
437
Brett Cannon45adb312016-01-15 09:38:24 -0800438 Method: we use a series approximation for erf for small x, and a continued
439 fraction approximation for erfc(x) for larger x;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000440 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
483static double
484m_erf_series(double x)
485{
Mark Dickinsonbcdf9da2010-06-13 10:52:38 +0000486 double x2, acc, fk, result;
487 int i, saved_errno;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 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 }
Mark Dickinsonbcdf9da2010-06-13 10:52:38 +0000496 /* 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;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000502}
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
513static double
514m_erfc_contfrac(double x)
515{
Mark Dickinsonbcdf9da2010-06-13 10:52:38 +0000516 double x2, a, da, p, p_last, q, q_last, b, result;
517 int i, saved_errno;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 if (x >= ERFC_CONTFRAC_CUTOFF)
520 return 0.0;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 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 }
Mark Dickinsonbcdf9da2010-06-13 10:52:38 +0000535 /* 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;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000541}
542
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200543#endif /* !defined(HAVE_ERF) || !defined(HAVE_ERFC) */
544
Mark Dickinson45f992a2009-12-19 11:20:49 +0000545/* Error function erf(x), for general x */
546
547static double
548m_erf(double x)
549{
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200550#ifdef HAVE_ERF
551 return erf(x);
552#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 double absx, cf;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 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 }
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200564#endif
Mark Dickinson45f992a2009-12-19 11:20:49 +0000565}
566
567/* Complementary error function erfc(x), for general x. */
568
569static double
570m_erfc(double x)
571{
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200572#ifdef HAVE_ERFC
573 return erfc(x);
574#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 double absx, cf;
Mark Dickinson45f992a2009-12-19 11:20:49 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 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 }
Serhiy Storchaka97553fd2017-03-11 23:37:16 +0200586#endif
Mark Dickinson45f992a2009-12-19 11:20:49 +0000587}
Mark Dickinson05d2e082009-12-11 20:17:17 +0000588
589/*
Christian Heimese57950f2008-04-21 13:08:03 +0000590 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
597static double
598m_atan2(double y, double x)
599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 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);
Christian Heimese57950f2008-04-21 13:08:03 +0000623}
624
Mark Dickinsona0ce3752017-04-05 18:34:27 +0100625
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
630static double
631m_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
Mark Dickinson01484702019-07-13 16:50:03 +0100649 can't be sure that 0.5*absy is representable (the multiplication
Mark Dickinsona0ce3752017-04-05 18:34:27 +0100650 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
Christian Heimese57950f2008-04-21 13:08:03 +0000721/*
Mark Dickinsone675f082008-12-11 21:56:00 +0000722 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
728static double
729m_log(double x)
730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 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 }
Mark Dickinsone675f082008-12-11 21:56:00 +0000748}
749
Victor Stinnerfa0e3d52011-05-09 01:01:09 +0200750/*
751 log2: log to base 2.
752
753 Uses an algorithm that should:
Mark Dickinson83b8c0b2011-05-09 08:40:20 +0100754
Victor Stinnerfa0e3d52011-05-09 01:01:09 +0200755 (a) produce exact results for powers of 2, and
Mark Dickinson83b8c0b2011-05-09 08:40:20 +0100756 (b) give a monotonic log2 (for positive finite floats),
757 assuming that the system log is monotonic.
Victor Stinnerfa0e3d52011-05-09 01:01:09 +0200758*/
759
760static double
761m_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) {
Victor Stinner8f9f8d62011-05-09 12:45:41 +0200775#ifdef HAVE_LOG2
776 return log2(x);
777#else
Victor Stinnerfa0e3d52011-05-09 01:01:09 +0200778 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 }
Victor Stinner8f9f8d62011-05-09 12:45:41 +0200793#endif
Victor Stinnerfa0e3d52011-05-09 01:01:09 +0200794 }
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;
Mark Dickinson23442582011-05-09 08:05:00 +0100801 return Py_NAN; /* log2(-inf) = nan, invalid-operation */
Victor Stinnerfa0e3d52011-05-09 01:01:09 +0200802 }
803}
804
Mark Dickinsone675f082008-12-11 21:56:00 +0000805static double
806m_log10(double x)
807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 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 }
Mark Dickinsone675f082008-12-11 21:56:00 +0000825}
826
827
Serhiy Storchakac9ea9332017-01-19 18:13:09 +0200828/*[clinic input]
829math.gcd
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300830
Serhiy Storchakac9ea9332017-01-19 18:13:09 +0200831 x as a: object
832 y as b: object
833 /
834
835greatest common divisor of x and y
836[clinic start generated code]*/
837
838static PyObject *
839math_gcd_impl(PyObject *module, PyObject *a, PyObject *b)
840/*[clinic end generated code: output=7b2e0c151bd7a5d8 input=c2691e57fb2a98fa]*/
841{
842 PyObject *g;
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300843
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
Serhiy Storchaka48e47aa2015-05-13 00:19:51 +0300858
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000859/* 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 */
863static int
864is_error(double x)
865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 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");
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 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;
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000897}
898
Mark Dickinsone675f082008-12-11 21:56:00 +0000899/*
Christian Heimes53876d92008-04-19 00:31:39 +0000900 math_1 is used to wrap a libm function f that takes a double
Serhiy Storchakac9ea9332017-01-19 18:13:09 +0200901 argument and returns a double.
Christian Heimes53876d92008-04-19 00:31:39 +0000902
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
Barry Warsaw8b43b191996-12-09 22:32:36 +0000929static PyObject *
Jeffrey Yasskinc2155832008-01-05 20:03:11 +0000930math_1_to_whatever(PyObject *arg, double (*func) (double),
Christian Heimes53876d92008-04-19 00:31:39 +0000931 PyObject *(*from_double_func) (double),
932 int can_overflow)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 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)) {
Benjamin Peterson2354a752012-03-13 16:13:09 -0500948 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;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 }
956 if (Py_IS_FINITE(r) && errno && is_error(r))
957 /* this branch unnecessary on most platforms */
958 return NULL;
Mark Dickinsonde429622008-05-01 00:19:23 +0000959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 return (*from_double_func)(r);
Christian Heimes53876d92008-04-19 00:31:39 +0000961}
962
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000963/* 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
967static PyObject *
968math_1a(PyObject *arg, double (*func) (double))
969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 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);
Mark Dickinson12c4bdb2009-09-28 19:21:11 +0000981}
982
Christian Heimes53876d92008-04-19 00:31:39 +0000983/*
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
1010static PyObject *
1011math_1(PyObject *arg, double (*func) (double), int can_overflow)
1012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 return math_1_to_whatever(arg, func, PyFloat_FromDouble, can_overflow);
Jeffrey Yasskinc2155832008-01-05 20:03:11 +00001014}
1015
1016static PyObject *
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02001017math_2(PyObject *const *args, Py_ssize_t nargs,
1018 double (*func) (double, double), const char *funcname)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 double x, y, r;
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02001021 if (!_PyArg_CheckPositional(funcname, nargs, 2, 2))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 return NULL;
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02001023 x = PyFloat_AsDouble(args[0]);
1024 y = PyFloat_AsDouble(args[1]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
1026 return NULL;
1027 errno = 0;
1028 PyFPE_START_PROTECT("in math_2", return 0);
1029 r = (*func)(x, y);
1030 PyFPE_END_PROTECT(r);
1031 if (Py_IS_NAN(r)) {
1032 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
1033 errno = EDOM;
1034 else
1035 errno = 0;
1036 }
1037 else if (Py_IS_INFINITY(r)) {
1038 if (Py_IS_FINITE(x) && Py_IS_FINITE(y))
1039 errno = ERANGE;
1040 else
1041 errno = 0;
1042 }
1043 if (errno && is_error(r))
1044 return NULL;
1045 else
1046 return PyFloat_FromDouble(r);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001047}
1048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049#define FUNC1(funcname, func, can_overflow, docstring) \
1050 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
1051 return math_1(args, func, can_overflow); \
1052 }\
1053 PyDoc_STRVAR(math_##funcname##_doc, docstring);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055#define FUNC1A(funcname, func, docstring) \
1056 static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
1057 return math_1a(args, func); \
1058 }\
1059 PyDoc_STRVAR(math_##funcname##_doc, docstring);
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001060
Fred Drake40c48682000-07-03 18:11:56 +00001061#define FUNC2(funcname, func, docstring) \
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02001062 static PyObject * math_##funcname(PyObject *self, PyObject *const *args, Py_ssize_t nargs) { \
1063 return math_2(args, nargs, func, #funcname); \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 }\
1065 PyDoc_STRVAR(math_##funcname##_doc, docstring);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001066
Christian Heimes53876d92008-04-19 00:31:39 +00001067FUNC1(acos, acos, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001068 "acos($module, x, /)\n--\n\n"
Giovanni Cappellottodc3f99f2019-07-13 09:59:55 -04001069 "Return the arc cosine (measured in radians) of x.\n\n"
1070 "The result is between 0 and pi.")
Mark Dickinsonf3718592009-12-21 15:27:41 +00001071FUNC1(acosh, m_acosh, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001072 "acosh($module, x, /)\n--\n\n"
1073 "Return the inverse hyperbolic cosine of x.")
Christian Heimes53876d92008-04-19 00:31:39 +00001074FUNC1(asin, asin, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001075 "asin($module, x, /)\n--\n\n"
Giovanni Cappellottodc3f99f2019-07-13 09:59:55 -04001076 "Return the arc sine (measured in radians) of x.\n\n"
1077 "The result is between -pi/2 and pi/2.")
Mark Dickinsonf3718592009-12-21 15:27:41 +00001078FUNC1(asinh, m_asinh, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001079 "asinh($module, x, /)\n--\n\n"
1080 "Return the inverse hyperbolic sine of x.")
Christian Heimes53876d92008-04-19 00:31:39 +00001081FUNC1(atan, atan, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001082 "atan($module, x, /)\n--\n\n"
Giovanni Cappellottodc3f99f2019-07-13 09:59:55 -04001083 "Return the arc tangent (measured in radians) of x.\n\n"
1084 "The result is between -pi/2 and pi/2.")
Christian Heimese57950f2008-04-21 13:08:03 +00001085FUNC2(atan2, m_atan2,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001086 "atan2($module, y, x, /)\n--\n\n"
1087 "Return the arc tangent (measured in radians) of y/x.\n\n"
Tim Petersfe71f812001-08-07 22:10:00 +00001088 "Unlike atan(y/x), the signs of both x and y are considered.")
Mark Dickinsonf3718592009-12-21 15:27:41 +00001089FUNC1(atanh, m_atanh, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001090 "atanh($module, x, /)\n--\n\n"
1091 "Return the inverse hyperbolic tangent of x.")
Guido van Rossum13e05de2007-08-23 22:56:55 +00001092
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001093/*[clinic input]
1094math.ceil
1095
1096 x as number: object
1097 /
1098
1099Return the ceiling of x as an Integral.
1100
1101This is the smallest integer >= x.
1102[clinic start generated code]*/
1103
1104static PyObject *
1105math_ceil(PyObject *module, PyObject *number)
1106/*[clinic end generated code: output=6c3b8a78bc201c67 input=2725352806399cab]*/
1107{
Benjamin Petersonce798522012-01-22 11:24:29 -05001108 _Py_IDENTIFIER(__ceil__);
Guido van Rossum13e05de2007-08-23 22:56:55 +00001109
Serhiy Storchaka5fd5cb82019-11-16 18:00:57 +02001110 if (!PyFloat_CheckExact(number)) {
1111 PyObject *method = _PyObject_LookupSpecial(number, &PyId___ceil__);
1112 if (method != NULL) {
1113 PyObject *result = _PyObject_CallNoArg(method);
1114 Py_DECREF(method);
1115 return result;
1116 }
Benjamin Petersonf751bc92010-07-02 13:46:42 +00001117 if (PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 return NULL;
Benjamin Petersonf751bc92010-07-02 13:46:42 +00001119 }
Serhiy Storchaka5fd5cb82019-11-16 18:00:57 +02001120 double x = PyFloat_AsDouble(number);
1121 if (x == -1.0 && PyErr_Occurred())
1122 return NULL;
1123
1124 return PyLong_FromDouble(ceil(x));
Guido van Rossum13e05de2007-08-23 22:56:55 +00001125}
1126
Christian Heimes072c0f12008-01-03 23:01:04 +00001127FUNC2(copysign, copysign,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001128 "copysign($module, x, y, /)\n--\n\n"
1129 "Return a float with the magnitude (absolute value) of x but the sign of y.\n\n"
1130 "On platforms that support signed zeros, copysign(1.0, -0.0)\n"
1131 "returns -1.0.\n")
Christian Heimes53876d92008-04-19 00:31:39 +00001132FUNC1(cos, cos, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001133 "cos($module, x, /)\n--\n\n"
1134 "Return the cosine of x (measured in radians).")
Christian Heimes53876d92008-04-19 00:31:39 +00001135FUNC1(cosh, cosh, 1,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001136 "cosh($module, x, /)\n--\n\n"
1137 "Return the hyperbolic cosine of x.")
Mark Dickinson45f992a2009-12-19 11:20:49 +00001138FUNC1A(erf, m_erf,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001139 "erf($module, x, /)\n--\n\n"
1140 "Error function at x.")
Mark Dickinson45f992a2009-12-19 11:20:49 +00001141FUNC1A(erfc, m_erfc,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001142 "erfc($module, x, /)\n--\n\n"
1143 "Complementary error function at x.")
Christian Heimes53876d92008-04-19 00:31:39 +00001144FUNC1(exp, exp, 1,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001145 "exp($module, x, /)\n--\n\n"
1146 "Return e raised to the power of x.")
Mark Dickinson664b5112009-12-16 20:23:42 +00001147FUNC1(expm1, m_expm1, 1,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001148 "expm1($module, x, /)\n--\n\n"
1149 "Return exp(x)-1.\n\n"
Mark Dickinson664b5112009-12-16 20:23:42 +00001150 "This function avoids the loss of precision involved in the direct "
1151 "evaluation of exp(x)-1 for small x.")
Christian Heimes53876d92008-04-19 00:31:39 +00001152FUNC1(fabs, fabs, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001153 "fabs($module, x, /)\n--\n\n"
1154 "Return the absolute value of the float x.")
Guido van Rossum13e05de2007-08-23 22:56:55 +00001155
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001156/*[clinic input]
1157math.floor
1158
1159 x as number: object
1160 /
1161
1162Return the floor of x as an Integral.
1163
1164This is the largest integer <= x.
1165[clinic start generated code]*/
1166
1167static PyObject *
1168math_floor(PyObject *module, PyObject *number)
1169/*[clinic end generated code: output=c6a65c4884884b8a input=63af6b5d7ebcc3d6]*/
1170{
Benjamin Petersonce798522012-01-22 11:24:29 -05001171 _Py_IDENTIFIER(__floor__);
Guido van Rossum13e05de2007-08-23 22:56:55 +00001172
Serhiy Storchaka5fd5cb82019-11-16 18:00:57 +02001173 if (!PyFloat_CheckExact(number)) {
1174 PyObject *method = _PyObject_LookupSpecial(number, &PyId___floor__);
1175 if (method != NULL) {
1176 PyObject *result = _PyObject_CallNoArg(method);
1177 Py_DECREF(method);
1178 return result;
1179 }
Benjamin Peterson8bb9cde2010-07-01 15:16:55 +00001180 if (PyErr_Occurred())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001181 return NULL;
Benjamin Peterson8bb9cde2010-07-01 15:16:55 +00001182 }
Serhiy Storchaka5fd5cb82019-11-16 18:00:57 +02001183 double x = PyFloat_AsDouble(number);
1184 if (x == -1.0 && PyErr_Occurred())
1185 return NULL;
1186
1187 return PyLong_FromDouble(floor(x));
Guido van Rossum13e05de2007-08-23 22:56:55 +00001188}
1189
Mark Dickinson12c4bdb2009-09-28 19:21:11 +00001190FUNC1A(gamma, m_tgamma,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001191 "gamma($module, x, /)\n--\n\n"
1192 "Gamma function at x.")
Mark Dickinson05d2e082009-12-11 20:17:17 +00001193FUNC1A(lgamma, m_lgamma,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001194 "lgamma($module, x, /)\n--\n\n"
1195 "Natural logarithm of absolute value of Gamma function at x.")
Mark Dickinsonbe64d952010-07-07 16:21:29 +00001196FUNC1(log1p, m_log1p, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001197 "log1p($module, x, /)\n--\n\n"
1198 "Return the natural logarithm of 1+x (base e).\n\n"
Benjamin Petersona0dfa822009-11-13 02:25:08 +00001199 "The result is computed in a way which is accurate for x near zero.")
Mark Dickinsona0ce3752017-04-05 18:34:27 +01001200FUNC2(remainder, m_remainder,
1201 "remainder($module, x, y, /)\n--\n\n"
1202 "Difference between x and the closest integer multiple of y.\n\n"
1203 "Return x - n*y where n*y is the closest integer multiple of y.\n"
1204 "In the case where x is exactly halfway between two multiples of\n"
1205 "y, the nearest even value of n is used. The result is always exact.")
Christian Heimes53876d92008-04-19 00:31:39 +00001206FUNC1(sin, sin, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001207 "sin($module, x, /)\n--\n\n"
1208 "Return the sine of x (measured in radians).")
Christian Heimes53876d92008-04-19 00:31:39 +00001209FUNC1(sinh, sinh, 1,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001210 "sinh($module, x, /)\n--\n\n"
1211 "Return the hyperbolic sine of x.")
Christian Heimes53876d92008-04-19 00:31:39 +00001212FUNC1(sqrt, sqrt, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001213 "sqrt($module, x, /)\n--\n\n"
1214 "Return the square root of x.")
Christian Heimes53876d92008-04-19 00:31:39 +00001215FUNC1(tan, tan, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001216 "tan($module, x, /)\n--\n\n"
1217 "Return the tangent of x (measured in radians).")
Christian Heimes53876d92008-04-19 00:31:39 +00001218FUNC1(tanh, tanh, 0,
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001219 "tanh($module, x, /)\n--\n\n"
1220 "Return the hyperbolic tangent of x.")
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001221
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001222/* Precision summation function as msum() by Raymond Hettinger in
1223 <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393090>,
1224 enhanced with the exact partials sum and roundoff from Mark
1225 Dickinson's post at <http://bugs.python.org/file10357/msum4.py>.
1226 See those links for more details, proofs and other references.
1227
1228 Note 1: IEEE 754R floating point semantics are assumed,
1229 but the current implementation does not re-establish special
1230 value semantics across iterations (i.e. handling -Inf + Inf).
1231
1232 Note 2: No provision is made for intermediate overflow handling;
Georg Brandlf78e02b2008-06-10 17:40:04 +00001233 therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001234 sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the
1235 overflow of the first partial sum.
1236
Benjamin Petersonfea6a942008-07-02 16:11:42 +00001237 Note 3: The intermediate values lo, yr, and hi are declared volatile so
1238 aggressive compilers won't algebraically reduce lo to always be exactly 0.0.
Georg Brandlf78e02b2008-06-10 17:40:04 +00001239 Also, the volatile declaration forces the values to be stored in memory as
1240 regular doubles instead of extended long precision (80-bit) values. This
Benjamin Petersonfea6a942008-07-02 16:11:42 +00001241 prevents double rounding because any addition or subtraction of two doubles
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 can be resolved exactly into double-sized hi and lo values. As long as the
Georg Brandlf78e02b2008-06-10 17:40:04 +00001243 hi value gets forced into a double before yr and lo are computed, the extra
1244 bits in downstream extended precision operations (x87 for example) will be
1245 exactly zero and therefore can be losslessly stored back into a double,
1246 thereby preventing double rounding.
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001247
1248 Note 4: A similar implementation is in Modules/cmathmodule.c.
1249 Be sure to update both when making changes.
1250
Serhiy Storchakaa60c2fe2015-03-12 21:56:08 +02001251 Note 5: The signature of math.fsum() differs from builtins.sum()
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001252 because the start argument doesn't make sense in the context of
1253 accurate summation. Since the partials table is collapsed before
1254 returning a result, sum(seq2, start=sum(seq1)) may not equal the
1255 accurate result returned by sum(itertools.chain(seq1, seq2)).
1256*/
1257
1258#define NUM_PARTIALS 32 /* initial partials array size, on stack */
1259
1260/* Extend the partials array p[] by doubling its size. */
1261static int /* non-zero on error */
Mark Dickinsonaa7633a2008-08-01 08:16:13 +00001262_fsum_realloc(double **p_ptr, Py_ssize_t n,
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001263 double *ps, Py_ssize_t *m_ptr)
1264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 void *v = NULL;
1266 Py_ssize_t m = *m_ptr;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 m += m; /* double */
Victor Stinner049e5092014-08-17 22:20:00 +02001269 if (n < m && (size_t)m < ((size_t)PY_SSIZE_T_MAX / sizeof(double))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 double *p = *p_ptr;
1271 if (p == ps) {
1272 v = PyMem_Malloc(sizeof(double) * m);
1273 if (v != NULL)
1274 memcpy(v, ps, sizeof(double) * n);
1275 }
1276 else
1277 v = PyMem_Realloc(p, sizeof(double) * m);
1278 }
1279 if (v == NULL) { /* size overflow or no memory */
1280 PyErr_SetString(PyExc_MemoryError, "math.fsum partials");
1281 return 1;
1282 }
1283 *p_ptr = (double*) v;
1284 *m_ptr = m;
1285 return 0;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001286}
1287
1288/* Full precision summation of a sequence of floats.
1289
1290 def msum(iterable):
1291 partials = [] # sorted, non-overlapping partial sums
1292 for x in iterable:
Mark Dickinsonfdb0acc2010-06-25 20:22:24 +00001293 i = 0
1294 for y in partials:
1295 if abs(x) < abs(y):
1296 x, y = y, x
1297 hi = x + y
1298 lo = y - (hi - x)
1299 if lo:
1300 partials[i] = lo
1301 i += 1
1302 x = hi
1303 partials[i:] = [x]
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001304 return sum_exact(partials)
1305
1306 Rounded x+y stored in hi with the roundoff stored in lo. Together hi+lo
1307 are exactly equal to x+y. The inner loop applies hi/lo summation to each
1308 partial so that the list of partial sums remains exact.
1309
1310 Sum_exact() adds the partial sums exactly and correctly rounds the final
1311 result (using the round-half-to-even rule). The items in partials remain
1312 non-zero, non-special, non-overlapping and strictly increasing in
1313 magnitude, but possibly not all having the same sign.
1314
1315 Depends on IEEE 754 arithmetic guarantees and half-even rounding.
1316*/
1317
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001318/*[clinic input]
1319math.fsum
1320
1321 seq: object
1322 /
1323
1324Return an accurate floating point sum of values in the iterable seq.
1325
1326Assumes IEEE-754 floating point arithmetic.
1327[clinic start generated code]*/
1328
1329static PyObject *
1330math_fsum(PyObject *module, PyObject *seq)
1331/*[clinic end generated code: output=ba5c672b87fe34fc input=c51b7d8caf6f6e82]*/
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 PyObject *item, *iter, *sum = NULL;
1334 Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;
1335 double x, y, t, ps[NUM_PARTIALS], *p = ps;
1336 double xsave, special_sum = 0.0, inf_sum = 0.0;
1337 volatile double hi, yr, lo;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 iter = PyObject_GetIter(seq);
1340 if (iter == NULL)
1341 return NULL;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 for(;;) { /* for x in iterable */
1346 assert(0 <= n && n <= m);
1347 assert((m == NUM_PARTIALS && p == ps) ||
1348 (m > NUM_PARTIALS && p != NULL));
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 item = PyIter_Next(iter);
1351 if (item == NULL) {
1352 if (PyErr_Occurred())
1353 goto _fsum_error;
1354 break;
1355 }
Raymond Hettingercfd735e2019-01-29 20:39:53 -08001356 ASSIGN_DOUBLE(x, item, error_with_item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 Py_DECREF(item);
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 xsave = x;
1360 for (i = j = 0; j < n; j++) { /* for y in partials */
1361 y = p[j];
1362 if (fabs(x) < fabs(y)) {
1363 t = x; x = y; y = t;
1364 }
1365 hi = x + y;
1366 yr = hi - x;
1367 lo = y - yr;
1368 if (lo != 0.0)
1369 p[i++] = lo;
1370 x = hi;
1371 }
Mark Dickinsonaa7633a2008-08-01 08:16:13 +00001372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 n = i; /* ps[i:] = [x] */
1374 if (x != 0.0) {
1375 if (! Py_IS_FINITE(x)) {
1376 /* a nonfinite x could arise either as
1377 a result of intermediate overflow, or
1378 as a result of a nan or inf in the
1379 summands */
1380 if (Py_IS_FINITE(xsave)) {
1381 PyErr_SetString(PyExc_OverflowError,
1382 "intermediate overflow in fsum");
1383 goto _fsum_error;
1384 }
1385 if (Py_IS_INFINITY(xsave))
1386 inf_sum += xsave;
1387 special_sum += xsave;
1388 /* reset partials */
1389 n = 0;
1390 }
1391 else if (n >= m && _fsum_realloc(&p, n, ps, &m))
1392 goto _fsum_error;
1393 else
1394 p[n++] = x;
1395 }
1396 }
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 if (special_sum != 0.0) {
1399 if (Py_IS_NAN(inf_sum))
1400 PyErr_SetString(PyExc_ValueError,
1401 "-inf + inf in fsum");
1402 else
1403 sum = PyFloat_FromDouble(special_sum);
1404 goto _fsum_error;
1405 }
Mark Dickinsonaa7633a2008-08-01 08:16:13 +00001406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 hi = 0.0;
1408 if (n > 0) {
1409 hi = p[--n];
1410 /* sum_exact(ps, hi) from the top, stop when the sum becomes
1411 inexact. */
1412 while (n > 0) {
1413 x = hi;
1414 y = p[--n];
1415 assert(fabs(y) < fabs(x));
1416 hi = x + y;
1417 yr = hi - x;
1418 lo = y - yr;
1419 if (lo != 0.0)
1420 break;
1421 }
1422 /* Make half-even rounding work across multiple partials.
1423 Needed so that sum([1e-16, 1, 1e16]) will round-up the last
1424 digit to two instead of down to zero (the 1e-16 makes the 1
1425 slightly closer to two). With a potential 1 ULP rounding
1426 error fixed-up, math.fsum() can guarantee commutativity. */
1427 if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||
1428 (lo > 0.0 && p[n-1] > 0.0))) {
1429 y = lo * 2.0;
1430 x = hi + y;
1431 yr = x - hi;
1432 if (y == yr)
1433 hi = x;
1434 }
1435 }
1436 sum = PyFloat_FromDouble(hi);
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001437
Raymond Hettingercfd735e2019-01-29 20:39:53 -08001438 _fsum_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 PyFPE_END_PROTECT(hi)
1440 Py_DECREF(iter);
1441 if (p != ps)
1442 PyMem_Free(p);
1443 return sum;
Raymond Hettingercfd735e2019-01-29 20:39:53 -08001444
1445 error_with_item:
1446 Py_DECREF(item);
1447 goto _fsum_error;
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001448}
1449
1450#undef NUM_PARTIALS
1451
Benjamin Peterson2b7411d2008-05-26 17:36:47 +00001452
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001453/* Return the smallest integer k such that n < 2**k, or 0 if n == 0.
1454 * Equivalent to floor(lg(x))+1. Also equivalent to: bitwidth_of_type -
1455 * count_leading_zero_bits(x)
1456 */
1457
1458/* XXX: This routine does more or less the same thing as
1459 * bits_in_digit() in Objects/longobject.c. Someday it would be nice to
1460 * consolidate them. On BSD, there's a library function called fls()
1461 * that we could use, and GCC provides __builtin_clz().
1462 */
1463
1464static unsigned long
1465bit_length(unsigned long n)
1466{
1467 unsigned long len = 0;
1468 while (n != 0) {
1469 ++len;
1470 n >>= 1;
1471 }
1472 return len;
1473}
1474
1475static unsigned long
1476count_set_bits(unsigned long n)
1477{
1478 unsigned long count = 0;
1479 while (n != 0) {
1480 ++count;
1481 n &= n - 1; /* clear least significant bit */
1482 }
1483 return count;
1484}
1485
Mark Dickinson73934b92019-05-18 12:29:50 +01001486/* Integer square root
1487
1488Given a nonnegative integer `n`, we want to compute the largest integer
1489`a` for which `a * a <= n`, or equivalently the integer part of the exact
1490square root of `n`.
1491
1492We use an adaptive-precision pure-integer version of Newton's iteration. Given
1493a positive integer `n`, the algorithm produces at each iteration an integer
1494approximation `a` to the square root of `n >> s` for some even integer `s`,
1495with `s` decreasing as the iterations progress. On the final iteration, `s` is
1496zero and we have an approximation to the square root of `n` itself.
1497
1498At every step, the approximation `a` is strictly within 1.0 of the true square
1499root, so we have
1500
1501 (a - 1)**2 < (n >> s) < (a + 1)**2
1502
1503After the final iteration, a check-and-correct step is needed to determine
1504whether `a` or `a - 1` gives the desired integer square root of `n`.
1505
1506The algorithm is remarkable in its simplicity. There's no need for a
1507per-iteration check-and-correct step, and termination is straightforward: the
1508number of iterations is known in advance (it's exactly `floor(log2(log2(n)))`
1509for `n > 1`). The only tricky part of the correctness proof is in establishing
1510that the bound `(a - 1)**2 < (n >> s) < (a + 1)**2` is maintained from one
1511iteration to the next. A sketch of the proof of this is given below.
1512
1513In addition to the proof sketch, a formal, computer-verified proof
1514of correctness (using Lean) of an equivalent recursive algorithm can be found
1515here:
1516
1517 https://github.com/mdickinson/snippets/blob/master/proofs/isqrt/src/isqrt.lean
1518
1519
1520Here's Python code equivalent to the C implementation below:
1521
1522 def isqrt(n):
1523 """
1524 Return the integer part of the square root of the input.
1525 """
1526 n = operator.index(n)
1527
1528 if n < 0:
1529 raise ValueError("isqrt() argument must be nonnegative")
1530 if n == 0:
1531 return 0
1532
1533 c = (n.bit_length() - 1) // 2
1534 a = 1
1535 d = 0
1536 for s in reversed(range(c.bit_length())):
Mark Dickinson2dfeaa92019-06-16 17:53:21 +01001537 # Loop invariant: (a-1)**2 < (n >> 2*(c - d)) < (a+1)**2
Mark Dickinson73934b92019-05-18 12:29:50 +01001538 e = d
1539 d = c >> s
1540 a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a
Mark Dickinson73934b92019-05-18 12:29:50 +01001541
1542 return a - (a*a > n)
1543
1544
1545Sketch of proof of correctness
1546------------------------------
1547
1548The delicate part of the correctness proof is showing that the loop invariant
1549is preserved from one iteration to the next. That is, just before the line
1550
1551 a = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a
1552
1553is executed in the above code, we know that
1554
1555 (1) (a - 1)**2 < (n >> 2*(c - e)) < (a + 1)**2.
1556
1557(since `e` is always the value of `d` from the previous iteration). We must
1558prove that after that line is executed, we have
1559
1560 (a - 1)**2 < (n >> 2*(c - d)) < (a + 1)**2
1561
Min ho Kimf7d72e42019-07-06 07:39:32 +10001562To facilitate the proof, we make some changes of notation. Write `m` for
Mark Dickinson73934b92019-05-18 12:29:50 +01001563`n >> 2*(c-d)`, and write `b` for the new value of `a`, so
1564
1565 b = (a << d - e - 1) + (n >> 2*c - e - d + 1) // a
1566
1567or equivalently:
1568
1569 (2) b = (a << d - e - 1) + (m >> d - e + 1) // a
1570
1571Then we can rewrite (1) as:
1572
1573 (3) (a - 1)**2 < (m >> 2*(d - e)) < (a + 1)**2
1574
1575and we must show that (b - 1)**2 < m < (b + 1)**2.
1576
1577From this point on, we switch to mathematical notation, so `/` means exact
1578division rather than integer division and `^` is used for exponentiation. We
1579use the `√` symbol for the exact square root. In (3), we can remove the
1580implicit floor operation to give:
1581
1582 (4) (a - 1)^2 < m / 4^(d - e) < (a + 1)^2
1583
1584Taking square roots throughout (4), scaling by `2^(d-e)`, and rearranging gives
1585
1586 (5) 0 <= | 2^(d-e)a - √m | < 2^(d-e)
1587
1588Squaring and dividing through by `2^(d-e+1) a` gives
1589
1590 (6) 0 <= 2^(d-e-1) a + m / (2^(d-e+1) a) - √m < 2^(d-e-1) / a
1591
1592We'll show below that `2^(d-e-1) <= a`. Given that, we can replace the
1593right-hand side of (6) with `1`, and now replacing the central
1594term `m / (2^(d-e+1) a)` with its floor in (6) gives
1595
1596 (7) -1 < 2^(d-e-1) a + m // 2^(d-e+1) a - √m < 1
1597
1598Or equivalently, from (2):
1599
1600 (7) -1 < b - √m < 1
1601
1602and rearranging gives that `(b-1)^2 < m < (b+1)^2`, which is what we needed
1603to prove.
1604
1605We're not quite done: we still have to prove the inequality `2^(d - e - 1) <=
1606a` that was used to get line (7) above. From the definition of `c`, we have
1607`4^c <= n`, which implies
1608
1609 (8) 4^d <= m
1610
1611also, since `e == d >> 1`, `d` is at most `2e + 1`, from which it follows
1612that `2d - 2e - 1 <= d` and hence that
1613
1614 (9) 4^(2d - 2e - 1) <= m
1615
1616Dividing both sides by `4^(d - e)` gives
1617
1618 (10) 4^(d - e - 1) <= m / 4^(d - e)
1619
1620But we know from (4) that `m / 4^(d-e) < (a + 1)^2`, hence
1621
1622 (11) 4^(d - e - 1) < (a + 1)^2
1623
1624Now taking square roots of both sides and observing that both `2^(d-e-1)` and
1625`a` are integers gives `2^(d - e - 1) <= a`, which is what we needed. This
1626completes the proof sketch.
1627
1628*/
1629
Mark Dickinson5c08ce92019-05-19 17:51:56 +01001630
1631/* Approximate square root of a large 64-bit integer.
1632
1633 Given `n` satisfying `2**62 <= n < 2**64`, return `a`
1634 satisfying `(a - 1)**2 < n < (a + 1)**2`. */
1635
1636static uint64_t
1637_approximate_isqrt(uint64_t n)
1638{
1639 uint32_t u = 1U + (n >> 62);
1640 u = (u << 1) + (n >> 59) / u;
1641 u = (u << 3) + (n >> 53) / u;
1642 u = (u << 7) + (n >> 41) / u;
1643 return (u << 15) + (n >> 17) / u;
1644}
1645
Mark Dickinson73934b92019-05-18 12:29:50 +01001646/*[clinic input]
1647math.isqrt
1648
1649 n: object
1650 /
1651
1652Return the integer part of the square root of the input.
1653[clinic start generated code]*/
1654
1655static PyObject *
1656math_isqrt(PyObject *module, PyObject *n)
1657/*[clinic end generated code: output=35a6f7f980beab26 input=5b6e7ae4fa6c43d6]*/
1658{
Mark Dickinson5c08ce92019-05-19 17:51:56 +01001659 int a_too_large, c_bit_length;
Mark Dickinson73934b92019-05-18 12:29:50 +01001660 size_t c, d;
Mark Dickinson5c08ce92019-05-19 17:51:56 +01001661 uint64_t m, u;
Mark Dickinson73934b92019-05-18 12:29:50 +01001662 PyObject *a = NULL, *b;
1663
1664 n = PyNumber_Index(n);
1665 if (n == NULL) {
1666 return NULL;
1667 }
1668
1669 if (_PyLong_Sign(n) < 0) {
1670 PyErr_SetString(
1671 PyExc_ValueError,
1672 "isqrt() argument must be nonnegative");
1673 goto error;
1674 }
1675 if (_PyLong_Sign(n) == 0) {
1676 Py_DECREF(n);
1677 return PyLong_FromLong(0);
1678 }
1679
Mark Dickinson5c08ce92019-05-19 17:51:56 +01001680 /* c = (n.bit_length() - 1) // 2 */
Mark Dickinson73934b92019-05-18 12:29:50 +01001681 c = _PyLong_NumBits(n);
1682 if (c == (size_t)(-1)) {
1683 goto error;
1684 }
1685 c = (c - 1U) / 2U;
1686
Mark Dickinson5c08ce92019-05-19 17:51:56 +01001687 /* Fast path: if c <= 31 then n < 2**64 and we can compute directly with a
1688 fast, almost branch-free algorithm. In the final correction, we use `u*u
1689 - 1 >= m` instead of the simpler `u*u > m` in order to get the correct
1690 result in the corner case where `u=2**32`. */
1691 if (c <= 31U) {
1692 m = (uint64_t)PyLong_AsUnsignedLongLong(n);
1693 Py_DECREF(n);
1694 if (m == (uint64_t)(-1) && PyErr_Occurred()) {
1695 return NULL;
1696 }
1697 u = _approximate_isqrt(m << (62U - 2U*c)) >> (31U - c);
1698 u -= u * u - 1U >= m;
1699 return PyLong_FromUnsignedLongLong((unsigned long long)u);
Mark Dickinson73934b92019-05-18 12:29:50 +01001700 }
1701
Mark Dickinson5c08ce92019-05-19 17:51:56 +01001702 /* Slow path: n >= 2**64. We perform the first five iterations in C integer
1703 arithmetic, then switch to using Python long integers. */
1704
1705 /* From n >= 2**64 it follows that c.bit_length() >= 6. */
1706 c_bit_length = 6;
1707 while ((c >> c_bit_length) > 0U) {
1708 ++c_bit_length;
1709 }
1710
1711 /* Initialise d and a. */
1712 d = c >> (c_bit_length - 5);
1713 b = _PyLong_Rshift(n, 2U*c - 62U);
1714 if (b == NULL) {
1715 goto error;
1716 }
1717 m = (uint64_t)PyLong_AsUnsignedLongLong(b);
1718 Py_DECREF(b);
1719 if (m == (uint64_t)(-1) && PyErr_Occurred()) {
1720 goto error;
1721 }
1722 u = _approximate_isqrt(m) >> (31U - d);
1723 a = PyLong_FromUnsignedLongLong((unsigned long long)u);
Mark Dickinson73934b92019-05-18 12:29:50 +01001724 if (a == NULL) {
1725 goto error;
1726 }
Mark Dickinson5c08ce92019-05-19 17:51:56 +01001727
1728 for (int s = c_bit_length - 6; s >= 0; --s) {
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03001729 PyObject *q;
Mark Dickinson73934b92019-05-18 12:29:50 +01001730 size_t e = d;
1731
1732 d = c >> s;
1733
1734 /* q = (n >> 2*c - e - d + 1) // a */
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03001735 q = _PyLong_Rshift(n, 2U*c - d - e + 1U);
Mark Dickinson73934b92019-05-18 12:29:50 +01001736 if (q == NULL) {
1737 goto error;
1738 }
1739 Py_SETREF(q, PyNumber_FloorDivide(q, a));
1740 if (q == NULL) {
1741 goto error;
1742 }
1743
1744 /* a = (a << d - 1 - e) + q */
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03001745 Py_SETREF(a, _PyLong_Lshift(a, d - 1U - e));
Mark Dickinson73934b92019-05-18 12:29:50 +01001746 if (a == NULL) {
1747 Py_DECREF(q);
1748 goto error;
1749 }
1750 Py_SETREF(a, PyNumber_Add(a, q));
1751 Py_DECREF(q);
1752 if (a == NULL) {
1753 goto error;
1754 }
1755 }
1756
1757 /* The correct result is either a or a - 1. Figure out which, and
1758 decrement a if necessary. */
1759
1760 /* a_too_large = n < a * a */
1761 b = PyNumber_Multiply(a, a);
1762 if (b == NULL) {
1763 goto error;
1764 }
1765 a_too_large = PyObject_RichCompareBool(n, b, Py_LT);
1766 Py_DECREF(b);
1767 if (a_too_large == -1) {
1768 goto error;
1769 }
1770
1771 if (a_too_large) {
1772 Py_SETREF(a, PyNumber_Subtract(a, _PyLong_One));
1773 }
1774 Py_DECREF(n);
1775 return a;
1776
1777 error:
1778 Py_XDECREF(a);
1779 Py_DECREF(n);
1780 return NULL;
1781}
1782
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001783/* Divide-and-conquer factorial algorithm
1784 *
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001785 * Based on the formula and pseudo-code provided at:
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001786 * http://www.luschny.de/math/factorial/binarysplitfact.html
1787 *
1788 * Faster algorithms exist, but they're more complicated and depend on
Ezio Melotti9527afd2010-07-08 15:03:02 +00001789 * a fast prime factorization algorithm.
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001790 *
1791 * Notes on the algorithm
1792 * ----------------------
1793 *
1794 * factorial(n) is written in the form 2**k * m, with m odd. k and m are
1795 * computed separately, and then combined using a left shift.
1796 *
1797 * The function factorial_odd_part computes the odd part m (i.e., the greatest
1798 * odd divisor) of factorial(n), using the formula:
1799 *
1800 * factorial_odd_part(n) =
1801 *
1802 * product_{i >= 0} product_{0 < j <= n / 2**i, j odd} j
1803 *
1804 * Example: factorial_odd_part(20) =
1805 *
1806 * (1) *
1807 * (1) *
1808 * (1 * 3 * 5) *
1809 * (1 * 3 * 5 * 7 * 9)
1810 * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19)
1811 *
1812 * Here i goes from large to small: the first term corresponds to i=4 (any
1813 * larger i gives an empty product), and the last term corresponds to i=0.
1814 * Each term can be computed from the last by multiplying by the extra odd
1815 * numbers required: e.g., to get from the penultimate term to the last one,
1816 * we multiply by (11 * 13 * 15 * 17 * 19).
1817 *
1818 * To see a hint of why this formula works, here are the same numbers as above
1819 * but with the even parts (i.e., the appropriate powers of 2) included. For
1820 * each subterm in the product for i, we multiply that subterm by 2**i:
1821 *
1822 * factorial(20) =
1823 *
1824 * (16) *
1825 * (8) *
1826 * (4 * 12 * 20) *
1827 * (2 * 6 * 10 * 14 * 18) *
1828 * (1 * 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19)
1829 *
1830 * The factorial_partial_product function computes the product of all odd j in
1831 * range(start, stop) for given start and stop. It's used to compute the
1832 * partial products like (11 * 13 * 15 * 17 * 19) in the example above. It
1833 * operates recursively, repeatedly splitting the range into two roughly equal
1834 * pieces until the subranges are small enough to be computed using only C
1835 * integer arithmetic.
1836 *
1837 * The two-valuation k (i.e., the exponent of the largest power of 2 dividing
1838 * the factorial) is computed independently in the main math_factorial
1839 * function. By standard results, its value is:
1840 *
1841 * two_valuation = n//2 + n//4 + n//8 + ....
1842 *
1843 * It can be shown (e.g., by complete induction on n) that two_valuation is
1844 * equal to n - count_set_bits(n), where count_set_bits(n) gives the number of
1845 * '1'-bits in the binary expansion of n.
1846 */
1847
1848/* factorial_partial_product: Compute product(range(start, stop, 2)) using
1849 * divide and conquer. Assumes start and stop are odd and stop > start.
1850 * max_bits must be >= bit_length(stop - 2). */
1851
1852static PyObject *
1853factorial_partial_product(unsigned long start, unsigned long stop,
1854 unsigned long max_bits)
1855{
1856 unsigned long midpoint, num_operands;
1857 PyObject *left = NULL, *right = NULL, *result = NULL;
1858
1859 /* If the return value will fit an unsigned long, then we can
1860 * multiply in a tight, fast loop where each multiply is O(1).
1861 * Compute an upper bound on the number of bits required to store
1862 * the answer.
1863 *
1864 * Storing some integer z requires floor(lg(z))+1 bits, which is
1865 * conveniently the value returned by bit_length(z). The
1866 * product x*y will require at most
1867 * bit_length(x) + bit_length(y) bits to store, based
1868 * on the idea that lg product = lg x + lg y.
1869 *
1870 * We know that stop - 2 is the largest number to be multiplied. From
1871 * there, we have: bit_length(answer) <= num_operands *
1872 * bit_length(stop - 2)
1873 */
1874
1875 num_operands = (stop - start) / 2;
1876 /* The "num_operands <= 8 * SIZEOF_LONG" check guards against the
1877 * unlikely case of an overflow in num_operands * max_bits. */
1878 if (num_operands <= 8 * SIZEOF_LONG &&
1879 num_operands * max_bits <= 8 * SIZEOF_LONG) {
1880 unsigned long j, total;
1881 for (total = start, j = start + 2; j < stop; j += 2)
1882 total *= j;
1883 return PyLong_FromUnsignedLong(total);
1884 }
1885
1886 /* find midpoint of range(start, stop), rounded up to next odd number. */
1887 midpoint = (start + num_operands) | 1;
1888 left = factorial_partial_product(start, midpoint,
1889 bit_length(midpoint - 2));
1890 if (left == NULL)
1891 goto error;
1892 right = factorial_partial_product(midpoint, stop, max_bits);
1893 if (right == NULL)
1894 goto error;
1895 result = PyNumber_Multiply(left, right);
1896
1897 error:
1898 Py_XDECREF(left);
1899 Py_XDECREF(right);
1900 return result;
1901}
1902
1903/* factorial_odd_part: compute the odd part of factorial(n). */
1904
1905static PyObject *
1906factorial_odd_part(unsigned long n)
1907{
1908 long i;
1909 unsigned long v, lower, upper;
1910 PyObject *partial, *tmp, *inner, *outer;
1911
1912 inner = PyLong_FromLong(1);
1913 if (inner == NULL)
1914 return NULL;
1915 outer = inner;
1916 Py_INCREF(outer);
1917
1918 upper = 3;
1919 for (i = bit_length(n) - 2; i >= 0; i--) {
1920 v = n >> i;
1921 if (v <= 2)
1922 continue;
1923 lower = upper;
1924 /* (v + 1) | 1 = least odd integer strictly larger than n / 2**i */
1925 upper = (v + 1) | 1;
1926 /* Here inner is the product of all odd integers j in the range (0,
1927 n/2**(i+1)]. The factorial_partial_product call below gives the
1928 product of all odd integers j in the range (n/2**(i+1), n/2**i]. */
1929 partial = factorial_partial_product(lower, upper, bit_length(upper-2));
1930 /* inner *= partial */
1931 if (partial == NULL)
1932 goto error;
1933 tmp = PyNumber_Multiply(inner, partial);
1934 Py_DECREF(partial);
1935 if (tmp == NULL)
1936 goto error;
1937 Py_DECREF(inner);
1938 inner = tmp;
1939 /* Now inner is the product of all odd integers j in the range (0,
1940 n/2**i], giving the inner product in the formula above. */
1941
1942 /* outer *= inner; */
1943 tmp = PyNumber_Multiply(outer, inner);
1944 if (tmp == NULL)
1945 goto error;
1946 Py_DECREF(outer);
1947 outer = tmp;
1948 }
Mark Dickinson76464492012-10-25 10:46:28 +01001949 Py_DECREF(inner);
1950 return outer;
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001951
1952 error:
1953 Py_DECREF(outer);
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001954 Py_DECREF(inner);
Mark Dickinson76464492012-10-25 10:46:28 +01001955 return NULL;
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001956}
1957
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001958
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00001959/* Lookup table for small factorial values */
1960
1961static const unsigned long SmallFactorials[] = {
1962 1, 1, 2, 6, 24, 120, 720, 5040, 40320,
1963 362880, 3628800, 39916800, 479001600,
1964#if SIZEOF_LONG >= 8
1965 6227020800, 87178291200, 1307674368000,
1966 20922789888000, 355687428096000, 6402373705728000,
1967 121645100408832000, 2432902008176640000
1968#endif
1969};
1970
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001971/*[clinic input]
1972math.factorial
1973
1974 x as arg: object
1975 /
1976
1977Find x!.
1978
1979Raise a ValueError if x is negative or non-integral.
1980[clinic start generated code]*/
1981
Barry Warsaw8b43b191996-12-09 22:32:36 +00001982static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02001983math_factorial(PyObject *module, PyObject *arg)
1984/*[clinic end generated code: output=6686f26fae00e9ca input=6d1c8105c0d91fb4]*/
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001985{
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03001986 long x, two_valuation;
Mark Dickinson5990d282014-04-10 09:29:39 -04001987 int overflow;
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03001988 PyObject *result, *odd_part, *pyint_form;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 if (PyFloat_Check(arg)) {
Serhiy Storchaka231aad32019-06-17 16:57:27 +03001991 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1992 "Using factorial() with floats is deprecated",
1993 1) < 0)
1994 {
1995 return NULL;
1996 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 PyObject *lx;
1998 double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);
1999 if (!(Py_IS_FINITE(dx) && dx == floor(dx))) {
2000 PyErr_SetString(PyExc_ValueError,
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00002001 "factorial() only accepts integral values");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 return NULL;
2003 }
2004 lx = PyLong_FromDouble(dx);
2005 if (lx == NULL)
2006 return NULL;
Mark Dickinson5990d282014-04-10 09:29:39 -04002007 x = PyLong_AsLongAndOverflow(lx, &overflow);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 Py_DECREF(lx);
2009 }
Pablo Galindoe9ba3702018-09-03 22:20:06 +01002010 else {
2011 pyint_form = PyNumber_Index(arg);
2012 if (pyint_form == NULL) {
2013 return NULL;
2014 }
2015 x = PyLong_AsLongAndOverflow(pyint_form, &overflow);
2016 Py_DECREF(pyint_form);
2017 }
Georg Brandlc28e1fa2008-06-10 19:20:26 +00002018
Mark Dickinson5990d282014-04-10 09:29:39 -04002019 if (x == -1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 return NULL;
Mark Dickinson5990d282014-04-10 09:29:39 -04002021 }
2022 else if (overflow == 1) {
2023 PyErr_Format(PyExc_OverflowError,
2024 "factorial() argument should not exceed %ld",
2025 LONG_MAX);
2026 return NULL;
2027 }
2028 else if (overflow == -1 || x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 PyErr_SetString(PyExc_ValueError,
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00002030 "factorial() not defined for negative values");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 return NULL;
2032 }
Georg Brandlc28e1fa2008-06-10 19:20:26 +00002033
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00002034 /* use lookup table if x is small */
Victor Stinner63941882011-09-29 00:42:28 +02002035 if (x < (long)Py_ARRAY_LENGTH(SmallFactorials))
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00002036 return PyLong_FromUnsignedLong(SmallFactorials[x]);
2037
2038 /* else express in the form odd_part * 2**two_valuation, and compute as
2039 odd_part << two_valuation. */
2040 odd_part = factorial_odd_part(x);
2041 if (odd_part == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 return NULL;
Serhiy Storchakaa5119e72019-05-19 14:14:38 +03002043 two_valuation = x - count_set_bits(x);
2044 result = _PyLong_Lshift(odd_part, two_valuation);
Mark Dickinson4c8a9a22010-05-15 17:02:38 +00002045 Py_DECREF(odd_part);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 return result;
Georg Brandlc28e1fa2008-06-10 19:20:26 +00002047}
2048
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002049
2050/*[clinic input]
2051math.trunc
2052
2053 x: object
2054 /
2055
2056Truncates the Real x to the nearest Integral toward 0.
2057
2058Uses the __trunc__ magic method.
2059[clinic start generated code]*/
Georg Brandlc28e1fa2008-06-10 19:20:26 +00002060
2061static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002062math_trunc(PyObject *module, PyObject *x)
2063/*[clinic end generated code: output=34b9697b707e1031 input=2168b34e0a09134d]*/
Christian Heimes400adb02008-02-01 08:12:03 +00002064{
Benjamin Petersonce798522012-01-22 11:24:29 -05002065 _Py_IDENTIFIER(__trunc__);
Benjamin Petersonb0125892010-07-02 13:35:17 +00002066 PyObject *trunc, *result;
Christian Heimes400adb02008-02-01 08:12:03 +00002067
Serhiy Storchaka5fd5cb82019-11-16 18:00:57 +02002068 if (PyFloat_CheckExact(x)) {
2069 return PyFloat_Type.tp_as_number->nb_int(x);
2070 }
2071
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002072 if (Py_TYPE(x)->tp_dict == NULL) {
2073 if (PyType_Ready(Py_TYPE(x)) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 return NULL;
2075 }
Christian Heimes400adb02008-02-01 08:12:03 +00002076
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002077 trunc = _PyObject_LookupSpecial(x, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 if (trunc == NULL) {
Benjamin Peterson8bb9cde2010-07-01 15:16:55 +00002079 if (!PyErr_Occurred())
2080 PyErr_Format(PyExc_TypeError,
2081 "type %.100s doesn't define __trunc__ method",
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002082 Py_TYPE(x)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 return NULL;
2084 }
Victor Stinnerf17c3de2016-12-06 18:46:19 +01002085 result = _PyObject_CallNoArg(trunc);
Benjamin Petersonb0125892010-07-02 13:35:17 +00002086 Py_DECREF(trunc);
2087 return result;
Christian Heimes400adb02008-02-01 08:12:03 +00002088}
2089
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002090
2091/*[clinic input]
2092math.frexp
2093
2094 x: double
2095 /
2096
2097Return the mantissa and exponent of x, as pair (m, e).
2098
2099m is a float and e is an int, such that x = m * 2.**e.
2100If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.
2101[clinic start generated code]*/
Christian Heimes400adb02008-02-01 08:12:03 +00002102
2103static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002104math_frexp_impl(PyObject *module, double x)
2105/*[clinic end generated code: output=03e30d252a15ad4a input=96251c9e208bc6e9]*/
Guido van Rossumd18ad581991-10-24 14:57:21 +00002106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 /* deal with special cases directly, to sidestep platform
2109 differences */
2110 if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
2111 i = 0;
2112 }
2113 else {
2114 PyFPE_START_PROTECT("in math_frexp", return 0);
2115 x = frexp(x, &i);
2116 PyFPE_END_PROTECT(x);
2117 }
2118 return Py_BuildValue("(di)", x, i);
Guido van Rossumd18ad581991-10-24 14:57:21 +00002119}
2120
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002121
2122/*[clinic input]
2123math.ldexp
2124
2125 x: double
2126 i: object
2127 /
2128
2129Return x * (2**i).
2130
2131This is essentially the inverse of frexp().
2132[clinic start generated code]*/
Guido van Rossumc6e22901998-12-04 19:26:43 +00002133
Barry Warsaw8b43b191996-12-09 22:32:36 +00002134static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002135math_ldexp_impl(PyObject *module, double x, PyObject *i)
2136/*[clinic end generated code: output=b6892f3c2df9cc6a input=17d5970c1a40a8c1]*/
Guido van Rossumd18ad581991-10-24 14:57:21 +00002137{
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002138 double r;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 long exp;
2140 int overflow;
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00002141
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002142 if (PyLong_Check(i)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 /* on overflow, replace exponent with either LONG_MAX
2144 or LONG_MIN, depending on the sign. */
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002145 exp = PyLong_AsLongAndOverflow(i, &overflow);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 if (exp == -1 && PyErr_Occurred())
2147 return NULL;
2148 if (overflow)
2149 exp = overflow < 0 ? LONG_MIN : LONG_MAX;
2150 }
2151 else {
2152 PyErr_SetString(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03002153 "Expected an int as second argument to ldexp.");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 return NULL;
2155 }
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00002156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 if (x == 0. || !Py_IS_FINITE(x)) {
2158 /* NaNs, zeros and infinities are returned unchanged */
2159 r = x;
2160 errno = 0;
2161 } else if (exp > INT_MAX) {
2162 /* overflow */
2163 r = copysign(Py_HUGE_VAL, x);
2164 errno = ERANGE;
2165 } else if (exp < INT_MIN) {
2166 /* underflow to +-0 */
2167 r = copysign(0., x);
2168 errno = 0;
2169 } else {
2170 errno = 0;
2171 PyFPE_START_PROTECT("in math_ldexp", return 0);
2172 r = ldexp(x, (int)exp);
2173 PyFPE_END_PROTECT(r);
2174 if (Py_IS_INFINITY(r))
2175 errno = ERANGE;
2176 }
Alexandre Vassalotti6461e102008-05-15 22:09:29 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 if (errno && is_error(r))
2179 return NULL;
2180 return PyFloat_FromDouble(r);
Guido van Rossumd18ad581991-10-24 14:57:21 +00002181}
2182
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002183
2184/*[clinic input]
2185math.modf
2186
2187 x: double
2188 /
2189
2190Return the fractional and integer parts of x.
2191
2192Both results carry the sign of x and are floats.
2193[clinic start generated code]*/
Guido van Rossumc6e22901998-12-04 19:26:43 +00002194
Barry Warsaw8b43b191996-12-09 22:32:36 +00002195static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002196math_modf_impl(PyObject *module, double x)
2197/*[clinic end generated code: output=90cee0260014c3c0 input=b4cfb6786afd9035]*/
Guido van Rossumd18ad581991-10-24 14:57:21 +00002198{
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002199 double y;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 /* some platforms don't do the right thing for NaNs and
2201 infinities, so we take care of special cases directly. */
2202 if (!Py_IS_FINITE(x)) {
2203 if (Py_IS_INFINITY(x))
2204 return Py_BuildValue("(dd)", copysign(0., x), x);
2205 else if (Py_IS_NAN(x))
2206 return Py_BuildValue("(dd)", x, x);
2207 }
Christian Heimesa342c012008-04-20 21:01:16 +00002208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 errno = 0;
2210 PyFPE_START_PROTECT("in math_modf", return 0);
2211 x = modf(x, &y);
2212 PyFPE_END_PROTECT(x);
2213 return Py_BuildValue("(dd)", x, y);
Guido van Rossumd18ad581991-10-24 14:57:21 +00002214}
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002215
Guido van Rossumc6e22901998-12-04 19:26:43 +00002216
Serhiy Storchaka95949422013-08-27 19:40:23 +03002217/* A decent logarithm is easy to compute even for huge ints, but libm can't
Tim Peters78526162001-09-05 00:53:45 +00002218 do that by itself -- loghelper can. func is log or log10, and name is
Serhiy Storchaka95949422013-08-27 19:40:23 +03002219 "log" or "log10". Note that overflow of the result isn't possible: an int
Mark Dickinson6ecd9e52010-01-02 15:33:56 +00002220 can contain no more than INT_MAX * SHIFT bits, so has value certainly less
2221 than 2**(2**64 * 2**16) == 2**2**80, and log2 of that is 2**80, which is
Tim Peters78526162001-09-05 00:53:45 +00002222 small enough to fit in an IEEE single. log and log10 are even smaller.
Serhiy Storchaka95949422013-08-27 19:40:23 +03002223 However, intermediate overflow is possible for an int if the number of bits
2224 in that int is larger than PY_SSIZE_T_MAX. */
Tim Peters78526162001-09-05 00:53:45 +00002225
2226static PyObject*
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02002227loghelper(PyObject* arg, double (*func)(double), const char *funcname)
Tim Peters78526162001-09-05 00:53:45 +00002228{
Serhiy Storchaka95949422013-08-27 19:40:23 +03002229 /* If it is int, do it ourselves. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 if (PyLong_Check(arg)) {
Mark Dickinsonc6037172010-09-29 19:06:36 +00002231 double x, result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002232 Py_ssize_t e;
Mark Dickinsonc6037172010-09-29 19:06:36 +00002233
2234 /* Negative or zero inputs give a ValueError. */
2235 if (Py_SIZE(arg) <= 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 PyErr_SetString(PyExc_ValueError,
2237 "math domain error");
2238 return NULL;
2239 }
Mark Dickinsonfa41e602010-09-28 07:22:27 +00002240
Mark Dickinsonc6037172010-09-29 19:06:36 +00002241 x = PyLong_AsDouble(arg);
2242 if (x == -1.0 && PyErr_Occurred()) {
2243 if (!PyErr_ExceptionMatches(PyExc_OverflowError))
2244 return NULL;
2245 /* Here the conversion to double overflowed, but it's possible
2246 to compute the log anyway. Clear the exception and continue. */
2247 PyErr_Clear();
2248 x = _PyLong_Frexp((PyLongObject *)arg, &e);
2249 if (x == -1.0 && PyErr_Occurred())
2250 return NULL;
2251 /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */
2252 result = func(x) + func(2.0) * e;
2253 }
2254 else
2255 /* Successfully converted x to a double. */
2256 result = func(x);
2257 return PyFloat_FromDouble(result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 }
Tim Peters78526162001-09-05 00:53:45 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 /* Else let libm handle it by itself. */
2261 return math_1(arg, func, 0);
Tim Peters78526162001-09-05 00:53:45 +00002262}
2263
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002264
2265/*[clinic input]
2266math.log
2267
2268 x: object
2269 [
2270 base: object(c_default="NULL") = math.e
2271 ]
2272 /
2273
2274Return the logarithm of x to the given base.
2275
2276If the base not specified, returns the natural logarithm (base e) of x.
2277[clinic start generated code]*/
2278
Tim Peters78526162001-09-05 00:53:45 +00002279static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002280math_log_impl(PyObject *module, PyObject *x, int group_right_1,
2281 PyObject *base)
2282/*[clinic end generated code: output=7b5a39e526b73fc9 input=0f62d5726cbfebbd]*/
Tim Peters78526162001-09-05 00:53:45 +00002283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 PyObject *num, *den;
2285 PyObject *ans;
Raymond Hettinger866964c2002-12-14 19:51:34 +00002286
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002287 num = loghelper(x, m_log, "log");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 if (num == NULL || base == NULL)
2289 return num;
Raymond Hettinger866964c2002-12-14 19:51:34 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 den = loghelper(base, m_log, "log");
2292 if (den == NULL) {
2293 Py_DECREF(num);
2294 return NULL;
2295 }
Raymond Hettinger866964c2002-12-14 19:51:34 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 ans = PyNumber_TrueDivide(num, den);
2298 Py_DECREF(num);
2299 Py_DECREF(den);
2300 return ans;
Tim Peters78526162001-09-05 00:53:45 +00002301}
2302
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002303
2304/*[clinic input]
2305math.log2
2306
2307 x: object
2308 /
2309
2310Return the base 2 logarithm of x.
2311[clinic start generated code]*/
Tim Peters78526162001-09-05 00:53:45 +00002312
2313static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002314math_log2(PyObject *module, PyObject *x)
2315/*[clinic end generated code: output=5425899a4d5d6acb input=08321262bae4f39b]*/
Victor Stinnerfa0e3d52011-05-09 01:01:09 +02002316{
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002317 return loghelper(x, m_log2, "log2");
Victor Stinnerfa0e3d52011-05-09 01:01:09 +02002318}
2319
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002320
2321/*[clinic input]
2322math.log10
2323
2324 x: object
2325 /
2326
2327Return the base 10 logarithm of x.
2328[clinic start generated code]*/
Victor Stinnerfa0e3d52011-05-09 01:01:09 +02002329
2330static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002331math_log10(PyObject *module, PyObject *x)
2332/*[clinic end generated code: output=be72a64617df9c6f input=b2469d02c6469e53]*/
Tim Peters78526162001-09-05 00:53:45 +00002333{
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002334 return loghelper(x, m_log10, "log10");
Tim Peters78526162001-09-05 00:53:45 +00002335}
2336
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002337
2338/*[clinic input]
2339math.fmod
2340
2341 x: double
2342 y: double
2343 /
2344
2345Return fmod(x, y), according to platform C.
2346
2347x % y may differ.
2348[clinic start generated code]*/
Tim Peters78526162001-09-05 00:53:45 +00002349
Christian Heimes53876d92008-04-19 00:31:39 +00002350static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002351math_fmod_impl(PyObject *module, double x, double y)
2352/*[clinic end generated code: output=7559d794343a27b5 input=4f84caa8cfc26a03]*/
Christian Heimes53876d92008-04-19 00:31:39 +00002353{
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002354 double r;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 /* fmod(x, +/-Inf) returns x for finite x. */
2356 if (Py_IS_INFINITY(y) && Py_IS_FINITE(x))
2357 return PyFloat_FromDouble(x);
2358 errno = 0;
2359 PyFPE_START_PROTECT("in math_fmod", return 0);
2360 r = fmod(x, y);
2361 PyFPE_END_PROTECT(r);
2362 if (Py_IS_NAN(r)) {
2363 if (!Py_IS_NAN(x) && !Py_IS_NAN(y))
2364 errno = EDOM;
2365 else
2366 errno = 0;
2367 }
2368 if (errno && is_error(r))
2369 return NULL;
2370 else
2371 return PyFloat_FromDouble(r);
Christian Heimes53876d92008-04-19 00:31:39 +00002372}
2373
Raymond Hettinger13990742018-08-11 11:26:36 -07002374/*
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002375Given an *n* length *vec* of values and a value *max*, compute:
Raymond Hettinger13990742018-08-11 11:26:36 -07002376
Raymond Hettingerc630e102018-08-11 18:39:05 -07002377 max * sqrt(sum((x / max) ** 2 for x in vec))
Raymond Hettinger13990742018-08-11 11:26:36 -07002378
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002379The value of the *max* variable must be non-negative and
Raymond Hettinger216aaaa2018-11-09 01:06:02 -08002380equal to the absolute value of the largest magnitude
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002381entry in the vector. If n==0, then *max* should be 0.0.
2382If an infinity is present in the vec, *max* should be INF.
Raymond Hettingerc630e102018-08-11 18:39:05 -07002383
2384The *found_nan* variable indicates whether some member of
2385the *vec* is a NaN.
Raymond Hettinger21786f52018-08-28 22:47:24 -07002386
2387To improve accuracy and to increase the number of cases where
2388vector_norm() is commutative, we use a variant of Neumaier
2389summation specialized to exploit that we always know that
2390|csum| >= |x|.
2391
2392The *csum* variable tracks the cumulative sum and *frac* tracks
2393the cumulative fractional errors at each step. Since this
2394variant assumes that |csum| >= |x| at each step, we establish
2395the precondition by starting the accumulation from 1.0 which
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002396represents the largest possible value of (x/max)**2.
2397
2398After the loop is finished, the initial 1.0 is subtracted out
2399for a net zero effect on the final sum. Since *csum* will be
2400greater than 1.0, the subtraction of 1.0 will not cause
2401fractional digits to be dropped from *csum*.
Raymond Hettinger21786f52018-08-28 22:47:24 -07002402
Raymond Hettinger13990742018-08-11 11:26:36 -07002403*/
2404
2405static inline double
Raymond Hettingerc630e102018-08-11 18:39:05 -07002406vector_norm(Py_ssize_t n, double *vec, double max, int found_nan)
Raymond Hettinger13990742018-08-11 11:26:36 -07002407{
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002408 double x, csum = 1.0, oldcsum, frac = 0.0;
Raymond Hettinger13990742018-08-11 11:26:36 -07002409 Py_ssize_t i;
2410
Raymond Hettingerc630e102018-08-11 18:39:05 -07002411 if (Py_IS_INFINITY(max)) {
2412 return max;
2413 }
2414 if (found_nan) {
2415 return Py_NAN;
2416 }
Raymond Hettingerf3267142018-09-02 13:34:21 -07002417 if (max == 0.0 || n <= 1) {
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002418 return max;
Raymond Hettinger13990742018-08-11 11:26:36 -07002419 }
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002420 for (i=0 ; i < n ; i++) {
Raymond Hettinger13990742018-08-11 11:26:36 -07002421 x = vec[i];
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002422 assert(Py_IS_FINITE(x) && fabs(x) <= max);
Raymond Hettinger13990742018-08-11 11:26:36 -07002423 x /= max;
Raymond Hettinger21786f52018-08-28 22:47:24 -07002424 x = x*x;
Raymond Hettinger13990742018-08-11 11:26:36 -07002425 oldcsum = csum;
2426 csum += x;
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002427 assert(csum >= x);
Raymond Hettinger21786f52018-08-28 22:47:24 -07002428 frac += (oldcsum - csum) + x;
Raymond Hettinger13990742018-08-11 11:26:36 -07002429 }
Raymond Hettinger745c0f32018-08-31 11:22:13 -07002430 return max * sqrt(csum - 1.0 + frac);
Raymond Hettinger13990742018-08-11 11:26:36 -07002431}
2432
Raymond Hettingerc630e102018-08-11 18:39:05 -07002433#define NUM_STACK_ELEMS 16
2434
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002435/*[clinic input]
2436math.dist
2437
Raymond Hettinger6b5f1b42019-07-27 14:04:29 -07002438 p: object
2439 q: object
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002440 /
2441
2442Return the Euclidean distance between two points p and q.
2443
Raymond Hettinger6b5f1b42019-07-27 14:04:29 -07002444The points should be specified as sequences (or iterables) of
2445coordinates. Both inputs must have the same dimension.
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002446
2447Roughly equivalent to:
2448 sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
2449[clinic start generated code]*/
2450
2451static PyObject *
2452math_dist_impl(PyObject *module, PyObject *p, PyObject *q)
Raymond Hettinger6b5f1b42019-07-27 14:04:29 -07002453/*[clinic end generated code: output=56bd9538d06bbcfe input=74e85e1b6092e68e]*/
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002454{
2455 PyObject *item;
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002456 double max = 0.0;
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002457 double x, px, qx, result;
2458 Py_ssize_t i, m, n;
Raymond Hettinger6b5f1b42019-07-27 14:04:29 -07002459 int found_nan = 0, p_allocated = 0, q_allocated = 0;
Raymond Hettingerc630e102018-08-11 18:39:05 -07002460 double diffs_on_stack[NUM_STACK_ELEMS];
2461 double *diffs = diffs_on_stack;
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002462
Raymond Hettinger6b5f1b42019-07-27 14:04:29 -07002463 if (!PyTuple_Check(p)) {
2464 p = PySequence_Tuple(p);
2465 if (p == NULL) {
2466 return NULL;
2467 }
2468 p_allocated = 1;
2469 }
2470 if (!PyTuple_Check(q)) {
2471 q = PySequence_Tuple(q);
2472 if (q == NULL) {
2473 if (p_allocated) {
2474 Py_DECREF(p);
2475 }
2476 return NULL;
2477 }
2478 q_allocated = 1;
2479 }
2480
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002481 m = PyTuple_GET_SIZE(p);
2482 n = PyTuple_GET_SIZE(q);
2483 if (m != n) {
2484 PyErr_SetString(PyExc_ValueError,
2485 "both points must have the same number of dimensions");
2486 return NULL;
2487
2488 }
Raymond Hettingerc630e102018-08-11 18:39:05 -07002489 if (n > NUM_STACK_ELEMS) {
2490 diffs = (double *) PyObject_Malloc(n * sizeof(double));
2491 if (diffs == NULL) {
Zackery Spytz4c49da02018-12-07 03:11:30 -07002492 return PyErr_NoMemory();
Raymond Hettingerc630e102018-08-11 18:39:05 -07002493 }
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002494 }
2495 for (i=0 ; i<n ; i++) {
2496 item = PyTuple_GET_ITEM(p, i);
Raymond Hettingercfd735e2019-01-29 20:39:53 -08002497 ASSIGN_DOUBLE(px, item, error_exit);
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002498 item = PyTuple_GET_ITEM(q, i);
Raymond Hettingercfd735e2019-01-29 20:39:53 -08002499 ASSIGN_DOUBLE(qx, item, error_exit);
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002500 x = fabs(px - qx);
2501 diffs[i] = x;
2502 found_nan |= Py_IS_NAN(x);
2503 if (x > max) {
2504 max = x;
2505 }
2506 }
Raymond Hettingerc630e102018-08-11 18:39:05 -07002507 result = vector_norm(n, diffs, max, found_nan);
2508 if (diffs != diffs_on_stack) {
2509 PyObject_Free(diffs);
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002510 }
Raymond Hettinger6b5f1b42019-07-27 14:04:29 -07002511 if (p_allocated) {
2512 Py_DECREF(p);
2513 }
2514 if (q_allocated) {
2515 Py_DECREF(q);
2516 }
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002517 return PyFloat_FromDouble(result);
Raymond Hettingerc630e102018-08-11 18:39:05 -07002518
2519 error_exit:
2520 if (diffs != diffs_on_stack) {
2521 PyObject_Free(diffs);
2522 }
Raymond Hettinger6b5f1b42019-07-27 14:04:29 -07002523 if (p_allocated) {
2524 Py_DECREF(p);
2525 }
2526 if (q_allocated) {
2527 Py_DECREF(q);
2528 }
Raymond Hettingerc630e102018-08-11 18:39:05 -07002529 return NULL;
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07002530}
2531
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002532/* AC: cannot convert yet, waiting for *args support */
Christian Heimes53876d92008-04-19 00:31:39 +00002533static PyObject *
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02002534math_hypot(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
Christian Heimes53876d92008-04-19 00:31:39 +00002535{
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02002536 Py_ssize_t i;
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002537 PyObject *item;
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002538 double max = 0.0;
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002539 double x, result;
2540 int found_nan = 0;
Raymond Hettingerc630e102018-08-11 18:39:05 -07002541 double coord_on_stack[NUM_STACK_ELEMS];
2542 double *coordinates = coord_on_stack;
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002543
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02002544 if (nargs > NUM_STACK_ELEMS) {
2545 coordinates = (double *) PyObject_Malloc(nargs * sizeof(double));
Zackery Spytz4c49da02018-12-07 03:11:30 -07002546 if (coordinates == NULL) {
2547 return PyErr_NoMemory();
2548 }
Raymond Hettingerc630e102018-08-11 18:39:05 -07002549 }
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02002550 for (i = 0; i < nargs; i++) {
2551 item = args[i];
Raymond Hettingercfd735e2019-01-29 20:39:53 -08002552 ASSIGN_DOUBLE(x, item, error_exit);
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002553 x = fabs(x);
2554 coordinates[i] = x;
2555 found_nan |= Py_IS_NAN(x);
2556 if (x > max) {
2557 max = x;
2558 }
2559 }
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02002560 result = vector_norm(nargs, coordinates, max, found_nan);
Raymond Hettingerc630e102018-08-11 18:39:05 -07002561 if (coordinates != coord_on_stack) {
2562 PyObject_Free(coordinates);
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002563 }
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002564 return PyFloat_FromDouble(result);
Raymond Hettingerc630e102018-08-11 18:39:05 -07002565
2566 error_exit:
2567 if (coordinates != coord_on_stack) {
2568 PyObject_Free(coordinates);
2569 }
2570 return NULL;
Christian Heimes53876d92008-04-19 00:31:39 +00002571}
2572
Raymond Hettingerc630e102018-08-11 18:39:05 -07002573#undef NUM_STACK_ELEMS
2574
Raymond Hettingerc6dabe32018-07-28 07:48:04 -07002575PyDoc_STRVAR(math_hypot_doc,
2576 "hypot(*coordinates) -> value\n\n\
2577Multidimensional Euclidean distance from the origin to a point.\n\
2578\n\
2579Roughly equivalent to:\n\
2580 sqrt(sum(x**2 for x in coordinates))\n\
2581\n\
2582For a two dimensional point (x, y), gives the hypotenuse\n\
2583using the Pythagorean theorem: sqrt(x*x + y*y).\n\
2584\n\
2585For example, the hypotenuse of a 3/4/5 right triangle is:\n\
2586\n\
2587 >>> hypot(3.0, 4.0)\n\
2588 5.0\n\
2589");
Christian Heimes53876d92008-04-19 00:31:39 +00002590
2591/* pow can't use math_2, but needs its own wrapper: the problem is
2592 that an infinite result can arise either as a result of overflow
2593 (in which case OverflowError should be raised) or as a result of
2594 e.g. 0.**-5. (for which ValueError needs to be raised.)
2595*/
2596
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002597/*[clinic input]
2598math.pow
Christian Heimes53876d92008-04-19 00:31:39 +00002599
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002600 x: double
2601 y: double
2602 /
2603
2604Return x**y (x to the power of y).
2605[clinic start generated code]*/
2606
2607static PyObject *
2608math_pow_impl(PyObject *module, double x, double y)
2609/*[clinic end generated code: output=fff93e65abccd6b0 input=c26f1f6075088bfd]*/
2610{
2611 double r;
2612 int odd_y;
Christian Heimesa342c012008-04-20 21:01:16 +00002613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 /* deal directly with IEEE specials, to cope with problems on various
2615 platforms whose semantics don't exactly match C99 */
2616 r = 0.; /* silence compiler warning */
2617 if (!Py_IS_FINITE(x) || !Py_IS_FINITE(y)) {
2618 errno = 0;
2619 if (Py_IS_NAN(x))
2620 r = y == 0. ? 1. : x; /* NaN**0 = 1 */
2621 else if (Py_IS_NAN(y))
2622 r = x == 1. ? 1. : y; /* 1**NaN = 1 */
2623 else if (Py_IS_INFINITY(x)) {
2624 odd_y = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;
2625 if (y > 0.)
2626 r = odd_y ? x : fabs(x);
2627 else if (y == 0.)
2628 r = 1.;
2629 else /* y < 0. */
2630 r = odd_y ? copysign(0., x) : 0.;
2631 }
2632 else if (Py_IS_INFINITY(y)) {
2633 if (fabs(x) == 1.0)
2634 r = 1.;
2635 else if (y > 0. && fabs(x) > 1.0)
2636 r = y;
2637 else if (y < 0. && fabs(x) < 1.0) {
2638 r = -y; /* result is +inf */
2639 if (x == 0.) /* 0**-inf: divide-by-zero */
2640 errno = EDOM;
2641 }
2642 else
2643 r = 0.;
2644 }
2645 }
2646 else {
2647 /* let libm handle finite**finite */
2648 errno = 0;
2649 PyFPE_START_PROTECT("in math_pow", return 0);
2650 r = pow(x, y);
2651 PyFPE_END_PROTECT(r);
2652 /* a NaN result should arise only from (-ve)**(finite
2653 non-integer); in this case we want to raise ValueError. */
2654 if (!Py_IS_FINITE(r)) {
2655 if (Py_IS_NAN(r)) {
2656 errno = EDOM;
2657 }
2658 /*
2659 an infinite result here arises either from:
2660 (A) (+/-0.)**negative (-> divide-by-zero)
2661 (B) overflow of x**y with x and y finite
2662 */
2663 else if (Py_IS_INFINITY(r)) {
2664 if (x == 0.)
2665 errno = EDOM;
2666 else
2667 errno = ERANGE;
2668 }
2669 }
2670 }
Christian Heimes53876d92008-04-19 00:31:39 +00002671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 if (errno && is_error(r))
2673 return NULL;
2674 else
2675 return PyFloat_FromDouble(r);
Christian Heimes53876d92008-04-19 00:31:39 +00002676}
2677
Christian Heimes53876d92008-04-19 00:31:39 +00002678
Christian Heimes072c0f12008-01-03 23:01:04 +00002679static const double degToRad = Py_MATH_PI / 180.0;
2680static const double radToDeg = 180.0 / Py_MATH_PI;
Raymond Hettingerd6f22672002-05-13 03:56:10 +00002681
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002682/*[clinic input]
2683math.degrees
2684
2685 x: double
2686 /
2687
2688Convert angle x from radians to degrees.
2689[clinic start generated code]*/
2690
Raymond Hettingerd6f22672002-05-13 03:56:10 +00002691static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002692math_degrees_impl(PyObject *module, double x)
2693/*[clinic end generated code: output=7fea78b294acd12f input=81e016555d6e3660]*/
Raymond Hettingerd6f22672002-05-13 03:56:10 +00002694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 return PyFloat_FromDouble(x * radToDeg);
Raymond Hettingerd6f22672002-05-13 03:56:10 +00002696}
2697
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002698
2699/*[clinic input]
2700math.radians
2701
2702 x: double
2703 /
2704
2705Convert angle x from degrees to radians.
2706[clinic start generated code]*/
Raymond Hettingerd6f22672002-05-13 03:56:10 +00002707
2708static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002709math_radians_impl(PyObject *module, double x)
2710/*[clinic end generated code: output=34daa47caf9b1590 input=91626fc489fe3d63]*/
Raymond Hettingerd6f22672002-05-13 03:56:10 +00002711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 return PyFloat_FromDouble(x * degToRad);
Raymond Hettingerd6f22672002-05-13 03:56:10 +00002713}
2714
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002715
2716/*[clinic input]
2717math.isfinite
2718
2719 x: double
2720 /
2721
2722Return True if x is neither an infinity nor a NaN, and False otherwise.
2723[clinic start generated code]*/
Tim Peters78526162001-09-05 00:53:45 +00002724
Christian Heimes072c0f12008-01-03 23:01:04 +00002725static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002726math_isfinite_impl(PyObject *module, double x)
2727/*[clinic end generated code: output=8ba1f396440c9901 input=46967d254812e54a]*/
Mark Dickinson8e0c9962010-07-11 17:38:24 +00002728{
Mark Dickinson8e0c9962010-07-11 17:38:24 +00002729 return PyBool_FromLong((long)Py_IS_FINITE(x));
2730}
2731
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002732
2733/*[clinic input]
2734math.isnan
2735
2736 x: double
2737 /
2738
2739Return True if x is a NaN (not a number), and False otherwise.
2740[clinic start generated code]*/
Mark Dickinson8e0c9962010-07-11 17:38:24 +00002741
2742static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002743math_isnan_impl(PyObject *module, double x)
2744/*[clinic end generated code: output=f537b4d6df878c3e input=935891e66083f46a]*/
Christian Heimes072c0f12008-01-03 23:01:04 +00002745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 return PyBool_FromLong((long)Py_IS_NAN(x));
Christian Heimes072c0f12008-01-03 23:01:04 +00002747}
2748
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002749
2750/*[clinic input]
2751math.isinf
2752
2753 x: double
2754 /
2755
2756Return True if x is a positive or negative infinity, and False otherwise.
2757[clinic start generated code]*/
Christian Heimes072c0f12008-01-03 23:01:04 +00002758
2759static PyObject *
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002760math_isinf_impl(PyObject *module, double x)
2761/*[clinic end generated code: output=9f00cbec4de7b06b input=32630e4212cf961f]*/
Christian Heimes072c0f12008-01-03 23:01:04 +00002762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 return PyBool_FromLong((long)Py_IS_INFINITY(x));
Christian Heimes072c0f12008-01-03 23:01:04 +00002764}
2765
Christian Heimes072c0f12008-01-03 23:01:04 +00002766
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002767/*[clinic input]
2768math.isclose -> bool
2769
2770 a: double
2771 b: double
2772 *
2773 rel_tol: double = 1e-09
2774 maximum difference for being considered "close", relative to the
2775 magnitude of the input values
2776 abs_tol: double = 0.0
2777 maximum difference for being considered "close", regardless of the
2778 magnitude of the input values
2779
2780Determine whether two floating point numbers are close in value.
2781
2782Return True if a is close in value to b, and False otherwise.
2783
2784For the values to be considered close, the difference between them
2785must be smaller than at least one of the tolerances.
2786
2787-inf, inf and NaN behave similarly to the IEEE 754 Standard. That
2788is, NaN is not close to anything, even itself. inf and -inf are
2789only close to themselves.
2790[clinic start generated code]*/
2791
2792static int
2793math_isclose_impl(PyObject *module, double a, double b, double rel_tol,
2794 double abs_tol)
2795/*[clinic end generated code: output=b73070207511952d input=f28671871ea5bfba]*/
Tal Einatd5519ed2015-05-31 22:05:00 +03002796{
Tal Einatd5519ed2015-05-31 22:05:00 +03002797 double diff = 0.0;
Tal Einatd5519ed2015-05-31 22:05:00 +03002798
2799 /* sanity check on the inputs */
2800 if (rel_tol < 0.0 || abs_tol < 0.0 ) {
2801 PyErr_SetString(PyExc_ValueError,
2802 "tolerances must be non-negative");
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002803 return -1;
Tal Einatd5519ed2015-05-31 22:05:00 +03002804 }
2805
2806 if ( a == b ) {
2807 /* short circuit exact equality -- needed to catch two infinities of
2808 the same sign. And perhaps speeds things up a bit sometimes.
2809 */
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002810 return 1;
Tal Einatd5519ed2015-05-31 22:05:00 +03002811 }
2812
2813 /* This catches the case of two infinities of opposite sign, or
2814 one infinity and one finite number. Two infinities of opposite
2815 sign would otherwise have an infinite relative tolerance.
2816 Two infinities of the same sign are caught by the equality check
2817 above.
2818 */
2819
2820 if (Py_IS_INFINITY(a) || Py_IS_INFINITY(b)) {
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002821 return 0;
Tal Einatd5519ed2015-05-31 22:05:00 +03002822 }
2823
2824 /* now do the regular computation
2825 this is essentially the "weak" test from the Boost library
2826 */
2827
2828 diff = fabs(b - a);
2829
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02002830 return (((diff <= fabs(rel_tol * b)) ||
2831 (diff <= fabs(rel_tol * a))) ||
2832 (diff <= abs_tol));
Tal Einatd5519ed2015-05-31 22:05:00 +03002833}
2834
Pablo Galindo04114112019-03-09 19:18:08 +00002835static inline int
2836_check_long_mult_overflow(long a, long b) {
2837
2838 /* From Python2's int_mul code:
2839
2840 Integer overflow checking for * is painful: Python tried a couple ways, but
2841 they didn't work on all platforms, or failed in endcases (a product of
2842 -sys.maxint-1 has been a particular pain).
2843
2844 Here's another way:
2845
2846 The native long product x*y is either exactly right or *way* off, being
2847 just the last n bits of the true product, where n is the number of bits
2848 in a long (the delivered product is the true product plus i*2**n for
2849 some integer i).
2850
2851 The native double product (double)x * (double)y is subject to three
2852 rounding errors: on a sizeof(long)==8 box, each cast to double can lose
2853 info, and even on a sizeof(long)==4 box, the multiplication can lose info.
2854 But, unlike the native long product, it's not in *range* trouble: even
2855 if sizeof(long)==32 (256-bit longs), the product easily fits in the
2856 dynamic range of a double. So the leading 50 (or so) bits of the double
2857 product are correct.
2858
2859 We check these two ways against each other, and declare victory if they're
2860 approximately the same. Else, because the native long product is the only
2861 one that can lose catastrophic amounts of information, it's the native long
2862 product that must have overflowed.
2863
2864 */
2865
2866 long longprod = (long)((unsigned long)a * b);
2867 double doubleprod = (double)a * (double)b;
2868 double doubled_longprod = (double)longprod;
2869
2870 if (doubled_longprod == doubleprod) {
2871 return 0;
2872 }
2873
2874 const double diff = doubled_longprod - doubleprod;
2875 const double absdiff = diff >= 0.0 ? diff : -diff;
2876 const double absprod = doubleprod >= 0.0 ? doubleprod : -doubleprod;
2877
2878 if (32.0 * absdiff <= absprod) {
2879 return 0;
2880 }
2881
2882 return 1;
2883}
Tal Einatd5519ed2015-05-31 22:05:00 +03002884
Pablo Galindobc098512019-02-07 07:04:02 +00002885/*[clinic input]
2886math.prod
2887
2888 iterable: object
2889 /
2890 *
2891 start: object(c_default="NULL") = 1
2892
2893Calculate the product of all the elements in the input iterable.
2894
2895The default start value for the product is 1.
2896
2897When the iterable is empty, return the start value. This function is
2898intended specifically for use with numeric values and may reject
2899non-numeric types.
2900[clinic start generated code]*/
2901
2902static PyObject *
2903math_prod_impl(PyObject *module, PyObject *iterable, PyObject *start)
2904/*[clinic end generated code: output=36153bedac74a198 input=4c5ab0682782ed54]*/
2905{
2906 PyObject *result = start;
2907 PyObject *temp, *item, *iter;
2908
2909 iter = PyObject_GetIter(iterable);
2910 if (iter == NULL) {
2911 return NULL;
2912 }
2913
2914 if (result == NULL) {
2915 result = PyLong_FromLong(1);
2916 if (result == NULL) {
2917 Py_DECREF(iter);
2918 return NULL;
2919 }
2920 } else {
2921 Py_INCREF(result);
2922 }
2923#ifndef SLOW_PROD
2924 /* Fast paths for integers keeping temporary products in C.
2925 * Assumes all inputs are the same type.
2926 * If the assumption fails, default to use PyObjects instead.
2927 */
2928 if (PyLong_CheckExact(result)) {
2929 int overflow;
2930 long i_result = PyLong_AsLongAndOverflow(result, &overflow);
2931 /* If this already overflowed, don't even enter the loop. */
2932 if (overflow == 0) {
2933 Py_DECREF(result);
2934 result = NULL;
2935 }
2936 /* Loop over all the items in the iterable until we finish, we overflow
2937 * or we found a non integer element */
2938 while(result == NULL) {
2939 item = PyIter_Next(iter);
2940 if (item == NULL) {
2941 Py_DECREF(iter);
2942 if (PyErr_Occurred()) {
2943 return NULL;
2944 }
2945 return PyLong_FromLong(i_result);
2946 }
2947 if (PyLong_CheckExact(item)) {
2948 long b = PyLong_AsLongAndOverflow(item, &overflow);
Pablo Galindo04114112019-03-09 19:18:08 +00002949 if (overflow == 0 && !_check_long_mult_overflow(i_result, b)) {
2950 long x = i_result * b;
Pablo Galindobc098512019-02-07 07:04:02 +00002951 i_result = x;
2952 Py_DECREF(item);
2953 continue;
2954 }
2955 }
2956 /* Either overflowed or is not an int.
2957 * Restore real objects and process normally */
2958 result = PyLong_FromLong(i_result);
2959 if (result == NULL) {
2960 Py_DECREF(item);
2961 Py_DECREF(iter);
2962 return NULL;
2963 }
2964 temp = PyNumber_Multiply(result, item);
2965 Py_DECREF(result);
2966 Py_DECREF(item);
2967 result = temp;
2968 if (result == NULL) {
2969 Py_DECREF(iter);
2970 return NULL;
2971 }
2972 }
2973 }
2974
2975 /* Fast paths for floats keeping temporary products in C.
2976 * Assumes all inputs are the same type.
2977 * If the assumption fails, default to use PyObjects instead.
2978 */
2979 if (PyFloat_CheckExact(result)) {
2980 double f_result = PyFloat_AS_DOUBLE(result);
2981 Py_DECREF(result);
2982 result = NULL;
2983 while(result == NULL) {
2984 item = PyIter_Next(iter);
2985 if (item == NULL) {
2986 Py_DECREF(iter);
2987 if (PyErr_Occurred()) {
2988 return NULL;
2989 }
2990 return PyFloat_FromDouble(f_result);
2991 }
2992 if (PyFloat_CheckExact(item)) {
2993 f_result *= PyFloat_AS_DOUBLE(item);
2994 Py_DECREF(item);
2995 continue;
2996 }
2997 if (PyLong_CheckExact(item)) {
2998 long value;
2999 int overflow;
3000 value = PyLong_AsLongAndOverflow(item, &overflow);
3001 if (!overflow) {
3002 f_result *= (double)value;
3003 Py_DECREF(item);
3004 continue;
3005 }
3006 }
3007 result = PyFloat_FromDouble(f_result);
3008 if (result == NULL) {
3009 Py_DECREF(item);
3010 Py_DECREF(iter);
3011 return NULL;
3012 }
3013 temp = PyNumber_Multiply(result, item);
3014 Py_DECREF(result);
3015 Py_DECREF(item);
3016 result = temp;
3017 if (result == NULL) {
3018 Py_DECREF(iter);
3019 return NULL;
3020 }
3021 }
3022 }
3023#endif
3024 /* Consume rest of the iterable (if any) that could not be handled
3025 * by specialized functions above.*/
3026 for(;;) {
3027 item = PyIter_Next(iter);
3028 if (item == NULL) {
3029 /* error, or end-of-sequence */
3030 if (PyErr_Occurred()) {
3031 Py_DECREF(result);
3032 result = NULL;
3033 }
3034 break;
3035 }
3036 temp = PyNumber_Multiply(result, item);
3037 Py_DECREF(result);
3038 Py_DECREF(item);
3039 result = temp;
3040 if (result == NULL)
3041 break;
3042 }
3043 Py_DECREF(iter);
3044 return result;
3045}
3046
3047
Yash Aggarwal4a686502019-06-01 12:51:27 +05303048/*[clinic input]
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003049math.perm
3050
3051 n: object
Raymond Hettingere119b3d2019-06-08 08:58:11 -07003052 k: object = None
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003053 /
3054
3055Number of ways to choose k items from n items without repetition and with order.
3056
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07003057Evaluates to n! / (n - k)! when k <= n and evaluates
3058to zero when k > n.
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003059
Raymond Hettingere119b3d2019-06-08 08:58:11 -07003060If k is not specified or is None, then k defaults to n
3061and the function returns n!.
3062
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07003063Raises TypeError if either of the arguments are not integers.
3064Raises ValueError if either of the arguments are negative.
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003065[clinic start generated code]*/
3066
3067static PyObject *
3068math_perm_impl(PyObject *module, PyObject *n, PyObject *k)
Raymond Hettingere119b3d2019-06-08 08:58:11 -07003069/*[clinic end generated code: output=e021a25469653e23 input=5311c5a00f359b53]*/
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003070{
3071 PyObject *result = NULL, *factor = NULL;
3072 int overflow, cmp;
3073 long long i, factors;
3074
Raymond Hettingere119b3d2019-06-08 08:58:11 -07003075 if (k == Py_None) {
3076 return math_factorial(module, n);
3077 }
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003078 n = PyNumber_Index(n);
3079 if (n == NULL) {
3080 return NULL;
3081 }
3082 if (!PyLong_CheckExact(n)) {
3083 Py_SETREF(n, _PyLong_Copy((PyLongObject *)n));
3084 if (n == NULL) {
3085 return NULL;
3086 }
3087 }
3088 k = PyNumber_Index(k);
3089 if (k == NULL) {
3090 Py_DECREF(n);
3091 return NULL;
3092 }
3093 if (!PyLong_CheckExact(k)) {
3094 Py_SETREF(k, _PyLong_Copy((PyLongObject *)k));
3095 if (k == NULL) {
3096 Py_DECREF(n);
3097 return NULL;
3098 }
3099 }
3100
3101 if (Py_SIZE(n) < 0) {
3102 PyErr_SetString(PyExc_ValueError,
3103 "n must be a non-negative integer");
3104 goto error;
3105 }
Mark Dickinson45e04112019-06-16 11:06:06 +01003106 if (Py_SIZE(k) < 0) {
3107 PyErr_SetString(PyExc_ValueError,
3108 "k must be a non-negative integer");
3109 goto error;
3110 }
3111
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003112 cmp = PyObject_RichCompareBool(n, k, Py_LT);
3113 if (cmp != 0) {
3114 if (cmp > 0) {
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07003115 result = PyLong_FromLong(0);
3116 goto done;
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003117 }
3118 goto error;
3119 }
3120
3121 factors = PyLong_AsLongLongAndOverflow(k, &overflow);
3122 if (overflow > 0) {
3123 PyErr_Format(PyExc_OverflowError,
3124 "k must not exceed %lld",
3125 LLONG_MAX);
3126 goto error;
3127 }
Mark Dickinson45e04112019-06-16 11:06:06 +01003128 else if (factors == -1) {
3129 /* k is nonnegative, so a return value of -1 can only indicate error */
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003130 goto error;
3131 }
3132
3133 if (factors == 0) {
3134 result = PyLong_FromLong(1);
3135 goto done;
3136 }
3137
3138 result = n;
3139 Py_INCREF(result);
3140 if (factors == 1) {
3141 goto done;
3142 }
3143
3144 factor = n;
3145 Py_INCREF(factor);
3146 for (i = 1; i < factors; ++i) {
3147 Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One));
3148 if (factor == NULL) {
3149 goto error;
3150 }
3151 Py_SETREF(result, PyNumber_Multiply(result, factor));
3152 if (result == NULL) {
3153 goto error;
3154 }
3155 }
3156 Py_DECREF(factor);
3157
3158done:
3159 Py_DECREF(n);
3160 Py_DECREF(k);
3161 return result;
3162
3163error:
3164 Py_XDECREF(factor);
3165 Py_XDECREF(result);
3166 Py_DECREF(n);
3167 Py_DECREF(k);
3168 return NULL;
3169}
3170
3171
3172/*[clinic input]
Yash Aggarwal4a686502019-06-01 12:51:27 +05303173math.comb
3174
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003175 n: object
3176 k: object
3177 /
Yash Aggarwal4a686502019-06-01 12:51:27 +05303178
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003179Number of ways to choose k items from n items without repetition and without order.
Yash Aggarwal4a686502019-06-01 12:51:27 +05303180
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07003181Evaluates to n! / (k! * (n - k)!) when k <= n and evaluates
3182to zero when k > n.
Yash Aggarwal4a686502019-06-01 12:51:27 +05303183
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07003184Also called the binomial coefficient because it is equivalent
3185to the coefficient of k-th term in polynomial expansion of the
3186expression (1 + x)**n.
3187
3188Raises TypeError if either of the arguments are not integers.
3189Raises ValueError if either of the arguments are negative.
Yash Aggarwal4a686502019-06-01 12:51:27 +05303190
3191[clinic start generated code]*/
3192
3193static PyObject *
3194math_comb_impl(PyObject *module, PyObject *n, PyObject *k)
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07003195/*[clinic end generated code: output=bd2cec8d854f3493 input=9a05315af2518709]*/
Yash Aggarwal4a686502019-06-01 12:51:27 +05303196{
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003197 PyObject *result = NULL, *factor = NULL, *temp;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303198 int overflow, cmp;
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003199 long long i, factors;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303200
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003201 n = PyNumber_Index(n);
3202 if (n == NULL) {
3203 return NULL;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303204 }
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003205 if (!PyLong_CheckExact(n)) {
3206 Py_SETREF(n, _PyLong_Copy((PyLongObject *)n));
3207 if (n == NULL) {
3208 return NULL;
3209 }
3210 }
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003211 k = PyNumber_Index(k);
3212 if (k == NULL) {
3213 Py_DECREF(n);
3214 return NULL;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303215 }
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003216 if (!PyLong_CheckExact(k)) {
3217 Py_SETREF(k, _PyLong_Copy((PyLongObject *)k));
3218 if (k == NULL) {
3219 Py_DECREF(n);
3220 return NULL;
3221 }
3222 }
Yash Aggarwal4a686502019-06-01 12:51:27 +05303223
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003224 if (Py_SIZE(n) < 0) {
3225 PyErr_SetString(PyExc_ValueError,
3226 "n must be a non-negative integer");
3227 goto error;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303228 }
Mark Dickinson45e04112019-06-16 11:06:06 +01003229 if (Py_SIZE(k) < 0) {
3230 PyErr_SetString(PyExc_ValueError,
3231 "k must be a non-negative integer");
3232 goto error;
3233 }
3234
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003235 /* k = min(k, n - k) */
3236 temp = PyNumber_Subtract(n, k);
3237 if (temp == NULL) {
3238 goto error;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303239 }
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003240 if (Py_SIZE(temp) < 0) {
3241 Py_DECREF(temp);
Raymond Hettinger963eb0f2019-06-04 01:23:06 -07003242 result = PyLong_FromLong(0);
3243 goto done;
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003244 }
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003245 cmp = PyObject_RichCompareBool(temp, k, Py_LT);
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003246 if (cmp > 0) {
3247 Py_SETREF(k, temp);
Yash Aggarwal4a686502019-06-01 12:51:27 +05303248 }
3249 else {
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003250 Py_DECREF(temp);
3251 if (cmp < 0) {
3252 goto error;
3253 }
Yash Aggarwal4a686502019-06-01 12:51:27 +05303254 }
3255
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003256 factors = PyLong_AsLongLongAndOverflow(k, &overflow);
3257 if (overflow > 0) {
Yash Aggarwal4a686502019-06-01 12:51:27 +05303258 PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003259 "min(n - k, k) must not exceed %lld",
Yash Aggarwal4a686502019-06-01 12:51:27 +05303260 LLONG_MAX);
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003261 goto error;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303262 }
Mark Dickinson45e04112019-06-16 11:06:06 +01003263 if (factors == -1) {
3264 /* k is nonnegative, so a return value of -1 can only indicate error */
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003265 goto error;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303266 }
3267
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003268 if (factors == 0) {
3269 result = PyLong_FromLong(1);
3270 goto done;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303271 }
3272
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003273 result = n;
3274 Py_INCREF(result);
3275 if (factors == 1) {
3276 goto done;
Yash Aggarwal4a686502019-06-01 12:51:27 +05303277 }
3278
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003279 factor = n;
3280 Py_INCREF(factor);
3281 for (i = 1; i < factors; ++i) {
3282 Py_SETREF(factor, PyNumber_Subtract(factor, _PyLong_One));
3283 if (factor == NULL) {
3284 goto error;
3285 }
3286 Py_SETREF(result, PyNumber_Multiply(result, factor));
3287 if (result == NULL) {
3288 goto error;
3289 }
Yash Aggarwal4a686502019-06-01 12:51:27 +05303290
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003291 temp = PyLong_FromUnsignedLongLong((unsigned long long)i + 1);
3292 if (temp == NULL) {
3293 goto error;
3294 }
3295 Py_SETREF(result, PyNumber_FloorDivide(result, temp));
3296 Py_DECREF(temp);
3297 if (result == NULL) {
3298 goto error;
3299 }
3300 }
3301 Py_DECREF(factor);
Yash Aggarwal4a686502019-06-01 12:51:27 +05303302
Serhiy Storchaka2b843ac2019-06-01 22:09:02 +03003303done:
3304 Py_DECREF(n);
3305 Py_DECREF(k);
3306 return result;
3307
3308error:
3309 Py_XDECREF(factor);
3310 Py_XDECREF(result);
3311 Py_DECREF(n);
3312 Py_DECREF(k);
Yash Aggarwal4a686502019-06-01 12:51:27 +05303313 return NULL;
3314}
3315
3316
Barry Warsaw8b43b191996-12-09 22:32:36 +00003317static PyMethodDef math_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 {"acos", math_acos, METH_O, math_acos_doc},
3319 {"acosh", math_acosh, METH_O, math_acosh_doc},
3320 {"asin", math_asin, METH_O, math_asin_doc},
3321 {"asinh", math_asinh, METH_O, math_asinh_doc},
3322 {"atan", math_atan, METH_O, math_atan_doc},
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02003323 {"atan2", (PyCFunction)(void(*)(void))math_atan2, METH_FASTCALL, math_atan2_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 {"atanh", math_atanh, METH_O, math_atanh_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003325 MATH_CEIL_METHODDEF
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02003326 {"copysign", (PyCFunction)(void(*)(void))math_copysign, METH_FASTCALL, math_copysign_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 {"cos", math_cos, METH_O, math_cos_doc},
3328 {"cosh", math_cosh, METH_O, math_cosh_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003329 MATH_DEGREES_METHODDEF
Raymond Hettinger9c18b1a2018-07-31 00:45:49 -07003330 MATH_DIST_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 {"erf", math_erf, METH_O, math_erf_doc},
3332 {"erfc", math_erfc, METH_O, math_erfc_doc},
3333 {"exp", math_exp, METH_O, math_exp_doc},
3334 {"expm1", math_expm1, METH_O, math_expm1_doc},
3335 {"fabs", math_fabs, METH_O, math_fabs_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003336 MATH_FACTORIAL_METHODDEF
3337 MATH_FLOOR_METHODDEF
3338 MATH_FMOD_METHODDEF
3339 MATH_FREXP_METHODDEF
3340 MATH_FSUM_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 {"gamma", math_gamma, METH_O, math_gamma_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003342 MATH_GCD_METHODDEF
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02003343 {"hypot", (PyCFunction)(void(*)(void))math_hypot, METH_FASTCALL, math_hypot_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003344 MATH_ISCLOSE_METHODDEF
3345 MATH_ISFINITE_METHODDEF
3346 MATH_ISINF_METHODDEF
3347 MATH_ISNAN_METHODDEF
Mark Dickinson73934b92019-05-18 12:29:50 +01003348 MATH_ISQRT_METHODDEF
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003349 MATH_LDEXP_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003350 {"lgamma", math_lgamma, METH_O, math_lgamma_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003351 MATH_LOG_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003352 {"log1p", math_log1p, METH_O, math_log1p_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003353 MATH_LOG10_METHODDEF
3354 MATH_LOG2_METHODDEF
3355 MATH_MODF_METHODDEF
3356 MATH_POW_METHODDEF
3357 MATH_RADIANS_METHODDEF
Serhiy Storchakad0d3e992019-01-12 08:26:34 +02003358 {"remainder", (PyCFunction)(void(*)(void))math_remainder, METH_FASTCALL, math_remainder_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 {"sin", math_sin, METH_O, math_sin_doc},
3360 {"sinh", math_sinh, METH_O, math_sinh_doc},
3361 {"sqrt", math_sqrt, METH_O, math_sqrt_doc},
3362 {"tan", math_tan, METH_O, math_tan_doc},
3363 {"tanh", math_tanh, METH_O, math_tanh_doc},
Serhiy Storchakac9ea9332017-01-19 18:13:09 +02003364 MATH_TRUNC_METHODDEF
Pablo Galindobc098512019-02-07 07:04:02 +00003365 MATH_PROD_METHODDEF
Serhiy Storchaka5ae299a2019-06-02 11:16:49 +03003366 MATH_PERM_METHODDEF
Yash Aggarwal4a686502019-06-01 12:51:27 +05303367 MATH_COMB_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 {NULL, NULL} /* sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003369};
3370
Guido van Rossumc6e22901998-12-04 19:26:43 +00003371
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003372PyDoc_STRVAR(module_doc,
Ned Batchelder6faad352019-05-17 05:59:14 -04003373"This module provides access to the mathematical functions\n"
3374"defined by the C standard.");
Guido van Rossumc6e22901998-12-04 19:26:43 +00003375
Martin v. Löwis1a214512008-06-11 05:26:20 +00003376
3377static struct PyModuleDef mathmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003378 PyModuleDef_HEAD_INIT,
3379 "math",
3380 module_doc,
3381 -1,
3382 math_methods,
3383 NULL,
3384 NULL,
3385 NULL,
3386 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00003387};
3388
Mark Hammondfe51c6d2002-08-02 02:27:13 +00003389PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003390PyInit_math(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 PyObject *m;
Tim Petersfe71f812001-08-07 22:10:00 +00003393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 m = PyModule_Create(&mathmodule);
3395 if (m == NULL)
3396 goto finally;
Barry Warsawfc93f751996-12-17 00:47:03 +00003397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));
3399 PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
Guido van Rossum0a891d72016-08-15 09:12:52 -07003400 PyModule_AddObject(m, "tau", PyFloat_FromDouble(Py_MATH_TAU)); /* 2pi */
Mark Dickinsona5d0c7c2015-01-11 11:55:29 +00003401 PyModule_AddObject(m, "inf", PyFloat_FromDouble(m_inf()));
3402#if !defined(PY_NO_SHORT_FLOAT_REPR) || defined(Py_NAN)
3403 PyModule_AddObject(m, "nan", PyFloat_FromDouble(m_nan()));
3404#endif
Barry Warsawfc93f751996-12-17 00:47:03 +00003405
Mark Dickinsona5d0c7c2015-01-11 11:55:29 +00003406 finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 return m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003408}