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