1 /* Complex math module */
2 
3 /* much code borrowed from mathmodule.c */
4 
5 #ifndef Py_BUILD_CORE_BUILTIN
6 #  define Py_BUILD_CORE_MODULE 1
7 #endif
8 
9 #include "Python.h"
10 #include "pycore_pymath.h"        // _PY_SHORT_FLOAT_REPR
11 #include "pycore_dtoa.h"          // _Py_dg_stdnan()
12 /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from
13    float.h.  We assume that FLT_RADIX is either 2 or 16. */
14 #include <float.h>
15 
16 /* For _Py_log1p with workarounds for buggy handling of zeros. */
17 #include "_math.h"
18 
19 #include "clinic/cmathmodule.c.h"
20 /*[clinic input]
21 module cmath
22 [clinic start generated code]*/
23 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=308d6839f4a46333]*/
24 
25 /*[python input]
26 class Py_complex_protected_converter(Py_complex_converter):
27     def modify(self):
28         return 'errno = 0;'
29 
30 
31 class Py_complex_protected_return_converter(CReturnConverter):
32     type = "Py_complex"
33 
34     def render(self, function, data):
35         self.declare(data)
36         data.return_conversion.append("""
37 if (errno == EDOM) {
38     PyErr_SetString(PyExc_ValueError, "math domain error");
39     goto exit;
40 }
41 else if (errno == ERANGE) {
42     PyErr_SetString(PyExc_OverflowError, "math range error");
43     goto exit;
44 }
45 else {
46     return_value = PyComplex_FromCComplex(_return_value);
47 }
48 """.strip())
49 [python start generated code]*/
50 /*[python end generated code: output=da39a3ee5e6b4b0d input=8b27adb674c08321]*/
51 
52 #if (FLT_RADIX != 2 && FLT_RADIX != 16)
53 #error "Modules/cmathmodule.c expects FLT_RADIX to be 2 or 16"
54 #endif
55 
56 #ifndef M_LN2
57 #define M_LN2 (0.6931471805599453094) /* natural log of 2 */
58 #endif
59 
60 #ifndef M_LN10
61 #define M_LN10 (2.302585092994045684) /* natural log of 10 */
62 #endif
63 
64 /*
65    CM_LARGE_DOUBLE is used to avoid spurious overflow in the sqrt, log,
66    inverse trig and inverse hyperbolic trig functions.  Its log is used in the
67    evaluation of exp, cos, cosh, sin, sinh, tan, and tanh to avoid unnecessary
68    overflow.
69  */
70 
71 #define CM_LARGE_DOUBLE (DBL_MAX/4.)
72 #define CM_SQRT_LARGE_DOUBLE (sqrt(CM_LARGE_DOUBLE))
73 #define CM_LOG_LARGE_DOUBLE (log(CM_LARGE_DOUBLE))
74 #define CM_SQRT_DBL_MIN (sqrt(DBL_MIN))
75 
76 /*
77    CM_SCALE_UP is an odd integer chosen such that multiplication by
78    2**CM_SCALE_UP is sufficient to turn a subnormal into a normal.
79    CM_SCALE_DOWN is (-(CM_SCALE_UP+1)/2).  These scalings are used to compute
80    square roots accurately when the real and imaginary parts of the argument
81    are subnormal.
82 */
83 
84 #if FLT_RADIX==2
85 #define CM_SCALE_UP (2*(DBL_MANT_DIG/2) + 1)
86 #elif FLT_RADIX==16
87 #define CM_SCALE_UP (4*DBL_MANT_DIG+1)
88 #endif
89 #define CM_SCALE_DOWN (-(CM_SCALE_UP+1)/2)
90 
91 /* Constants cmath.inf, cmath.infj, cmath.nan, cmath.nanj.
92    cmath.nan and cmath.nanj are defined only when either
93    _PY_SHORT_FLOAT_REPR is 1 (which should be
94    the most common situation on machines using an IEEE 754
95    representation), or Py_NAN is defined. */
96 
97 static double
m_inf(void)98 m_inf(void)
99 {
100 #if _PY_SHORT_FLOAT_REPR == 1
101     return _Py_dg_infinity(0);
102 #else
103     return Py_HUGE_VAL;
104 #endif
105 }
106 
107 static Py_complex
c_infj(void)108 c_infj(void)
109 {
110     Py_complex r;
111     r.real = 0.0;
112     r.imag = m_inf();
113     return r;
114 }
115 
116 #if _PY_SHORT_FLOAT_REPR == 1
117 
118 static double
m_nan(void)119 m_nan(void)
120 {
121 #if _PY_SHORT_FLOAT_REPR == 1
122     return _Py_dg_stdnan(0);
123 #else
124     return Py_NAN;
125 #endif
126 }
127 
128 static Py_complex
c_nanj(void)129 c_nanj(void)
130 {
131     Py_complex r;
132     r.real = 0.0;
133     r.imag = m_nan();
134     return r;
135 }
136 
137 #endif
138 
139 /* forward declarations */
140 static Py_complex cmath_asinh_impl(PyObject *, Py_complex);
141 static Py_complex cmath_atanh_impl(PyObject *, Py_complex);
142 static Py_complex cmath_cosh_impl(PyObject *, Py_complex);
143 static Py_complex cmath_sinh_impl(PyObject *, Py_complex);
144 static Py_complex cmath_sqrt_impl(PyObject *, Py_complex);
145 static Py_complex cmath_tanh_impl(PyObject *, Py_complex);
146 static PyObject * math_error(void);
147 
148 /* Code to deal with special values (infinities, NaNs, etc.). */
149 
150 /* special_type takes a double and returns an integer code indicating
151    the type of the double as follows:
152 */
153 
154 enum special_types {
155     ST_NINF,            /* 0, negative infinity */
156     ST_NEG,             /* 1, negative finite number (nonzero) */
157     ST_NZERO,           /* 2, -0. */
158     ST_PZERO,           /* 3, +0. */
159     ST_POS,             /* 4, positive finite number (nonzero) */
160     ST_PINF,            /* 5, positive infinity */
161     ST_NAN              /* 6, Not a Number */
162 };
163 
164 static enum special_types
special_type(double d)165 special_type(double d)
166 {
167     if (Py_IS_FINITE(d)) {
168         if (d != 0) {
169             if (copysign(1., d) == 1.)
170                 return ST_POS;
171             else
172                 return ST_NEG;
173         }
174         else {
175             if (copysign(1., d) == 1.)
176                 return ST_PZERO;
177             else
178                 return ST_NZERO;
179         }
180     }
181     if (Py_IS_NAN(d))
182         return ST_NAN;
183     if (copysign(1., d) == 1.)
184         return ST_PINF;
185     else
186         return ST_NINF;
187 }
188 
189 #define SPECIAL_VALUE(z, table)                                         \
190     if (!Py_IS_FINITE((z).real) || !Py_IS_FINITE((z).imag)) {           \
191         errno = 0;                                              \
192         return table[special_type((z).real)]                            \
193                     [special_type((z).imag)];                           \
194     }
195 
196 #define P Py_MATH_PI
197 #define P14 0.25*Py_MATH_PI
198 #define P12 0.5*Py_MATH_PI
199 #define P34 0.75*Py_MATH_PI
200 #define INF Py_HUGE_VAL
201 #define N Py_NAN
202 #define U -9.5426319407711027e33 /* unlikely value, used as placeholder */
203 
204 /* First, the C functions that do the real work.  Each of the c_*
205    functions computes and returns the C99 Annex G recommended result
206    and also sets errno as follows: errno = 0 if no floating-point
207    exception is associated with the result; errno = EDOM if C99 Annex
208    G recommends raising divide-by-zero or invalid for this result; and
209    errno = ERANGE where the overflow floating-point signal should be
210    raised.
211 */
212 
213 static Py_complex acos_special_values[7][7];
214 
215 /*[clinic input]
216 cmath.acos -> Py_complex_protected
217 
218     z: Py_complex_protected
219     /
220 
221 Return the arc cosine of z.
222 [clinic start generated code]*/
223 
224 static Py_complex
cmath_acos_impl(PyObject * module,Py_complex z)225 cmath_acos_impl(PyObject *module, Py_complex z)
226 /*[clinic end generated code: output=40bd42853fd460ae input=bd6cbd78ae851927]*/
227 {
228     Py_complex s1, s2, r;
229 
230     SPECIAL_VALUE(z, acos_special_values);
231 
232     if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
233         /* avoid unnecessary overflow for large arguments */
234         r.real = atan2(fabs(z.imag), z.real);
235         /* split into cases to make sure that the branch cut has the
236            correct continuity on systems with unsigned zeros */
237         if (z.real < 0.) {
238             r.imag = -copysign(log(hypot(z.real/2., z.imag/2.)) +
239                                M_LN2*2., z.imag);
240         } else {
241             r.imag = copysign(log(hypot(z.real/2., z.imag/2.)) +
242                               M_LN2*2., -z.imag);
243         }
244     } else {
245         s1.real = 1.-z.real;
246         s1.imag = -z.imag;
247         s1 = cmath_sqrt_impl(module, s1);
248         s2.real = 1.+z.real;
249         s2.imag = z.imag;
250         s2 = cmath_sqrt_impl(module, s2);
251         r.real = 2.*atan2(s1.real, s2.real);
252         r.imag = asinh(s2.real*s1.imag - s2.imag*s1.real);
253     }
254     errno = 0;
255     return r;
256 }
257 
258 
259 static Py_complex acosh_special_values[7][7];
260 
261 /*[clinic input]
262 cmath.acosh = cmath.acos
263 
264 Return the inverse hyperbolic cosine of z.
265 [clinic start generated code]*/
266 
267 static Py_complex
cmath_acosh_impl(PyObject * module,Py_complex z)268 cmath_acosh_impl(PyObject *module, Py_complex z)
269 /*[clinic end generated code: output=3e2454d4fcf404ca input=3f61bee7d703e53c]*/
270 {
271     Py_complex s1, s2, r;
272 
273     SPECIAL_VALUE(z, acosh_special_values);
274 
275     if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
276         /* avoid unnecessary overflow for large arguments */
277         r.real = log(hypot(z.real/2., z.imag/2.)) + M_LN2*2.;
278         r.imag = atan2(z.imag, z.real);
279     } else {
280         s1.real = z.real - 1.;
281         s1.imag = z.imag;
282         s1 = cmath_sqrt_impl(module, s1);
283         s2.real = z.real + 1.;
284         s2.imag = z.imag;
285         s2 = cmath_sqrt_impl(module, s2);
286         r.real = asinh(s1.real*s2.real + s1.imag*s2.imag);
287         r.imag = 2.*atan2(s1.imag, s2.real);
288     }
289     errno = 0;
290     return r;
291 }
292 
293 /*[clinic input]
294 cmath.asin = cmath.acos
295 
296 Return the arc sine of z.
297 [clinic start generated code]*/
298 
299 static Py_complex
cmath_asin_impl(PyObject * module,Py_complex z)300 cmath_asin_impl(PyObject *module, Py_complex z)
301 /*[clinic end generated code: output=3b264cd1b16bf4e1 input=be0bf0cfdd5239c5]*/
302 {
303     /* asin(z) = -i asinh(iz) */
304     Py_complex s, r;
305     s.real = -z.imag;
306     s.imag = z.real;
307     s = cmath_asinh_impl(module, s);
308     r.real = s.imag;
309     r.imag = -s.real;
310     return r;
311 }
312 
313 
314 static Py_complex asinh_special_values[7][7];
315 
316 /*[clinic input]
317 cmath.asinh = cmath.acos
318 
319 Return the inverse hyperbolic sine of z.
320 [clinic start generated code]*/
321 
322 static Py_complex
cmath_asinh_impl(PyObject * module,Py_complex z)323 cmath_asinh_impl(PyObject *module, Py_complex z)
324 /*[clinic end generated code: output=733d8107841a7599 input=5c09448fcfc89a79]*/
325 {
326     Py_complex s1, s2, r;
327 
328     SPECIAL_VALUE(z, asinh_special_values);
329 
330     if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
331         if (z.imag >= 0.) {
332             r.real = copysign(log(hypot(z.real/2., z.imag/2.)) +
333                               M_LN2*2., z.real);
334         } else {
335             r.real = -copysign(log(hypot(z.real/2., z.imag/2.)) +
336                                M_LN2*2., -z.real);
337         }
338         r.imag = atan2(z.imag, fabs(z.real));
339     } else {
340         s1.real = 1.+z.imag;
341         s1.imag = -z.real;
342         s1 = cmath_sqrt_impl(module, s1);
343         s2.real = 1.-z.imag;
344         s2.imag = z.real;
345         s2 = cmath_sqrt_impl(module, s2);
346         r.real = asinh(s1.real*s2.imag-s2.real*s1.imag);
347         r.imag = atan2(z.imag, s1.real*s2.real-s1.imag*s2.imag);
348     }
349     errno = 0;
350     return r;
351 }
352 
353 
354 /*[clinic input]
355 cmath.atan = cmath.acos
356 
357 Return the arc tangent of z.
358 [clinic start generated code]*/
359 
360 static Py_complex
cmath_atan_impl(PyObject * module,Py_complex z)361 cmath_atan_impl(PyObject *module, Py_complex z)
362 /*[clinic end generated code: output=b6bfc497058acba4 input=3b21ff7d5eac632a]*/
363 {
364     /* atan(z) = -i atanh(iz) */
365     Py_complex s, r;
366     s.real = -z.imag;
367     s.imag = z.real;
368     s = cmath_atanh_impl(module, s);
369     r.real = s.imag;
370     r.imag = -s.real;
371     return r;
372 }
373 
374 /* Windows screws up atan2 for inf and nan, and alpha Tru64 5.1 doesn't follow
375    C99 for atan2(0., 0.). */
376 static double
c_atan2(Py_complex z)377 c_atan2(Py_complex z)
378 {
379     if (Py_IS_NAN(z.real) || Py_IS_NAN(z.imag))
380         return Py_NAN;
381     if (Py_IS_INFINITY(z.imag)) {
382         if (Py_IS_INFINITY(z.real)) {
383             if (copysign(1., z.real) == 1.)
384                 /* atan2(+-inf, +inf) == +-pi/4 */
385                 return copysign(0.25*Py_MATH_PI, z.imag);
386             else
387                 /* atan2(+-inf, -inf) == +-pi*3/4 */
388                 return copysign(0.75*Py_MATH_PI, z.imag);
389         }
390         /* atan2(+-inf, x) == +-pi/2 for finite x */
391         return copysign(0.5*Py_MATH_PI, z.imag);
392     }
393     if (Py_IS_INFINITY(z.real) || z.imag == 0.) {
394         if (copysign(1., z.real) == 1.)
395             /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
396             return copysign(0., z.imag);
397         else
398             /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
399             return copysign(Py_MATH_PI, z.imag);
400     }
401     return atan2(z.imag, z.real);
402 }
403 
404 
405 static Py_complex atanh_special_values[7][7];
406 
407 /*[clinic input]
408 cmath.atanh = cmath.acos
409 
410 Return the inverse hyperbolic tangent of z.
411 [clinic start generated code]*/
412 
413 static Py_complex
cmath_atanh_impl(PyObject * module,Py_complex z)414 cmath_atanh_impl(PyObject *module, Py_complex z)
415 /*[clinic end generated code: output=e83355f93a989c9e input=2b3fdb82fb34487b]*/
416 {
417     Py_complex r;
418     double ay, h;
419 
420     SPECIAL_VALUE(z, atanh_special_values);
421 
422     /* Reduce to case where z.real >= 0., using atanh(z) = -atanh(-z). */
423     if (z.real < 0.) {
424         return _Py_c_neg(cmath_atanh_impl(module, _Py_c_neg(z)));
425     }
426 
427     ay = fabs(z.imag);
428     if (z.real > CM_SQRT_LARGE_DOUBLE || ay > CM_SQRT_LARGE_DOUBLE) {
429         /*
430            if abs(z) is large then we use the approximation
431            atanh(z) ~ 1/z +/- i*pi/2 (+/- depending on the sign
432            of z.imag)
433         */
434         h = hypot(z.real/2., z.imag/2.);  /* safe from overflow */
435         r.real = z.real/4./h/h;
436         /* the two negations in the next line cancel each other out
437            except when working with unsigned zeros: they're there to
438            ensure that the branch cut has the correct continuity on
439            systems that don't support signed zeros */
440         r.imag = -copysign(Py_MATH_PI/2., -z.imag);
441         errno = 0;
442     } else if (z.real == 1. && ay < CM_SQRT_DBL_MIN) {
443         /* C99 standard says:  atanh(1+/-0.) should be inf +/- 0i */
444         if (ay == 0.) {
445             r.real = INF;
446             r.imag = z.imag;
447             errno = EDOM;
448         } else {
449             r.real = -log(sqrt(ay)/sqrt(hypot(ay, 2.)));
450             r.imag = copysign(atan2(2., -ay)/2, z.imag);
451             errno = 0;
452         }
453     } else {
454         r.real = m_log1p(4.*z.real/((1-z.real)*(1-z.real) + ay*ay))/4.;
455         r.imag = -atan2(-2.*z.imag, (1-z.real)*(1+z.real) - ay*ay)/2.;
456         errno = 0;
457     }
458     return r;
459 }
460 
461 
462 /*[clinic input]
463 cmath.cos = cmath.acos
464 
465 Return the cosine of z.
466 [clinic start generated code]*/
467 
468 static Py_complex
cmath_cos_impl(PyObject * module,Py_complex z)469 cmath_cos_impl(PyObject *module, Py_complex z)
470 /*[clinic end generated code: output=fd64918d5b3186db input=6022e39b77127ac7]*/
471 {
472     /* cos(z) = cosh(iz) */
473     Py_complex r;
474     r.real = -z.imag;
475     r.imag = z.real;
476     r = cmath_cosh_impl(module, r);
477     return r;
478 }
479 
480 
481 /* cosh(infinity + i*y) needs to be dealt with specially */
482 static Py_complex cosh_special_values[7][7];
483 
484 /*[clinic input]
485 cmath.cosh = cmath.acos
486 
487 Return the hyperbolic cosine of z.
488 [clinic start generated code]*/
489 
490 static Py_complex
cmath_cosh_impl(PyObject * module,Py_complex z)491 cmath_cosh_impl(PyObject *module, Py_complex z)
492 /*[clinic end generated code: output=2e969047da601bdb input=d6b66339e9cc332b]*/
493 {
494     Py_complex r;
495     double x_minus_one;
496 
497     /* special treatment for cosh(+/-inf + iy) if y is not a NaN */
498     if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
499         if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag) &&
500             (z.imag != 0.)) {
501             if (z.real > 0) {
502                 r.real = copysign(INF, cos(z.imag));
503                 r.imag = copysign(INF, sin(z.imag));
504             }
505             else {
506                 r.real = copysign(INF, cos(z.imag));
507                 r.imag = -copysign(INF, sin(z.imag));
508             }
509         }
510         else {
511             r = cosh_special_values[special_type(z.real)]
512                                    [special_type(z.imag)];
513         }
514         /* need to set errno = EDOM if y is +/- infinity and x is not
515            a NaN */
516         if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))
517             errno = EDOM;
518         else
519             errno = 0;
520         return r;
521     }
522 
523     if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
524         /* deal correctly with cases where cosh(z.real) overflows but
525            cosh(z) does not. */
526         x_minus_one = z.real - copysign(1., z.real);
527         r.real = cos(z.imag) * cosh(x_minus_one) * Py_MATH_E;
528         r.imag = sin(z.imag) * sinh(x_minus_one) * Py_MATH_E;
529     } else {
530         r.real = cos(z.imag) * cosh(z.real);
531         r.imag = sin(z.imag) * sinh(z.real);
532     }
533     /* detect overflow, and set errno accordingly */
534     if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
535         errno = ERANGE;
536     else
537         errno = 0;
538     return r;
539 }
540 
541 
542 /* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for
543    finite y */
544 static Py_complex exp_special_values[7][7];
545 
546 /*[clinic input]
547 cmath.exp = cmath.acos
548 
549 Return the exponential value e**z.
550 [clinic start generated code]*/
551 
552 static Py_complex
cmath_exp_impl(PyObject * module,Py_complex z)553 cmath_exp_impl(PyObject *module, Py_complex z)
554 /*[clinic end generated code: output=edcec61fb9dfda6c input=8b9e6cf8a92174c3]*/
555 {
556     Py_complex r;
557     double l;
558 
559     if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
560         if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
561             && (z.imag != 0.)) {
562             if (z.real > 0) {
563                 r.real = copysign(INF, cos(z.imag));
564                 r.imag = copysign(INF, sin(z.imag));
565             }
566             else {
567                 r.real = copysign(0., cos(z.imag));
568                 r.imag = copysign(0., sin(z.imag));
569             }
570         }
571         else {
572             r = exp_special_values[special_type(z.real)]
573                                   [special_type(z.imag)];
574         }
575         /* need to set errno = EDOM if y is +/- infinity and x is not
576            a NaN and not -infinity */
577         if (Py_IS_INFINITY(z.imag) &&
578             (Py_IS_FINITE(z.real) ||
579              (Py_IS_INFINITY(z.real) && z.real > 0)))
580             errno = EDOM;
581         else
582             errno = 0;
583         return r;
584     }
585 
586     if (z.real > CM_LOG_LARGE_DOUBLE) {
587         l = exp(z.real-1.);
588         r.real = l*cos(z.imag)*Py_MATH_E;
589         r.imag = l*sin(z.imag)*Py_MATH_E;
590     } else {
591         l = exp(z.real);
592         r.real = l*cos(z.imag);
593         r.imag = l*sin(z.imag);
594     }
595     /* detect overflow, and set errno accordingly */
596     if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
597         errno = ERANGE;
598     else
599         errno = 0;
600     return r;
601 }
602 
603 static Py_complex log_special_values[7][7];
604 
605 static Py_complex
c_log(Py_complex z)606 c_log(Py_complex z)
607 {
608     /*
609        The usual formula for the real part is log(hypot(z.real, z.imag)).
610        There are four situations where this formula is potentially
611        problematic:
612 
613        (1) the absolute value of z is subnormal.  Then hypot is subnormal,
614        so has fewer than the usual number of bits of accuracy, hence may
615        have large relative error.  This then gives a large absolute error
616        in the log.  This can be solved by rescaling z by a suitable power
617        of 2.
618 
619        (2) the absolute value of z is greater than DBL_MAX (e.g. when both
620        z.real and z.imag are within a factor of 1/sqrt(2) of DBL_MAX)
621        Again, rescaling solves this.
622 
623        (3) the absolute value of z is close to 1.  In this case it's
624        difficult to achieve good accuracy, at least in part because a
625        change of 1ulp in the real or imaginary part of z can result in a
626        change of billions of ulps in the correctly rounded answer.
627 
628        (4) z = 0.  The simplest thing to do here is to call the
629        floating-point log with an argument of 0, and let its behaviour
630        (returning -infinity, signaling a floating-point exception, setting
631        errno, or whatever) determine that of c_log.  So the usual formula
632        is fine here.
633 
634      */
635 
636     Py_complex r;
637     double ax, ay, am, an, h;
638 
639     SPECIAL_VALUE(z, log_special_values);
640 
641     ax = fabs(z.real);
642     ay = fabs(z.imag);
643 
644     if (ax > CM_LARGE_DOUBLE || ay > CM_LARGE_DOUBLE) {
645         r.real = log(hypot(ax/2., ay/2.)) + M_LN2;
646     } else if (ax < DBL_MIN && ay < DBL_MIN) {
647         if (ax > 0. || ay > 0.) {
648             /* catch cases where hypot(ax, ay) is subnormal */
649             r.real = log(hypot(ldexp(ax, DBL_MANT_DIG),
650                      ldexp(ay, DBL_MANT_DIG))) - DBL_MANT_DIG*M_LN2;
651         }
652         else {
653             /* log(+/-0. +/- 0i) */
654             r.real = -INF;
655             r.imag = atan2(z.imag, z.real);
656             errno = EDOM;
657             return r;
658         }
659     } else {
660         h = hypot(ax, ay);
661         if (0.71 <= h && h <= 1.73) {
662             am = ax > ay ? ax : ay;  /* max(ax, ay) */
663             an = ax > ay ? ay : ax;  /* min(ax, ay) */
664             r.real = m_log1p((am-1)*(am+1)+an*an)/2.;
665         } else {
666             r.real = log(h);
667         }
668     }
669     r.imag = atan2(z.imag, z.real);
670     errno = 0;
671     return r;
672 }
673 
674 
675 /*[clinic input]
676 cmath.log10 = cmath.acos
677 
678 Return the base-10 logarithm of z.
679 [clinic start generated code]*/
680 
681 static Py_complex
cmath_log10_impl(PyObject * module,Py_complex z)682 cmath_log10_impl(PyObject *module, Py_complex z)
683 /*[clinic end generated code: output=2922779a7c38cbe1 input=cff5644f73c1519c]*/
684 {
685     Py_complex r;
686     int errno_save;
687 
688     r = c_log(z);
689     errno_save = errno; /* just in case the divisions affect errno */
690     r.real = r.real / M_LN10;
691     r.imag = r.imag / M_LN10;
692     errno = errno_save;
693     return r;
694 }
695 
696 
697 /*[clinic input]
698 cmath.sin = cmath.acos
699 
700 Return the sine of z.
701 [clinic start generated code]*/
702 
703 static Py_complex
cmath_sin_impl(PyObject * module,Py_complex z)704 cmath_sin_impl(PyObject *module, Py_complex z)
705 /*[clinic end generated code: output=980370d2ff0bb5aa input=2d3519842a8b4b85]*/
706 {
707     /* sin(z) = -i sin(iz) */
708     Py_complex s, r;
709     s.real = -z.imag;
710     s.imag = z.real;
711     s = cmath_sinh_impl(module, s);
712     r.real = s.imag;
713     r.imag = -s.real;
714     return r;
715 }
716 
717 
718 /* sinh(infinity + i*y) needs to be dealt with specially */
719 static Py_complex sinh_special_values[7][7];
720 
721 /*[clinic input]
722 cmath.sinh = cmath.acos
723 
724 Return the hyperbolic sine of z.
725 [clinic start generated code]*/
726 
727 static Py_complex
cmath_sinh_impl(PyObject * module,Py_complex z)728 cmath_sinh_impl(PyObject *module, Py_complex z)
729 /*[clinic end generated code: output=38b0a6cce26f3536 input=d2d3fc8c1ddfd2dd]*/
730 {
731     Py_complex r;
732     double x_minus_one;
733 
734     /* special treatment for sinh(+/-inf + iy) if y is finite and
735        nonzero */
736     if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
737         if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
738             && (z.imag != 0.)) {
739             if (z.real > 0) {
740                 r.real = copysign(INF, cos(z.imag));
741                 r.imag = copysign(INF, sin(z.imag));
742             }
743             else {
744                 r.real = -copysign(INF, cos(z.imag));
745                 r.imag = copysign(INF, sin(z.imag));
746             }
747         }
748         else {
749             r = sinh_special_values[special_type(z.real)]
750                                    [special_type(z.imag)];
751         }
752         /* need to set errno = EDOM if y is +/- infinity and x is not
753            a NaN */
754         if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))
755             errno = EDOM;
756         else
757             errno = 0;
758         return r;
759     }
760 
761     if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
762         x_minus_one = z.real - copysign(1., z.real);
763         r.real = cos(z.imag) * sinh(x_minus_one) * Py_MATH_E;
764         r.imag = sin(z.imag) * cosh(x_minus_one) * Py_MATH_E;
765     } else {
766         r.real = cos(z.imag) * sinh(z.real);
767         r.imag = sin(z.imag) * cosh(z.real);
768     }
769     /* detect overflow, and set errno accordingly */
770     if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
771         errno = ERANGE;
772     else
773         errno = 0;
774     return r;
775 }
776 
777 
778 static Py_complex sqrt_special_values[7][7];
779 
780 /*[clinic input]
781 cmath.sqrt = cmath.acos
782 
783 Return the square root of z.
784 [clinic start generated code]*/
785 
786 static Py_complex
cmath_sqrt_impl(PyObject * module,Py_complex z)787 cmath_sqrt_impl(PyObject *module, Py_complex z)
788 /*[clinic end generated code: output=b6507b3029c339fc input=7088b166fc9a58c7]*/
789 {
790     /*
791        Method: use symmetries to reduce to the case when x = z.real and y
792        = z.imag are nonnegative.  Then the real part of the result is
793        given by
794 
795          s = sqrt((x + hypot(x, y))/2)
796 
797        and the imaginary part is
798 
799          d = (y/2)/s
800 
801        If either x or y is very large then there's a risk of overflow in
802        computation of the expression x + hypot(x, y).  We can avoid this
803        by rewriting the formula for s as:
804 
805          s = 2*sqrt(x/8 + hypot(x/8, y/8))
806 
807        This costs us two extra multiplications/divisions, but avoids the
808        overhead of checking for x and y large.
809 
810        If both x and y are subnormal then hypot(x, y) may also be
811        subnormal, so will lack full precision.  We solve this by rescaling
812        x and y by a sufficiently large power of 2 to ensure that x and y
813        are normal.
814     */
815 
816 
817     Py_complex r;
818     double s,d;
819     double ax, ay;
820 
821     SPECIAL_VALUE(z, sqrt_special_values);
822 
823     if (z.real == 0. && z.imag == 0.) {
824         r.real = 0.;
825         r.imag = z.imag;
826         return r;
827     }
828 
829     ax = fabs(z.real);
830     ay = fabs(z.imag);
831 
832     if (ax < DBL_MIN && ay < DBL_MIN && (ax > 0. || ay > 0.)) {
833         /* here we catch cases where hypot(ax, ay) is subnormal */
834         ax = ldexp(ax, CM_SCALE_UP);
835         s = ldexp(sqrt(ax + hypot(ax, ldexp(ay, CM_SCALE_UP))),
836                   CM_SCALE_DOWN);
837     } else {
838         ax /= 8.;
839         s = 2.*sqrt(ax + hypot(ax, ay/8.));
840     }
841     d = ay/(2.*s);
842 
843     if (z.real >= 0.) {
844         r.real = s;
845         r.imag = copysign(d, z.imag);
846     } else {
847         r.real = d;
848         r.imag = copysign(s, z.imag);
849     }
850     errno = 0;
851     return r;
852 }
853 
854 
855 /*[clinic input]
856 cmath.tan = cmath.acos
857 
858 Return the tangent of z.
859 [clinic start generated code]*/
860 
861 static Py_complex
cmath_tan_impl(PyObject * module,Py_complex z)862 cmath_tan_impl(PyObject *module, Py_complex z)
863 /*[clinic end generated code: output=7c5f13158a72eb13 input=fc167e528767888e]*/
864 {
865     /* tan(z) = -i tanh(iz) */
866     Py_complex s, r;
867     s.real = -z.imag;
868     s.imag = z.real;
869     s = cmath_tanh_impl(module, s);
870     r.real = s.imag;
871     r.imag = -s.real;
872     return r;
873 }
874 
875 
876 /* tanh(infinity + i*y) needs to be dealt with specially */
877 static Py_complex tanh_special_values[7][7];
878 
879 /*[clinic input]
880 cmath.tanh = cmath.acos
881 
882 Return the hyperbolic tangent of z.
883 [clinic start generated code]*/
884 
885 static Py_complex
cmath_tanh_impl(PyObject * module,Py_complex z)886 cmath_tanh_impl(PyObject *module, Py_complex z)
887 /*[clinic end generated code: output=36d547ef7aca116c input=22f67f9dc6d29685]*/
888 {
889     /* Formula:
890 
891        tanh(x+iy) = (tanh(x)(1+tan(y)^2) + i tan(y)(1-tanh(x))^2) /
892        (1+tan(y)^2 tanh(x)^2)
893 
894        To avoid excessive roundoff error, 1-tanh(x)^2 is better computed
895        as 1/cosh(x)^2.  When abs(x) is large, we approximate 1-tanh(x)^2
896        by 4 exp(-2*x) instead, to avoid possible overflow in the
897        computation of cosh(x).
898 
899     */
900 
901     Py_complex r;
902     double tx, ty, cx, txty, denom;
903 
904     /* special treatment for tanh(+/-inf + iy) if y is finite and
905        nonzero */
906     if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
907         if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
908             && (z.imag != 0.)) {
909             if (z.real > 0) {
910                 r.real = 1.0;
911                 r.imag = copysign(0.,
912                                   2.*sin(z.imag)*cos(z.imag));
913             }
914             else {
915                 r.real = -1.0;
916                 r.imag = copysign(0.,
917                                   2.*sin(z.imag)*cos(z.imag));
918             }
919         }
920         else {
921             r = tanh_special_values[special_type(z.real)]
922                                    [special_type(z.imag)];
923         }
924         /* need to set errno = EDOM if z.imag is +/-infinity and
925            z.real is finite */
926         if (Py_IS_INFINITY(z.imag) && Py_IS_FINITE(z.real))
927             errno = EDOM;
928         else
929             errno = 0;
930         return r;
931     }
932 
933     /* danger of overflow in 2.*z.imag !*/
934     if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
935         r.real = copysign(1., z.real);
936         r.imag = 4.*sin(z.imag)*cos(z.imag)*exp(-2.*fabs(z.real));
937     } else {
938         tx = tanh(z.real);
939         ty = tan(z.imag);
940         cx = 1./cosh(z.real);
941         txty = tx*ty;
942         denom = 1. + txty*txty;
943         r.real = tx*(1.+ty*ty)/denom;
944         r.imag = ((ty/denom)*cx)*cx;
945     }
946     errno = 0;
947     return r;
948 }
949 
950 
951 /*[clinic input]
952 cmath.log
953 
954     z as x: Py_complex
955     base as y_obj: object = NULL
956     /
957 
958 log(z[, base]) -> the logarithm of z to the given base.
959 
960 If the base is not specified, returns the natural logarithm (base e) of z.
961 [clinic start generated code]*/
962 
963 static PyObject *
cmath_log_impl(PyObject * module,Py_complex x,PyObject * y_obj)964 cmath_log_impl(PyObject *module, Py_complex x, PyObject *y_obj)
965 /*[clinic end generated code: output=4effdb7d258e0d94 input=e1f81d4fcfd26497]*/
966 {
967     Py_complex y;
968 
969     errno = 0;
970     x = c_log(x);
971     if (y_obj != NULL) {
972         y = PyComplex_AsCComplex(y_obj);
973         if (PyErr_Occurred()) {
974             return NULL;
975         }
976         y = c_log(y);
977         x = _Py_c_quot(x, y);
978     }
979     if (errno != 0)
980         return math_error();
981     return PyComplex_FromCComplex(x);
982 }
983 
984 
985 /* And now the glue to make them available from Python: */
986 
987 static PyObject *
math_error(void)988 math_error(void)
989 {
990     if (errno == EDOM)
991         PyErr_SetString(PyExc_ValueError, "math domain error");
992     else if (errno == ERANGE)
993         PyErr_SetString(PyExc_OverflowError, "math range error");
994     else    /* Unexpected math error */
995         PyErr_SetFromErrno(PyExc_ValueError);
996     return NULL;
997 }
998 
999 
1000 /*[clinic input]
1001 cmath.phase
1002 
1003     z: Py_complex
1004     /
1005 
1006 Return argument, also known as the phase angle, of a complex.
1007 [clinic start generated code]*/
1008 
1009 static PyObject *
cmath_phase_impl(PyObject * module,Py_complex z)1010 cmath_phase_impl(PyObject *module, Py_complex z)
1011 /*[clinic end generated code: output=50725086a7bfd253 input=5cf75228ba94b69d]*/
1012 {
1013     double phi;
1014 
1015     errno = 0;
1016     phi = c_atan2(z);
1017     if (errno != 0)
1018         return math_error();
1019     else
1020         return PyFloat_FromDouble(phi);
1021 }
1022 
1023 /*[clinic input]
1024 cmath.polar
1025 
1026     z: Py_complex
1027     /
1028 
1029 Convert a complex from rectangular coordinates to polar coordinates.
1030 
1031 r is the distance from 0 and phi the phase angle.
1032 [clinic start generated code]*/
1033 
1034 static PyObject *
cmath_polar_impl(PyObject * module,Py_complex z)1035 cmath_polar_impl(PyObject *module, Py_complex z)
1036 /*[clinic end generated code: output=d0a8147c41dbb654 input=26c353574fd1a861]*/
1037 {
1038     double r, phi;
1039 
1040     errno = 0;
1041     phi = c_atan2(z); /* should not cause any exception */
1042     r = _Py_c_abs(z); /* sets errno to ERANGE on overflow */
1043     if (errno != 0)
1044         return math_error();
1045     else
1046         return Py_BuildValue("dd", r, phi);
1047 }
1048 
1049 /*
1050   rect() isn't covered by the C99 standard, but it's not too hard to
1051   figure out 'spirit of C99' rules for special value handing:
1052 
1053     rect(x, t) should behave like exp(log(x) + it) for positive-signed x
1054     rect(x, t) should behave like -exp(log(-x) + it) for negative-signed x
1055     rect(nan, t) should behave like exp(nan + it), except that rect(nan, 0)
1056       gives nan +- i0 with the sign of the imaginary part unspecified.
1057 
1058 */
1059 
1060 static Py_complex rect_special_values[7][7];
1061 
1062 /*[clinic input]
1063 cmath.rect
1064 
1065     r: double
1066     phi: double
1067     /
1068 
1069 Convert from polar coordinates to rectangular coordinates.
1070 [clinic start generated code]*/
1071 
1072 static PyObject *
cmath_rect_impl(PyObject * module,double r,double phi)1073 cmath_rect_impl(PyObject *module, double r, double phi)
1074 /*[clinic end generated code: output=385a0690925df2d5 input=24c5646d147efd69]*/
1075 {
1076     Py_complex z;
1077     errno = 0;
1078 
1079     /* deal with special values */
1080     if (!Py_IS_FINITE(r) || !Py_IS_FINITE(phi)) {
1081         /* if r is +/-infinity and phi is finite but nonzero then
1082            result is (+-INF +-INF i), but we need to compute cos(phi)
1083            and sin(phi) to figure out the signs. */
1084         if (Py_IS_INFINITY(r) && (Py_IS_FINITE(phi)
1085                                   && (phi != 0.))) {
1086             if (r > 0) {
1087                 z.real = copysign(INF, cos(phi));
1088                 z.imag = copysign(INF, sin(phi));
1089             }
1090             else {
1091                 z.real = -copysign(INF, cos(phi));
1092                 z.imag = -copysign(INF, sin(phi));
1093             }
1094         }
1095         else {
1096             z = rect_special_values[special_type(r)]
1097                                    [special_type(phi)];
1098         }
1099         /* need to set errno = EDOM if r is a nonzero number and phi
1100            is infinite */
1101         if (r != 0. && !Py_IS_NAN(r) && Py_IS_INFINITY(phi))
1102             errno = EDOM;
1103         else
1104             errno = 0;
1105     }
1106     else if (phi == 0.0) {
1107         /* Workaround for buggy results with phi=-0.0 on OS X 10.8.  See
1108            bugs.python.org/issue18513. */
1109         z.real = r;
1110         z.imag = r * phi;
1111         errno = 0;
1112     }
1113     else {
1114         z.real = r * cos(phi);
1115         z.imag = r * sin(phi);
1116         errno = 0;
1117     }
1118 
1119     if (errno != 0)
1120         return math_error();
1121     else
1122         return PyComplex_FromCComplex(z);
1123 }
1124 
1125 /*[clinic input]
1126 cmath.isfinite = cmath.polar
1127 
1128 Return True if both the real and imaginary parts of z are finite, else False.
1129 [clinic start generated code]*/
1130 
1131 static PyObject *
cmath_isfinite_impl(PyObject * module,Py_complex z)1132 cmath_isfinite_impl(PyObject *module, Py_complex z)
1133 /*[clinic end generated code: output=ac76611e2c774a36 input=848e7ee701895815]*/
1134 {
1135     return PyBool_FromLong(Py_IS_FINITE(z.real) && Py_IS_FINITE(z.imag));
1136 }
1137 
1138 /*[clinic input]
1139 cmath.isnan = cmath.polar
1140 
1141 Checks if the real or imaginary part of z not a number (NaN).
1142 [clinic start generated code]*/
1143 
1144 static PyObject *
cmath_isnan_impl(PyObject * module,Py_complex z)1145 cmath_isnan_impl(PyObject *module, Py_complex z)
1146 /*[clinic end generated code: output=e7abf6e0b28beab7 input=71799f5d284c9baf]*/
1147 {
1148     return PyBool_FromLong(Py_IS_NAN(z.real) || Py_IS_NAN(z.imag));
1149 }
1150 
1151 /*[clinic input]
1152 cmath.isinf = cmath.polar
1153 
1154 Checks if the real or imaginary part of z is infinite.
1155 [clinic start generated code]*/
1156 
1157 static PyObject *
cmath_isinf_impl(PyObject * module,Py_complex z)1158 cmath_isinf_impl(PyObject *module, Py_complex z)
1159 /*[clinic end generated code: output=502a75a79c773469 input=363df155c7181329]*/
1160 {
1161     return PyBool_FromLong(Py_IS_INFINITY(z.real) ||
1162                            Py_IS_INFINITY(z.imag));
1163 }
1164 
1165 /*[clinic input]
1166 cmath.isclose -> bool
1167 
1168     a: Py_complex
1169     b: Py_complex
1170     *
1171     rel_tol: double = 1e-09
1172         maximum difference for being considered "close", relative to the
1173         magnitude of the input values
1174     abs_tol: double = 0.0
1175         maximum difference for being considered "close", regardless of the
1176         magnitude of the input values
1177 
1178 Determine whether two complex numbers are close in value.
1179 
1180 Return True if a is close in value to b, and False otherwise.
1181 
1182 For the values to be considered close, the difference between them must be
1183 smaller than at least one of the tolerances.
1184 
1185 -inf, inf and NaN behave similarly to the IEEE 754 Standard. That is, NaN is
1186 not close to anything, even itself. inf and -inf are only close to themselves.
1187 [clinic start generated code]*/
1188 
1189 static int
cmath_isclose_impl(PyObject * module,Py_complex a,Py_complex b,double rel_tol,double abs_tol)1190 cmath_isclose_impl(PyObject *module, Py_complex a, Py_complex b,
1191                    double rel_tol, double abs_tol)
1192 /*[clinic end generated code: output=8a2486cc6e0014d1 input=df9636d7de1d4ac3]*/
1193 {
1194     double diff;
1195 
1196     /* sanity check on the inputs */
1197     if (rel_tol < 0.0 || abs_tol < 0.0 ) {
1198         PyErr_SetString(PyExc_ValueError,
1199                         "tolerances must be non-negative");
1200         return -1;
1201     }
1202 
1203     if ( (a.real == b.real) && (a.imag == b.imag) ) {
1204         /* short circuit exact equality -- needed to catch two infinities of
1205            the same sign. And perhaps speeds things up a bit sometimes.
1206         */
1207         return 1;
1208     }
1209 
1210     /* This catches the case of two infinities of opposite sign, or
1211        one infinity and one finite number. Two infinities of opposite
1212        sign would otherwise have an infinite relative tolerance.
1213        Two infinities of the same sign are caught by the equality check
1214        above.
1215     */
1216 
1217     if (Py_IS_INFINITY(a.real) || Py_IS_INFINITY(a.imag) ||
1218         Py_IS_INFINITY(b.real) || Py_IS_INFINITY(b.imag)) {
1219         return 0;
1220     }
1221 
1222     /* now do the regular computation
1223        this is essentially the "weak" test from the Boost library
1224     */
1225 
1226     diff = _Py_c_abs(_Py_c_diff(a, b));
1227 
1228     return (((diff <= rel_tol * _Py_c_abs(b)) ||
1229              (diff <= rel_tol * _Py_c_abs(a))) ||
1230             (diff <= abs_tol));
1231 }
1232 
1233 PyDoc_STRVAR(module_doc,
1234 "This module provides access to mathematical functions for complex\n"
1235 "numbers.");
1236 
1237 static PyMethodDef cmath_methods[] = {
1238     CMATH_ACOS_METHODDEF
1239     CMATH_ACOSH_METHODDEF
1240     CMATH_ASIN_METHODDEF
1241     CMATH_ASINH_METHODDEF
1242     CMATH_ATAN_METHODDEF
1243     CMATH_ATANH_METHODDEF
1244     CMATH_COS_METHODDEF
1245     CMATH_COSH_METHODDEF
1246     CMATH_EXP_METHODDEF
1247     CMATH_ISCLOSE_METHODDEF
1248     CMATH_ISFINITE_METHODDEF
1249     CMATH_ISINF_METHODDEF
1250     CMATH_ISNAN_METHODDEF
1251     CMATH_LOG_METHODDEF
1252     CMATH_LOG10_METHODDEF
1253     CMATH_PHASE_METHODDEF
1254     CMATH_POLAR_METHODDEF
1255     CMATH_RECT_METHODDEF
1256     CMATH_SIN_METHODDEF
1257     CMATH_SINH_METHODDEF
1258     CMATH_SQRT_METHODDEF
1259     CMATH_TAN_METHODDEF
1260     CMATH_TANH_METHODDEF
1261     {NULL, NULL}  /* sentinel */
1262 };
1263 
1264 static int
cmath_exec(PyObject * mod)1265 cmath_exec(PyObject *mod)
1266 {
1267     if (PyModule_AddObject(mod, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
1268         return -1;
1269     }
1270     if (PyModule_AddObject(mod, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
1271         return -1;
1272     }
1273     // 2pi
1274     if (PyModule_AddObject(mod, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
1275         return -1;
1276     }
1277     if (PyModule_AddObject(mod, "inf", PyFloat_FromDouble(m_inf())) < 0) {
1278         return -1;
1279     }
1280 
1281     if (PyModule_AddObject(mod, "infj",
1282                            PyComplex_FromCComplex(c_infj())) < 0) {
1283         return -1;
1284     }
1285 #if _PY_SHORT_FLOAT_REPR == 1
1286     if (PyModule_AddObject(mod, "nan", PyFloat_FromDouble(m_nan())) < 0) {
1287         return -1;
1288     }
1289     if (PyModule_AddObject(mod, "nanj",
1290                            PyComplex_FromCComplex(c_nanj())) < 0) {
1291         return -1;
1292     }
1293 #endif
1294 
1295     /* initialize special value tables */
1296 
1297 #define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY }
1298 #define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p;
1299 
1300     INIT_SPECIAL_VALUES(acos_special_values, {
1301       C(P34,INF) C(P,INF)  C(P,INF)  C(P,-INF)  C(P,-INF)  C(P34,-INF) C(N,INF)
1302       C(P12,INF) C(U,U)    C(U,U)    C(U,U)     C(U,U)     C(P12,-INF) C(N,N)
1303       C(P12,INF) C(U,U)    C(P12,0.) C(P12,-0.) C(U,U)     C(P12,-INF) C(P12,N)
1304       C(P12,INF) C(U,U)    C(P12,0.) C(P12,-0.) C(U,U)     C(P12,-INF) C(P12,N)
1305       C(P12,INF) C(U,U)    C(U,U)    C(U,U)     C(U,U)     C(P12,-INF) C(N,N)
1306       C(P14,INF) C(0.,INF) C(0.,INF) C(0.,-INF) C(0.,-INF) C(P14,-INF) C(N,INF)
1307       C(N,INF)   C(N,N)    C(N,N)    C(N,N)     C(N,N)     C(N,-INF)   C(N,N)
1308     })
1309 
1310     INIT_SPECIAL_VALUES(acosh_special_values, {
1311       C(INF,-P34) C(INF,-P)  C(INF,-P)  C(INF,P)  C(INF,P)  C(INF,P34) C(INF,N)
1312       C(INF,-P12) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,P12) C(N,N)
1313       C(INF,-P12) C(U,U)     C(0.,-P12) C(0.,P12) C(U,U)    C(INF,P12) C(N,N)
1314       C(INF,-P12) C(U,U)     C(0.,-P12) C(0.,P12) C(U,U)    C(INF,P12) C(N,N)
1315       C(INF,-P12) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,P12) C(N,N)
1316       C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N)
1317       C(INF,N)    C(N,N)     C(N,N)     C(N,N)    C(N,N)    C(INF,N)   C(N,N)
1318     })
1319 
1320     INIT_SPECIAL_VALUES(asinh_special_values, {
1321       C(-INF,-P14) C(-INF,-0.) C(-INF,-0.) C(-INF,0.) C(-INF,0.) C(-INF,P14) C(-INF,N)
1322       C(-INF,-P12) C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(-INF,P12) C(N,N)
1323       C(-INF,-P12) C(U,U)      C(-0.,-0.)  C(-0.,0.)  C(U,U)     C(-INF,P12) C(N,N)
1324       C(INF,-P12)  C(U,U)      C(0.,-0.)   C(0.,0.)   C(U,U)     C(INF,P12)  C(N,N)
1325       C(INF,-P12)  C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(INF,P12)  C(N,N)
1326       C(INF,-P14)  C(INF,-0.)  C(INF,-0.)  C(INF,0.)  C(INF,0.)  C(INF,P14)  C(INF,N)
1327       C(INF,N)     C(N,N)      C(N,-0.)    C(N,0.)    C(N,N)     C(INF,N)    C(N,N)
1328     })
1329 
1330     INIT_SPECIAL_VALUES(atanh_special_values, {
1331       C(-0.,-P12) C(-0.,-P12) C(-0.,-P12) C(-0.,P12) C(-0.,P12) C(-0.,P12) C(-0.,N)
1332       C(-0.,-P12) C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(-0.,P12) C(N,N)
1333       C(-0.,-P12) C(U,U)      C(-0.,-0.)  C(-0.,0.)  C(U,U)     C(-0.,P12) C(-0.,N)
1334       C(0.,-P12)  C(U,U)      C(0.,-0.)   C(0.,0.)   C(U,U)     C(0.,P12)  C(0.,N)
1335       C(0.,-P12)  C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(0.,P12)  C(N,N)
1336       C(0.,-P12)  C(0.,-P12)  C(0.,-P12)  C(0.,P12)  C(0.,P12)  C(0.,P12)  C(0.,N)
1337       C(0.,-P12)  C(N,N)      C(N,N)      C(N,N)     C(N,N)     C(0.,P12)  C(N,N)
1338     })
1339 
1340     INIT_SPECIAL_VALUES(cosh_special_values, {
1341       C(INF,N) C(U,U) C(INF,0.)  C(INF,-0.) C(U,U) C(INF,N) C(INF,N)
1342       C(N,N)   C(U,U) C(U,U)     C(U,U)     C(U,U) C(N,N)   C(N,N)
1343       C(N,0.)  C(U,U) C(1.,0.)   C(1.,-0.)  C(U,U) C(N,0.)  C(N,0.)
1344       C(N,0.)  C(U,U) C(1.,-0.)  C(1.,0.)   C(U,U) C(N,0.)  C(N,0.)
1345       C(N,N)   C(U,U) C(U,U)     C(U,U)     C(U,U) C(N,N)   C(N,N)
1346       C(INF,N) C(U,U) C(INF,-0.) C(INF,0.)  C(U,U) C(INF,N) C(INF,N)
1347       C(N,N)   C(N,N) C(N,0.)    C(N,0.)    C(N,N) C(N,N)   C(N,N)
1348     })
1349 
1350     INIT_SPECIAL_VALUES(exp_special_values, {
1351       C(0.,0.) C(U,U) C(0.,-0.)  C(0.,0.)  C(U,U) C(0.,0.) C(0.,0.)
1352       C(N,N)   C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)   C(N,N)
1353       C(N,N)   C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(N,N)   C(N,N)
1354       C(N,N)   C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(N,N)   C(N,N)
1355       C(N,N)   C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)   C(N,N)
1356       C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N)
1357       C(N,N)   C(N,N) C(N,-0.)   C(N,0.)   C(N,N) C(N,N)   C(N,N)
1358     })
1359 
1360     INIT_SPECIAL_VALUES(log_special_values, {
1361       C(INF,-P34) C(INF,-P)  C(INF,-P)   C(INF,P)   C(INF,P)  C(INF,P34)  C(INF,N)
1362       C(INF,-P12) C(U,U)     C(U,U)      C(U,U)     C(U,U)    C(INF,P12)  C(N,N)
1363       C(INF,-P12) C(U,U)     C(-INF,-P)  C(-INF,P)  C(U,U)    C(INF,P12)  C(N,N)
1364       C(INF,-P12) C(U,U)     C(-INF,-0.) C(-INF,0.) C(U,U)    C(INF,P12)  C(N,N)
1365       C(INF,-P12) C(U,U)     C(U,U)      C(U,U)     C(U,U)    C(INF,P12)  C(N,N)
1366       C(INF,-P14) C(INF,-0.) C(INF,-0.)  C(INF,0.)  C(INF,0.) C(INF,P14)  C(INF,N)
1367       C(INF,N)    C(N,N)     C(N,N)      C(N,N)     C(N,N)    C(INF,N)    C(N,N)
1368     })
1369 
1370     INIT_SPECIAL_VALUES(sinh_special_values, {
1371       C(INF,N) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,N) C(INF,N)
1372       C(N,N)   C(U,U) C(U,U)      C(U,U)     C(U,U) C(N,N)   C(N,N)
1373       C(0.,N)  C(U,U) C(-0.,-0.)  C(-0.,0.)  C(U,U) C(0.,N)  C(0.,N)
1374       C(0.,N)  C(U,U) C(0.,-0.)   C(0.,0.)   C(U,U) C(0.,N)  C(0.,N)
1375       C(N,N)   C(U,U) C(U,U)      C(U,U)     C(U,U) C(N,N)   C(N,N)
1376       C(INF,N) C(U,U) C(INF,-0.)  C(INF,0.)  C(U,U) C(INF,N) C(INF,N)
1377       C(N,N)   C(N,N) C(N,-0.)    C(N,0.)    C(N,N) C(N,N)   C(N,N)
1378     })
1379 
1380     INIT_SPECIAL_VALUES(sqrt_special_values, {
1381       C(INF,-INF) C(0.,-INF) C(0.,-INF) C(0.,INF) C(0.,INF) C(INF,INF) C(N,INF)
1382       C(INF,-INF) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,INF) C(N,N)
1383       C(INF,-INF) C(U,U)     C(0.,-0.)  C(0.,0.)  C(U,U)    C(INF,INF) C(N,N)
1384       C(INF,-INF) C(U,U)     C(0.,-0.)  C(0.,0.)  C(U,U)    C(INF,INF) C(N,N)
1385       C(INF,-INF) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,INF) C(N,N)
1386       C(INF,-INF) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,INF) C(INF,N)
1387       C(INF,-INF) C(N,N)     C(N,N)     C(N,N)    C(N,N)    C(INF,INF) C(N,N)
1388     })
1389 
1390     INIT_SPECIAL_VALUES(tanh_special_values, {
1391       C(-1.,0.) C(U,U) C(-1.,-0.) C(-1.,0.) C(U,U) C(-1.,0.) C(-1.,0.)
1392       C(N,N)    C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)    C(N,N)
1393       C(N,N)    C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(N,N)    C(N,N)
1394       C(N,N)    C(U,U) C(0.,-0.)  C(0.,0.)  C(U,U) C(N,N)    C(N,N)
1395       C(N,N)    C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)    C(N,N)
1396       C(1.,0.)  C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(1.,0.)  C(1.,0.)
1397       C(N,N)    C(N,N) C(N,-0.)   C(N,0.)   C(N,N) C(N,N)    C(N,N)
1398     })
1399 
1400     INIT_SPECIAL_VALUES(rect_special_values, {
1401       C(INF,N) C(U,U) C(-INF,0.) C(-INF,-0.) C(U,U) C(INF,N) C(INF,N)
1402       C(N,N)   C(U,U) C(U,U)     C(U,U)      C(U,U) C(N,N)   C(N,N)
1403       C(0.,0.) C(U,U) C(-0.,0.)  C(-0.,-0.)  C(U,U) C(0.,0.) C(0.,0.)
1404       C(0.,0.) C(U,U) C(0.,-0.)  C(0.,0.)    C(U,U) C(0.,0.) C(0.,0.)
1405       C(N,N)   C(U,U) C(U,U)     C(U,U)      C(U,U) C(N,N)   C(N,N)
1406       C(INF,N) C(U,U) C(INF,-0.) C(INF,0.)   C(U,U) C(INF,N) C(INF,N)
1407       C(N,N)   C(N,N) C(N,0.)    C(N,0.)     C(N,N) C(N,N)   C(N,N)
1408     })
1409     return 0;
1410 }
1411 
1412 static PyModuleDef_Slot cmath_slots[] = {
1413     {Py_mod_exec, cmath_exec},
1414     {0, NULL}
1415 };
1416 
1417 static struct PyModuleDef cmathmodule = {
1418     PyModuleDef_HEAD_INIT,
1419     .m_name = "cmath",
1420     .m_doc = module_doc,
1421     .m_size = 0,
1422     .m_methods = cmath_methods,
1423     .m_slots = cmath_slots
1424 };
1425 
1426 PyMODINIT_FUNC
PyInit_cmath(void)1427 PyInit_cmath(void)
1428 {
1429     return PyModuleDef_Init(&cmathmodule);
1430 }
1431