annotate Modules/cmathmodule.c @ 57303:4aa4c19dfaed legacy-trunk

#1757126: fix typo with the cyrillic_asian alias
author Philip Jenvey <pjenvey@underboss.org>
date Tue, 17 Nov 2009 02:42:26 +0000
parents 34277da38e38
children e38335d4df91 7f5cbc28f433
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* Complex math module */
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 /* much code borrowed from mathmodule.c */
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
4639
97ec9dfbb2b6 Renamed Grandly
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
5 #include "Python.h"
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
6 /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
7 float.h. We assume that FLT_RADIX is either 2 or 16. */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
8 #include <float.h>
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
10 #if (FLT_RADIX != 2 && FLT_RADIX != 16)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
11 #error "Modules/cmathmodule.c expects FLT_RADIX to be 2 or 16"
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
12 #endif
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
13
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
14 #ifndef M_LN2
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
15 #define M_LN2 (0.6931471805599453094) /* natural log of 2 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
16 #endif
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
17
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
18 #ifndef M_LN10
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
19 #define M_LN10 (2.302585092994045684) /* natural log of 10 */
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 #endif
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
22 /*
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
23 CM_LARGE_DOUBLE is used to avoid spurious overflow in the sqrt, log,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
24 inverse trig and inverse hyperbolic trig functions. Its log is used in the
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
25 evaluation of exp, cos, cosh, sin, sinh, tan, and tanh to avoid unecessary
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
26 overflow.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
27 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
28
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
29 #define CM_LARGE_DOUBLE (DBL_MAX/4.)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
30 #define CM_SQRT_LARGE_DOUBLE (sqrt(CM_LARGE_DOUBLE))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
31 #define CM_LOG_LARGE_DOUBLE (log(CM_LARGE_DOUBLE))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
32 #define CM_SQRT_DBL_MIN (sqrt(DBL_MIN))
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
33
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
34 /*
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
35 CM_SCALE_UP is an odd integer chosen such that multiplication by
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
36 2**CM_SCALE_UP is sufficient to turn a subnormal into a normal.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
37 CM_SCALE_DOWN is (-(CM_SCALE_UP+1)/2). These scalings are used to compute
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
38 square roots accurately when the real and imaginary parts of the argument
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
39 are subnormal.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
40 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
41
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
42 #if FLT_RADIX==2
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
43 #define CM_SCALE_UP (2*(DBL_MANT_DIG/2) + 1)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
44 #elif FLT_RADIX==16
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
45 #define CM_SCALE_UP (4*DBL_MANT_DIG+1)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
46 #endif
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
47 #define CM_SCALE_DOWN (-(CM_SCALE_UP+1)/2)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
48
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 /* forward declarations */
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
50 static Py_complex c_asinh(Py_complex);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
51 static Py_complex c_atanh(Py_complex);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
52 static Py_complex c_cosh(Py_complex);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
53 static Py_complex c_sinh(Py_complex);
24280
1598a1e473e2 staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 23832
diff changeset
54 static Py_complex c_sqrt(Py_complex);
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
55 static Py_complex c_tanh(Py_complex);
32350
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
56 static PyObject * math_error(void);
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
58 /* Code to deal with special values (infinities, NaNs, etc.). */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
59
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
60 /* special_type takes a double and returns an integer code indicating
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
61 the type of the double as follows:
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
62 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
63
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
64 enum special_types {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
65 ST_NINF, /* 0, negative infinity */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
66 ST_NEG, /* 1, negative finite number (nonzero) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
67 ST_NZERO, /* 2, -0. */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
68 ST_PZERO, /* 3, +0. */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
69 ST_POS, /* 4, positive finite number (nonzero) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
70 ST_PINF, /* 5, positive infinity */
55539
34277da38e38 Merged revisions 74303 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 51919
diff changeset
71 ST_NAN /* 6, Not a Number */
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
72 };
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
73
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
74 static enum special_types
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
75 special_type(double d)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
76 {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
77 if (Py_IS_FINITE(d)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
78 if (d != 0) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
79 if (copysign(1., d) == 1.)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
80 return ST_POS;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
81 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
82 return ST_NEG;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
83 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
84 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
85 if (copysign(1., d) == 1.)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
86 return ST_PZERO;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
87 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
88 return ST_NZERO;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
89 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
90 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
91 if (Py_IS_NAN(d))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
92 return ST_NAN;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
93 if (copysign(1., d) == 1.)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
94 return ST_PINF;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
95 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
96 return ST_NINF;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
97 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
98
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
99 #define SPECIAL_VALUE(z, table) \
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
100 if (!Py_IS_FINITE((z).real) || !Py_IS_FINITE((z).imag)) { \
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
101 errno = 0; \
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
102 return table[special_type((z).real)] \
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
103 [special_type((z).imag)]; \
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
104 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
105
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
106 #define P Py_MATH_PI
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
107 #define P14 0.25*Py_MATH_PI
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
108 #define P12 0.5*Py_MATH_PI
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
109 #define P34 0.75*Py_MATH_PI
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
110 #define INF Py_HUGE_VAL
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
111 #define N Py_NAN
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
112 #define U -9.5426319407711027e33 /* unlikely value, used as placeholder */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
113
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
114 /* First, the C functions that do the real work. Each of the c_*
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
115 functions computes and returns the C99 Annex G recommended result
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
116 and also sets errno as follows: errno = 0 if no floating-point
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
117 exception is associated with the result; errno = EDOM if C99 Annex
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
118 G recommends raising divide-by-zero or invalid for this result; and
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
119 errno = ERANGE where the overflow floating-point signal should be
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
120 raised.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
121 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
122
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
123 static Py_complex acos_special_values[7][7];
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
125 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
126 c_acos(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
128 Py_complex s1, s2, r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
129
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
130 SPECIAL_VALUE(z, acos_special_values);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
131
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
132 if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
133 /* avoid unnecessary overflow for large arguments */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
134 r.real = atan2(fabs(z.imag), z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
135 /* split into cases to make sure that the branch cut has the
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
136 correct continuity on systems with unsigned zeros */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
137 if (z.real < 0.) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
138 r.imag = -copysign(log(hypot(z.real/2., z.imag/2.)) +
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
139 M_LN2*2., z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
140 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
141 r.imag = copysign(log(hypot(z.real/2., z.imag/2.)) +
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
142 M_LN2*2., -z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
143 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
144 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
145 s1.real = 1.-z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
146 s1.imag = -z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
147 s1 = c_sqrt(s1);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
148 s2.real = 1.+z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
149 s2.imag = z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
150 s2 = c_sqrt(s2);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
151 r.real = 2.*atan2(s1.real, s2.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
152 r.imag = asinh(s2.real*s1.imag - s2.imag*s1.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
153 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
154 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
155 return r;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
157
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
158 PyDoc_STRVAR(c_acos_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
159 "acos(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
160 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
161 "Return the arc cosine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
162
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
163
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
164 static Py_complex acosh_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
165
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
166 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
167 c_acosh(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
169 Py_complex s1, s2, r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
170
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
171 SPECIAL_VALUE(z, acosh_special_values);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
172
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
173 if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
174 /* avoid unnecessary overflow for large arguments */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
175 r.real = log(hypot(z.real/2., z.imag/2.)) + M_LN2*2.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
176 r.imag = atan2(z.imag, z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
177 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
178 s1.real = z.real - 1.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
179 s1.imag = z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
180 s1 = c_sqrt(s1);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
181 s2.real = z.real + 1.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
182 s2.imag = z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
183 s2 = c_sqrt(s2);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
184 r.real = asinh(s1.real*s2.real + s1.imag*s2.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
185 r.imag = 2.*atan2(s1.imag, s2.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
186 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
187 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
188 return r;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
190
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
191 PyDoc_STRVAR(c_acosh_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
192 "acosh(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
193 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
194 "Return the hyperbolic arccosine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
195
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
196
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
197 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
198 c_asin(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
200 /* asin(z) = -i asinh(iz) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
201 Py_complex s, r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
202 s.real = -z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
203 s.imag = z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
204 s = c_asinh(s);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
205 r.real = s.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
206 r.imag = -s.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
207 return r;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
209
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
210 PyDoc_STRVAR(c_asin_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
211 "asin(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
212 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
213 "Return the arc sine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
214
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
215
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
216 static Py_complex asinh_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
217
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
218 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
219 c_asinh(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
221 Py_complex s1, s2, r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
222
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
223 SPECIAL_VALUE(z, asinh_special_values);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
224
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
225 if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
226 if (z.imag >= 0.) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
227 r.real = copysign(log(hypot(z.real/2., z.imag/2.)) +
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
228 M_LN2*2., z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
229 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
230 r.real = -copysign(log(hypot(z.real/2., z.imag/2.)) +
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
231 M_LN2*2., -z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
232 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
233 r.imag = atan2(z.imag, fabs(z.real));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
234 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
235 s1.real = 1.+z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
236 s1.imag = -z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
237 s1 = c_sqrt(s1);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
238 s2.real = 1.-z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
239 s2.imag = z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
240 s2 = c_sqrt(s2);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
241 r.real = asinh(s1.real*s2.imag-s2.real*s1.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
242 r.imag = atan2(z.imag, s1.real*s2.real-s1.imag*s2.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
243 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
244 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
245 return r;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
247
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
248 PyDoc_STRVAR(c_asinh_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
249 "asinh(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
250 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
251 "Return the hyperbolic arc sine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
252
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
253
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
254 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
255 c_atan(Py_complex z)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
256 {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
257 /* atan(z) = -i atanh(iz) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
258 Py_complex s, r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
259 s.real = -z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
260 s.imag = z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
261 s = c_atanh(s);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
262 r.real = s.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
263 r.imag = -s.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
264 return r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
265 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
266
46516
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
267 /* Windows screws up atan2 for inf and nan, and alpha Tru64 5.1 doesn't follow
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
268 C99 for atan2(0., 0.). */
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
269 static double
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
270 c_atan2(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
272 if (Py_IS_NAN(z.real) || Py_IS_NAN(z.imag))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
273 return Py_NAN;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
274 if (Py_IS_INFINITY(z.imag)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
275 if (Py_IS_INFINITY(z.real)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
276 if (copysign(1., z.real) == 1.)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
277 /* atan2(+-inf, +inf) == +-pi/4 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
278 return copysign(0.25*Py_MATH_PI, z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
279 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
280 /* atan2(+-inf, -inf) == +-pi*3/4 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
281 return copysign(0.75*Py_MATH_PI, z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
282 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
283 /* atan2(+-inf, x) == +-pi/2 for finite x */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
284 return copysign(0.5*Py_MATH_PI, z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
285 }
46516
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
286 if (Py_IS_INFINITY(z.real) || z.imag == 0.) {
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
287 if (copysign(1., z.real) == 1.)
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
288 /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
289 return copysign(0., z.imag);
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
290 else
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
291 /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
292 return copysign(Py_MATH_PI, z.imag);
ec48490b969a Merged revisions 62420-62421,62423-62424 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46505
diff changeset
293 }
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
294 return atan2(z.imag, z.real);
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
296
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
297 PyDoc_STRVAR(c_atan_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
298 "atan(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
299 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
300 "Return the arc tangent of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
301
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
302
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
303 static Py_complex atanh_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
304
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
305 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
306 c_atanh(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
308 Py_complex r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
309 double ay, h;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
310
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
311 SPECIAL_VALUE(z, atanh_special_values);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
312
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
313 /* Reduce to case where z.real >= 0., using atanh(z) = -atanh(-z). */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
314 if (z.real < 0.) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
315 return c_neg(c_atanh(c_neg(z)));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
316 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
317
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
318 ay = fabs(z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
319 if (z.real > CM_SQRT_LARGE_DOUBLE || ay > CM_SQRT_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
320 /*
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
321 if abs(z) is large then we use the approximation
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
322 atanh(z) ~ 1/z +/- i*pi/2 (+/- depending on the sign
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
323 of z.imag)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
324 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
325 h = hypot(z.real/2., z.imag/2.); /* safe from overflow */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
326 r.real = z.real/4./h/h;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
327 /* the two negations in the next line cancel each other out
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
328 except when working with unsigned zeros: they're there to
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
329 ensure that the branch cut has the correct continuity on
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
330 systems that don't support signed zeros */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
331 r.imag = -copysign(Py_MATH_PI/2., -z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
332 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
333 } else if (z.real == 1. && ay < CM_SQRT_DBL_MIN) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
334 /* C99 standard says: atanh(1+/-0.) should be inf +/- 0i */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
335 if (ay == 0.) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
336 r.real = INF;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
337 r.imag = z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
338 errno = EDOM;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
339 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
340 r.real = -log(sqrt(ay)/sqrt(hypot(ay, 2.)));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
341 r.imag = copysign(atan2(2., -ay)/2, z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
342 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
343 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
344 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
345 r.real = log1p(4.*z.real/((1-z.real)*(1-z.real) + ay*ay))/4.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
346 r.imag = -atan2(-2.*z.imag, (1-z.real)*(1+z.real) - ay*ay)/2.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
347 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
348 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
349 return r;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
351
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
352 PyDoc_STRVAR(c_atanh_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
353 "atanh(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
354 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
355 "Return the hyperbolic arc tangent of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
356
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
357
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
358 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
359 c_cos(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
361 /* cos(z) = cosh(iz) */
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
362 Py_complex r;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
363 r.real = -z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
364 r.imag = z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
365 r = c_cosh(r);
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
368
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
369 PyDoc_STRVAR(c_cos_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
370 "cos(x)\n"
51919
676567e2a711 Merged revisions 70062 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47890
diff changeset
371 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
372 "Return the cosine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
373
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
374
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
375 /* cosh(infinity + i*y) needs to be dealt with specially */
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
376 static Py_complex cosh_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
377
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
378 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
379 c_cosh(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 {
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
381 Py_complex r;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
382 double x_minus_one;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
383
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
384 /* special treatment for cosh(+/-inf + iy) if y is not a NaN */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
385 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
386 if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag) &&
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
387 (z.imag != 0.)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
388 if (z.real > 0) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
389 r.real = copysign(INF, cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
390 r.imag = copysign(INF, sin(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
391 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
392 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
393 r.real = copysign(INF, cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
394 r.imag = -copysign(INF, sin(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
395 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
396 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
397 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
398 r = cosh_special_values[special_type(z.real)]
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
399 [special_type(z.imag)];
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
400 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
401 /* need to set errno = EDOM if y is +/- infinity and x is not
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
402 a NaN */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
403 if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
404 errno = EDOM;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
405 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
406 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
407 return r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
408 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
409
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
410 if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
411 /* deal correctly with cases where cosh(z.real) overflows but
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
412 cosh(z) does not. */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
413 x_minus_one = z.real - copysign(1., z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
414 r.real = cos(z.imag) * cosh(x_minus_one) * Py_MATH_E;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
415 r.imag = sin(z.imag) * sinh(x_minus_one) * Py_MATH_E;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
416 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
417 r.real = cos(z.imag) * cosh(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
418 r.imag = sin(z.imag) * sinh(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
419 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
420 /* detect overflow, and set errno accordingly */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
421 if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
422 errno = ERANGE;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
423 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
424 errno = 0;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
427
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
428 PyDoc_STRVAR(c_cosh_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
429 "cosh(x)\n"
51919
676567e2a711 Merged revisions 70062 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 47890
diff changeset
430 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
431 "Return the hyperbolic cosine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
432
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
433
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
434 /* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
435 finite y */
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
436 static Py_complex exp_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
437
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
438 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
439 c_exp(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 {
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
441 Py_complex r;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
442 double l;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
443
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
444 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
445 if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
446 && (z.imag != 0.)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
447 if (z.real > 0) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
448 r.real = copysign(INF, cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
449 r.imag = copysign(INF, sin(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
450 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
451 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
452 r.real = copysign(0., cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
453 r.imag = copysign(0., sin(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
454 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
455 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
456 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
457 r = exp_special_values[special_type(z.real)]
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
458 [special_type(z.imag)];
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
459 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
460 /* need to set errno = EDOM if y is +/- infinity and x is not
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
461 a NaN and not -infinity */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
462 if (Py_IS_INFINITY(z.imag) &&
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
463 (Py_IS_FINITE(z.real) ||
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
464 (Py_IS_INFINITY(z.real) && z.real > 0)))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
465 errno = EDOM;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
466 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
467 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
468 return r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
469 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
470
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
471 if (z.real > CM_LOG_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
472 l = exp(z.real-1.);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
473 r.real = l*cos(z.imag)*Py_MATH_E;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
474 r.imag = l*sin(z.imag)*Py_MATH_E;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
475 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
476 l = exp(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
477 r.real = l*cos(z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
478 r.imag = l*sin(z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
479 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
480 /* detect overflow, and set errno accordingly */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
481 if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
482 errno = ERANGE;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
483 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
484 errno = 0;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
485 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
487
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
488 PyDoc_STRVAR(c_exp_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
489 "exp(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
490 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
491 "Return the exponential value e**x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
492
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
493
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
494 static Py_complex log_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
495
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
496 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
497 c_log(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
498 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
499 /*
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
500 The usual formula for the real part is log(hypot(z.real, z.imag)).
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
501 There are four situations where this formula is potentially
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
502 problematic:
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
503
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
504 (1) the absolute value of z is subnormal. Then hypot is subnormal,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
505 so has fewer than the usual number of bits of accuracy, hence may
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
506 have large relative error. This then gives a large absolute error
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
507 in the log. This can be solved by rescaling z by a suitable power
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
508 of 2.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
509
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
510 (2) the absolute value of z is greater than DBL_MAX (e.g. when both
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
511 z.real and z.imag are within a factor of 1/sqrt(2) of DBL_MAX)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
512 Again, rescaling solves this.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
513
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
514 (3) the absolute value of z is close to 1. In this case it's
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
515 difficult to achieve good accuracy, at least in part because a
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
516 change of 1ulp in the real or imaginary part of z can result in a
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
517 change of billions of ulps in the correctly rounded answer.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
518
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
519 (4) z = 0. The simplest thing to do here is to call the
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
520 floating-point log with an argument of 0, and let its behaviour
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
521 (returning -infinity, signaling a floating-point exception, setting
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
522 errno, or whatever) determine that of c_log. So the usual formula
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
523 is fine here.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
524
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
525 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
526
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
527 Py_complex r;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
528 double ax, ay, am, an, h;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
529
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
530 SPECIAL_VALUE(z, log_special_values);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
531
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
532 ax = fabs(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
533 ay = fabs(z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
534
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
535 if (ax > CM_LARGE_DOUBLE || ay > CM_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
536 r.real = log(hypot(ax/2., ay/2.)) + M_LN2;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
537 } else if (ax < DBL_MIN && ay < DBL_MIN) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
538 if (ax > 0. || ay > 0.) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
539 /* catch cases where hypot(ax, ay) is subnormal */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
540 r.real = log(hypot(ldexp(ax, DBL_MANT_DIG),
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
541 ldexp(ay, DBL_MANT_DIG))) - DBL_MANT_DIG*M_LN2;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
542 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
543 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
544 /* log(+/-0. +/- 0i) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
545 r.real = -INF;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
546 r.imag = atan2(z.imag, z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
547 errno = EDOM;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
548 return r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
549 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
550 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
551 h = hypot(ax, ay);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
552 if (0.71 <= h && h <= 1.73) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
553 am = ax > ay ? ax : ay; /* max(ax, ay) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
554 an = ax > ay ? ay : ax; /* min(ax, ay) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
555 r.real = log1p((am-1)*(am+1)+an*an)/2.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
556 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
557 r.real = log(h);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
558 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
559 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
560 r.imag = atan2(z.imag, z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
561 errno = 0;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
564
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
565
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
566 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
567 c_log10(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
568 {
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
569 Py_complex r;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
570 int errno_save;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
571
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
572 r = c_log(z);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
573 errno_save = errno; /* just in case the divisions affect errno */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
574 r.real = r.real / M_LN10;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
575 r.imag = r.imag / M_LN10;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
576 errno = errno_save;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
577 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
578 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
579
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
580 PyDoc_STRVAR(c_log10_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
581 "log10(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
582 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
583 "Return the base-10 logarithm of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
584
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
585
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
586 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
587 c_sin(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
588 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
589 /* sin(z) = -i sin(iz) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
590 Py_complex s, r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
591 s.real = -z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
592 s.imag = z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
593 s = c_sinh(s);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
594 r.real = s.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
595 r.imag = -s.real;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
597 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
598
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
599 PyDoc_STRVAR(c_sin_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
600 "sin(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
601 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
602 "Return the sine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
603
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
604
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
605 /* sinh(infinity + i*y) needs to be dealt with specially */
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
606 static Py_complex sinh_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
607
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
608 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
609 c_sinh(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 {
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
611 Py_complex r;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
612 double x_minus_one;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
613
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
614 /* special treatment for sinh(+/-inf + iy) if y is finite and
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
615 nonzero */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
616 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
617 if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
618 && (z.imag != 0.)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
619 if (z.real > 0) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
620 r.real = copysign(INF, cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
621 r.imag = copysign(INF, sin(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
622 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
623 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
624 r.real = -copysign(INF, cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
625 r.imag = copysign(INF, sin(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
626 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
627 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
628 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
629 r = sinh_special_values[special_type(z.real)]
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
630 [special_type(z.imag)];
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
631 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
632 /* need to set errno = EDOM if y is +/- infinity and x is not
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
633 a NaN */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
634 if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
635 errno = EDOM;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
636 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
637 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
638 return r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
639 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
640
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
641 if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
642 x_minus_one = z.real - copysign(1., z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
643 r.real = cos(z.imag) * sinh(x_minus_one) * Py_MATH_E;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
644 r.imag = sin(z.imag) * cosh(x_minus_one) * Py_MATH_E;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
645 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
646 r.real = cos(z.imag) * sinh(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
647 r.imag = sin(z.imag) * cosh(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
648 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
649 /* detect overflow, and set errno accordingly */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
650 if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
651 errno = ERANGE;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
652 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
653 errno = 0;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
654 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
655 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
656
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
657 PyDoc_STRVAR(c_sinh_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
658 "sinh(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
659 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
660 "Return the hyperbolic sine of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
661
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
662
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
663 static Py_complex sqrt_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
664
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
665 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
666 c_sqrt(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
667 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
668 /*
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
669 Method: use symmetries to reduce to the case when x = z.real and y
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
670 = z.imag are nonnegative. Then the real part of the result is
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
671 given by
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
672
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
673 s = sqrt((x + hypot(x, y))/2)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
674
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
675 and the imaginary part is
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
676
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
677 d = (y/2)/s
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
678
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
679 If either x or y is very large then there's a risk of overflow in
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
680 computation of the expression x + hypot(x, y). We can avoid this
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
681 by rewriting the formula for s as:
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
682
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
683 s = 2*sqrt(x/8 + hypot(x/8, y/8))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
684
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
685 This costs us two extra multiplications/divisions, but avoids the
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
686 overhead of checking for x and y large.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
687
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
688 If both x and y are subnormal then hypot(x, y) may also be
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
689 subnormal, so will lack full precision. We solve this by rescaling
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
690 x and y by a sufficiently large power of 2 to ensure that x and y
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
691 are normal.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
692 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
693
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
694
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
695 Py_complex r;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
696 double s,d;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
697 double ax, ay;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
698
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
699 SPECIAL_VALUE(z, sqrt_special_values);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
700
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
701 if (z.real == 0. && z.imag == 0.) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
702 r.real = 0.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
703 r.imag = z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
704 return r;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
705 }
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
706
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
707 ax = fabs(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
708 ay = fabs(z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
709
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
710 if (ax < DBL_MIN && ay < DBL_MIN && (ax > 0. || ay > 0.)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
711 /* here we catch cases where hypot(ax, ay) is subnormal */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
712 ax = ldexp(ax, CM_SCALE_UP);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
713 s = ldexp(sqrt(ax + hypot(ax, ldexp(ay, CM_SCALE_UP))),
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
714 CM_SCALE_DOWN);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
715 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
716 ax /= 8.;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
717 s = 2.*sqrt(ax + hypot(ax, ay/8.));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
718 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
719 d = ay/(2.*s);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
720
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
721 if (z.real >= 0.) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
722 r.real = s;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
723 r.imag = copysign(d, z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
724 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
725 r.real = d;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
726 r.imag = copysign(s, z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
727 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
728 errno = 0;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
729 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
730 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
731
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
732 PyDoc_STRVAR(c_sqrt_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
733 "sqrt(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
734 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
735 "Return the square root of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
736
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
737
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
738 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
739 c_tan(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
740 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
741 /* tan(z) = -i tanh(iz) */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
742 Py_complex s, r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
743 s.real = -z.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
744 s.imag = z.real;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
745 s = c_tanh(s);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
746 r.real = s.imag;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
747 r.imag = -s.real;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
748 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
749 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
750
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
751 PyDoc_STRVAR(c_tan_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
752 "tan(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
753 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
754 "Return the tangent of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
755
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
756
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
757 /* tanh(infinity + i*y) needs to be dealt with specially */
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
758 static Py_complex tanh_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
759
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
760 static Py_complex
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
761 c_tanh(Py_complex z)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
762 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
763 /* Formula:
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
764
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
765 tanh(x+iy) = (tanh(x)(1+tan(y)^2) + i tan(y)(1-tanh(x))^2) /
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
766 (1+tan(y)^2 tanh(x)^2)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
767
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
768 To avoid excessive roundoff error, 1-tanh(x)^2 is better computed
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
769 as 1/cosh(x)^2. When abs(x) is large, we approximate 1-tanh(x)^2
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
770 by 4 exp(-2*x) instead, to avoid possible overflow in the
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
771 computation of cosh(x).
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
772
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
773 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
774
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3615
diff changeset
775 Py_complex r;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
776 double tx, ty, cx, txty, denom;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
777
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
778 /* special treatment for tanh(+/-inf + iy) if y is finite and
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
779 nonzero */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
780 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
781 if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
782 && (z.imag != 0.)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
783 if (z.real > 0) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
784 r.real = 1.0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
785 r.imag = copysign(0.,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
786 2.*sin(z.imag)*cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
787 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
788 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
789 r.real = -1.0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
790 r.imag = copysign(0.,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
791 2.*sin(z.imag)*cos(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
792 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
793 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
794 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
795 r = tanh_special_values[special_type(z.real)]
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
796 [special_type(z.imag)];
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
797 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
798 /* need to set errno = EDOM if z.imag is +/-infinity and
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
799 z.real is finite */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
800 if (Py_IS_INFINITY(z.imag) && Py_IS_FINITE(z.real))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
801 errno = EDOM;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
802 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
803 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
804 return r;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
805 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
806
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
807 /* danger of overflow in 2.*z.imag !*/
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
808 if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
809 r.real = copysign(1., z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
810 r.imag = 4.*sin(z.imag)*cos(z.imag)*exp(-2.*fabs(z.real));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
811 } else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
812 tx = tanh(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
813 ty = tan(z.imag);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
814 cx = 1./cosh(z.real);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
815 txty = tx*ty;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
816 denom = 1. + txty*txty;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
817 r.real = tx*(1.+ty*ty)/denom;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
818 r.imag = ((ty/denom)*cx)*cx;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
819 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
820 errno = 0;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
821 return r;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
822 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
823
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
824 PyDoc_STRVAR(c_tanh_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
825 "tanh(x)\n"
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
826 "\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
827 "Return the hyperbolic tangent of x.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
828
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
829
32350
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
830 static PyObject *
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
831 cmath_log(PyObject *self, PyObject *args)
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
832 {
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
833 Py_complex x;
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
834 Py_complex y;
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
835
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
836 if (!PyArg_ParseTuple(args, "D|D", &x, &y))
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
837 return NULL;
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
838
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
839 errno = 0;
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
840 PyFPE_START_PROTECT("complex function", return 0)
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
841 x = c_log(x);
47890
f772476ad90d Minor rewrite of cmath_log to work around a Sun compiler bug. See issue
Mark Dickinson <dickinsm@gmail.com>
parents: 47093
diff changeset
842 if (PyTuple_GET_SIZE(args) == 2) {
f772476ad90d Minor rewrite of cmath_log to work around a Sun compiler bug. See issue
Mark Dickinson <dickinsm@gmail.com>
parents: 47093
diff changeset
843 y = c_log(y);
f772476ad90d Minor rewrite of cmath_log to work around a Sun compiler bug. See issue
Mark Dickinson <dickinsm@gmail.com>
parents: 47093
diff changeset
844 x = c_quot(x, y);
f772476ad90d Minor rewrite of cmath_log to work around a Sun compiler bug. See issue
Mark Dickinson <dickinsm@gmail.com>
parents: 47093
diff changeset
845 }
32350
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
846 PyFPE_END_PROTECT(x)
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
847 if (errno != 0)
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
848 return math_error();
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
849 return PyComplex_FromCComplex(x);
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
850 }
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
851
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
852 PyDoc_STRVAR(cmath_log_doc,
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
853 "log(x[, base]) -> the logarithm of x to the given base.\n\
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
854 If the base not specified, returns the natural logarithm (base e) of x.");
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
855
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
856
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
857 /* And now the glue to make them available from Python: */
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
858
4639
97ec9dfbb2b6 Renamed Grandly
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
859 static PyObject *
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13493
diff changeset
860 math_error(void)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
861 {
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
862 if (errno == EDOM)
4639
97ec9dfbb2b6 Renamed Grandly
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
863 PyErr_SetString(PyExc_ValueError, "math domain error");
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
864 else if (errno == ERANGE)
4639
97ec9dfbb2b6 Renamed Grandly
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
865 PyErr_SetString(PyExc_OverflowError, "math range error");
97ec9dfbb2b6 Renamed Grandly
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
866 else /* Unexpected math error */
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
867 PyErr_SetFromErrno(PyExc_ValueError);
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
868 return NULL;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
869 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
870
4639
97ec9dfbb2b6 Renamed Grandly
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
871 static PyObject *
13493
8bacf8631a11 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
872 math_1(PyObject *args, Py_complex (*func)(Py_complex))
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
873 {
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
874 Py_complex x,r ;
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
875 if (!PyArg_ParseTuple(args, "D", &x))
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
876 return NULL;
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
877 errno = 0;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
878 PyFPE_START_PROTECT("complex function", return 0);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
879 r = (*func)(x);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
880 PyFPE_END_PROTECT(r);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
881 if (errno == EDOM) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
882 PyErr_SetString(PyExc_ValueError, "math domain error");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
883 return NULL;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
884 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
885 else if (errno == ERANGE) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
886 PyErr_SetString(PyExc_OverflowError, "math range error");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
887 return NULL;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
888 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
889 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
890 return PyComplex_FromCComplex(r);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
891 }
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
892 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
893
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
894 #define FUNC1(stubname, func) \
13493
8bacf8631a11 ANSI-fication
Peter Schneider-Kamp <nowonder@nowonder.de>
parents: 13447
diff changeset
895 static PyObject * stubname(PyObject *self, PyObject *args) { \
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
896 return math_1(args, func); \
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
897 }
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
898
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
899 FUNC1(cmath_acos, c_acos)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
900 FUNC1(cmath_acosh, c_acosh)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
901 FUNC1(cmath_asin, c_asin)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
902 FUNC1(cmath_asinh, c_asinh)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
903 FUNC1(cmath_atan, c_atan)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
904 FUNC1(cmath_atanh, c_atanh)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
905 FUNC1(cmath_cos, c_cos)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
906 FUNC1(cmath_cosh, c_cosh)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
907 FUNC1(cmath_exp, c_exp)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
908 FUNC1(cmath_log10, c_log10)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
909 FUNC1(cmath_sin, c_sin)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
910 FUNC1(cmath_sinh, c_sinh)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
911 FUNC1(cmath_sqrt, c_sqrt)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
912 FUNC1(cmath_tan, c_tan)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
913 FUNC1(cmath_tanh, c_tanh)
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
914
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
915 static PyObject *
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
916 cmath_phase(PyObject *self, PyObject *args)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
917 {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
918 Py_complex z;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
919 double phi;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
920 if (!PyArg_ParseTuple(args, "D:phase", &z))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
921 return NULL;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
922 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
923 PyFPE_START_PROTECT("arg function", return 0)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
924 phi = c_atan2(z);
47093
54fd0458550c Following Amaury's advice
Christian Heimes <christian@cheimes.de>
parents: 47092
diff changeset
925 PyFPE_END_PROTECT(phi)
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
926 if (errno != 0)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
927 return math_error();
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
928 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
929 return PyFloat_FromDouble(phi);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
930 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
931
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
932 PyDoc_STRVAR(cmath_phase_doc,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
933 "phase(z) -> float\n\n\
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
934 Return argument, also known as the phase angle, of a complex.");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
935
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
936 static PyObject *
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
937 cmath_polar(PyObject *self, PyObject *args)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
938 {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
939 Py_complex z;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
940 double r, phi;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
941 if (!PyArg_ParseTuple(args, "D:polar", &z))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
942 return NULL;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
943 PyFPE_START_PROTECT("polar function", return 0)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
944 phi = c_atan2(z); /* should not cause any exception */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
945 r = c_abs(z); /* sets errno to ERANGE on overflow; otherwise 0 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
946 PyFPE_END_PROTECT(r)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
947 if (errno != 0)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
948 return math_error();
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
949 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
950 return Py_BuildValue("dd", r, phi);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
951 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
952
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
953 PyDoc_STRVAR(cmath_polar_doc,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
954 "polar(z) -> r: float, phi: float\n\n\
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
955 Convert a complex from rectangular coordinates to polar coordinates. r is\n\
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
956 the distance from 0 and phi the phase angle.");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
957
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
958 /*
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
959 rect() isn't covered by the C99 standard, but it's not too hard to
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
960 figure out 'spirit of C99' rules for special value handing:
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
961
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
962 rect(x, t) should behave like exp(log(x) + it) for positive-signed x
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
963 rect(x, t) should behave like -exp(log(-x) + it) for negative-signed x
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
964 rect(nan, t) should behave like exp(nan + it), except that rect(nan, 0)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
965 gives nan +- i0 with the sign of the imaginary part unspecified.
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
966
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
967 */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
968
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
969 static Py_complex rect_special_values[7][7];
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
970
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
971 static PyObject *
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
972 cmath_rect(PyObject *self, PyObject *args)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
973 {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
974 Py_complex z;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
975 double r, phi;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
976 if (!PyArg_ParseTuple(args, "dd:rect", &r, &phi))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
977 return NULL;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
978 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
979 PyFPE_START_PROTECT("rect function", return 0)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
980
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
981 /* deal with special values */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
982 if (!Py_IS_FINITE(r) || !Py_IS_FINITE(phi)) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
983 /* if r is +/-infinity and phi is finite but nonzero then
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
984 result is (+-INF +-INF i), but we need to compute cos(phi)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
985 and sin(phi) to figure out the signs. */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
986 if (Py_IS_INFINITY(r) && (Py_IS_FINITE(phi)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
987 && (phi != 0.))) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
988 if (r > 0) {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
989 z.real = copysign(INF, cos(phi));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
990 z.imag = copysign(INF, sin(phi));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
991 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
992 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
993 z.real = -copysign(INF, cos(phi));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
994 z.imag = -copysign(INF, sin(phi));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
995 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
996 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
997 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
998 z = rect_special_values[special_type(r)]
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
999 [special_type(phi)];
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1000 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1001 /* need to set errno = EDOM if r is a nonzero number and phi
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1002 is infinite */
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1003 if (r != 0. && !Py_IS_NAN(r) && Py_IS_INFINITY(phi))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1004 errno = EDOM;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1005 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1006 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1007 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1008 else {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1009 z.real = r * cos(phi);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1010 z.imag = r * sin(phi);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1011 errno = 0;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1012 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1013
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1014 PyFPE_END_PROTECT(z)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1015 if (errno != 0)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1016 return math_error();
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1017 else
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1018 return PyComplex_FromCComplex(z);
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1019 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1020
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1021 PyDoc_STRVAR(cmath_rect_doc,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1022 "rect(r, phi) -> z: complex\n\n\
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1023 Convert from polar coordinates to rectangular coordinates.");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1024
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1025 static PyObject *
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1026 cmath_isnan(PyObject *self, PyObject *args)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1027 {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1028 Py_complex z;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1029 if (!PyArg_ParseTuple(args, "D:isnan", &z))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1030 return NULL;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1031 return PyBool_FromLong(Py_IS_NAN(z.real) || Py_IS_NAN(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1032 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1033
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1034 PyDoc_STRVAR(cmath_isnan_doc,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1035 "isnan(z) -> bool\n\
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1036 Checks if the real or imaginary part of z not a number (NaN)");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1037
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1038 static PyObject *
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1039 cmath_isinf(PyObject *self, PyObject *args)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1040 {
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1041 Py_complex z;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1042 if (!PyArg_ParseTuple(args, "D:isnan", &z))
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1043 return NULL;
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1044 return PyBool_FromLong(Py_IS_INFINITY(z.real) ||
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1045 Py_IS_INFINITY(z.imag));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1046 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1047
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1048 PyDoc_STRVAR(cmath_isinf_doc,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1049 "isinf(z) -> bool\n\
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1050 Checks if the real or imaginary part of z is infinite.");
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1051
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
1052
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
1053 PyDoc_STRVAR(module_doc,
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1054 "This module is always available. It provides access to mathematical\n"
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 22722
diff changeset
1055 "functions for complex numbers.");
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
1056
4639
97ec9dfbb2b6 Renamed Grandly
Roger E. Masse <rmasse@newcnri.cnri.reston.va.us>
parents: 4600
diff changeset
1057 static PyMethodDef cmath_methods[] = {
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1058 {"acos", cmath_acos, METH_VARARGS, c_acos_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1059 {"acosh", cmath_acosh, METH_VARARGS, c_acosh_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1060 {"asin", cmath_asin, METH_VARARGS, c_asin_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1061 {"asinh", cmath_asinh, METH_VARARGS, c_asinh_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1062 {"atan", cmath_atan, METH_VARARGS, c_atan_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1063 {"atanh", cmath_atanh, METH_VARARGS, c_atanh_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1064 {"cos", cmath_cos, METH_VARARGS, c_cos_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1065 {"cosh", cmath_cosh, METH_VARARGS, c_cosh_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1066 {"exp", cmath_exp, METH_VARARGS, c_exp_doc},
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1067 {"isinf", cmath_isinf, METH_VARARGS, cmath_isinf_doc},
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1068 {"isnan", cmath_isnan, METH_VARARGS, cmath_isnan_doc},
32350
11c31a98dfd6 Patch #826074: cmath.log optional base argument, fixes #823209
Raymond Hettinger <python@rcn.com>
parents: 24471
diff changeset
1069 {"log", cmath_log, METH_VARARGS, cmath_log_doc},
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1070 {"log10", cmath_log10, METH_VARARGS, c_log10_doc},
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1071 {"phase", cmath_phase, METH_VARARGS, cmath_phase_doc},
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1072 {"polar", cmath_polar, METH_VARARGS, cmath_polar_doc},
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1073 {"rect", cmath_rect, METH_VARARGS, cmath_rect_doc},
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1074 {"sin", cmath_sin, METH_VARARGS, c_sin_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1075 {"sinh", cmath_sinh, METH_VARARGS, c_sinh_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1076 {"sqrt", cmath_sqrt, METH_VARARGS, c_sqrt_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1077 {"tan", cmath_tan, METH_VARARGS, c_tan_doc},
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1078 {"tanh", cmath_tanh, METH_VARARGS, c_tanh_doc},
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
1079 {NULL, NULL} /* sentinel */
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
1080 };
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
1081
24471
f66b3a3509c7 Excise DL_EXPORT/DL_IMPORT from Modules/*. Required adding a prototype
Mark Hammond <mhammond@skippinet.com.au>
parents: 24280
diff changeset
1082 PyMODINIT_FUNC
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13493
diff changeset
1083 initcmath(void)
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
1084 {
22722
ba68dda15df0 Use the PyModule_*() API instead of manipulating the module dictionary
Fred Drake <fdrake@acm.org>
parents: 22227
diff changeset
1085 PyObject *m;
16707
9696c95d09b7 Mechanical edits just so I can read it.
Tim Peters <tim.peters@gmail.com>
parents: 13817
diff changeset
1086
9593
f22f769bf3d9 Added Doc strings -- by Chris Petrilli.
Guido van Rossum <guido@python.org>
parents: 9588
diff changeset
1087 m = Py_InitModule3("cmath", cmath_methods, module_doc);
36324
1af7f719ed28 Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents: 32350
diff changeset
1088 if (m == NULL)
1af7f719ed28 Check return result from Py_InitModule*(). This API can fail.
Neal Norwitz <nnorwitz@gmail.com>
parents: 32350
diff changeset
1089 return;
22722
ba68dda15df0 Use the PyModule_*() API instead of manipulating the module dictionary
Fred Drake <fdrake@acm.org>
parents: 22227
diff changeset
1090
ba68dda15df0 Use the PyModule_*() API instead of manipulating the module dictionary
Fred Drake <fdrake@acm.org>
parents: 22227
diff changeset
1091 PyModule_AddObject(m, "pi",
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1092 PyFloat_FromDouble(Py_MATH_PI));
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 36324
diff changeset
1093 PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));
46505
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1094
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1095 /* initialize special value tables */
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1096
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1097 #define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY }
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1098 #define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p;
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1099
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1100 INIT_SPECIAL_VALUES(acos_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1101 C(P34,INF) C(P,INF) C(P,INF) C(P,-INF) C(P,-INF) C(P34,-INF) C(N,INF)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1102 C(P12,INF) C(U,U) C(U,U) C(U,U) C(U,U) C(P12,-INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1103 C(P12,INF) C(U,U) C(P12,0.) C(P12,-0.) C(U,U) C(P12,-INF) C(P12,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1104 C(P12,INF) C(U,U) C(P12,0.) C(P12,-0.) C(U,U) C(P12,-INF) C(P12,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1105 C(P12,INF) C(U,U) C(U,U) C(U,U) C(U,U) C(P12,-INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1106 C(P14,INF) C(0.,INF) C(0.,INF) C(0.,-INF) C(0.,-INF) C(P14,-INF) C(N,INF)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1107 C(N,INF) C(N,N) C(N,N) C(N,N) C(N,N) C(N,-INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1108 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1109
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1110 INIT_SPECIAL_VALUES(acosh_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1111 C(INF,-P34) C(INF,-P) C(INF,-P) C(INF,P) C(INF,P) C(INF,P34) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1112 C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1113 C(INF,-P12) C(U,U) C(0.,-P12) C(0.,P12) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1114 C(INF,-P12) C(U,U) C(0.,-P12) C(0.,P12) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1115 C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1116 C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1117 C(INF,N) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1118 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1119
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1120 INIT_SPECIAL_VALUES(asinh_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1121 C(-INF,-P14) C(-INF,-0.) C(-INF,-0.) C(-INF,0.) C(-INF,0.) C(-INF,P14) C(-INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1122 C(-INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(-INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1123 C(-INF,-P12) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1124 C(INF,-P12) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1125 C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1126 C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1127 C(INF,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(INF,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1128 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1129
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1130 INIT_SPECIAL_VALUES(atanh_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1131 C(-0.,-P12) C(-0.,-P12) C(-0.,-P12) C(-0.,P12) C(-0.,P12) C(-0.,P12) C(-0.,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1132 C(-0.,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(-0.,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1133 C(-0.,-P12) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-0.,P12) C(-0.,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1134 C(0.,-P12) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,P12) C(0.,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1135 C(0.,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(0.,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1136 C(0.,-P12) C(0.,-P12) C(0.,-P12) C(0.,P12) C(0.,P12) C(0.,P12) C(0.,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1137 C(0.,-P12) C(N,N) C(N,N) C(N,N) C(N,N) C(0.,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1138 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1139
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1140 INIT_SPECIAL_VALUES(cosh_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1141 C(INF,N) C(U,U) C(INF,0.) C(INF,-0.) C(U,U) C(INF,N) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1142 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1143 C(N,0.) C(U,U) C(1.,0.) C(1.,-0.) C(U,U) C(N,0.) C(N,0.)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1144 C(N,0.) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,0.) C(N,0.)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1145 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1146 C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1147 C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1148 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1149
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1150 INIT_SPECIAL_VALUES(exp_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1151 C(0.,0.) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,0.) C(0.,0.)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1152 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1153 C(N,N) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1154 C(N,N) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1155 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1156 C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1157 C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1158 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1159
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1160 INIT_SPECIAL_VALUES(log_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1161 C(INF,-P34) C(INF,-P) C(INF,-P) C(INF,P) C(INF,P) C(INF,P34) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1162 C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1163 C(INF,-P12) C(U,U) C(-INF,-P) C(-INF,P) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1164 C(INF,-P12) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1165 C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1166 C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1167 C(INF,N) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1168 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1169
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1170 INIT_SPECIAL_VALUES(sinh_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1171 C(INF,N) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,N) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1172 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1173 C(0.,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(0.,N) C(0.,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1174 C(0.,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,N) C(0.,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1175 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1176 C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1177 C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1178 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1179
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1180 INIT_SPECIAL_VALUES(sqrt_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1181 C(INF,-INF) C(0.,-INF) C(0.,-INF) C(0.,INF) C(0.,INF) C(INF,INF) C(N,INF)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1182 C(INF,-INF) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1183 C(INF,-INF) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1184 C(INF,-INF) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1185 C(INF,-INF) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1186 C(INF,-INF) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,INF) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1187 C(INF,-INF) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,INF) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1188 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1189
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1190 INIT_SPECIAL_VALUES(tanh_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1191 C(-1.,0.) C(U,U) C(-1.,-0.) C(-1.,0.) C(U,U) C(-1.,0.) C(-1.,0.)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1192 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1193 C(N,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1194 C(N,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1195 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1196 C(1.,0.) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(1.,0.) C(1.,0.)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1197 C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1198 })
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1199
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1200 INIT_SPECIAL_VALUES(rect_special_values, {
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1201 C(INF,N) C(U,U) C(-INF,0.) C(-INF,-0.) C(U,U) C(INF,N) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1202 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1203 C(0.,0.) C(U,U) C(-0.,0.) C(-0.,-0.) C(U,U) C(0.,0.) C(0.,0.)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1204 C(0.,0.) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,0.) C(0.,0.)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1205 C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1206 C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1207 C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N)
63965327b3ef Merged revisions 62386-62387,62389-62393,62396,62400-62402,62407,62409-62410,62412-62414,62418-62419 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46477
diff changeset
1208 })
3334
969bd911e114 complex math
Guido van Rossum <guido@python.org>
parents:
diff changeset
1209 }