Mercurial > cpython-lru_cache-weakref
annotate Objects/complexobject.c @ 53191:cc5565415ada
Ladies and gentlemen, the new float.__repr__() has arrived.
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Fri, 17 Apr 2009 00:11:54 +0000 |
| parents | b653eab13b73 |
| children | 330115137414 |
| rev | line source |
|---|---|
|
5559
1eced1aaad5a
Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
1 |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* Complex object implementation */ |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 /* Borrows heavily from floatobject.c */ |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 |
|
5559
1eced1aaad5a
Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
6 /* Submitted by Jim Hugunin */ |
|
1eced1aaad5a
Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
7 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
8 #include "Python.h" |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
9 #include "structmember.h" |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 |
|
46161
848160d10780
Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45371
diff
changeset
|
11 #ifdef HAVE_IEEEFP_H |
|
848160d10780
Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45371
diff
changeset
|
12 #include <ieeefp.h> |
|
848160d10780
Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45371
diff
changeset
|
13 #endif |
|
848160d10780
Merged revisions 61981,61984-61987,61992-61993,61997-62000 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45371
diff
changeset
|
14 |
|
23820
130fff486fa6
Rearrange the #ifndef WITHOUT_COMPLEX so it can be picked up from
Guido van Rossum <guido@python.org>
parents:
23703
diff
changeset
|
15 #ifndef WITHOUT_COMPLEX |
|
130fff486fa6
Rearrange the #ifndef WITHOUT_COMPLEX so it can be picked up from
Guido van Rossum <guido@python.org>
parents:
23703
diff
changeset
|
16 |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 /* elementary operations on complex numbers */ |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 |
| 3771 | 19 static Py_complex c_1 = {1., 0.}; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
21 Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
22 c_sum(Py_complex a, Py_complex b) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 { |
| 3771 | 24 Py_complex r; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 r.real = a.real + b.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 r.imag = a.imag + b.imag; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 return r; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
30 Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
31 c_diff(Py_complex a, Py_complex b) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 { |
| 3771 | 33 Py_complex r; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
34 r.real = a.real - b.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
35 r.imag = a.imag - b.imag; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
36 return r; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
37 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
38 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
39 Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
40 c_neg(Py_complex a) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
41 { |
| 3771 | 42 Py_complex r; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
43 r.real = -a.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
44 r.imag = -a.imag; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
45 return r; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
46 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
47 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
48 Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
49 c_prod(Py_complex a, Py_complex b) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 { |
| 3771 | 51 Py_complex r; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 r.real = a.real*b.real - a.imag*b.imag; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 r.imag = a.real*b.imag + a.imag*b.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
54 return r; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
57 Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
58 c_quot(Py_complex a, Py_complex b) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 { |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
60 /****************************************************************** |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
61 This was the original algorithm. It's grossly prone to spurious |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
62 overflow and underflow errors. It also merrily divides by 0 despite |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
63 checking for that(!). The code still serves a doc purpose here, as |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
64 the algorithm following is a simple by-cases transformation of this |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
65 one: |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
66 |
| 3771 | 67 Py_complex r; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
68 double d = b.real*b.real + b.imag*b.imag; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 if (d == 0.) |
|
5559
1eced1aaad5a
Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
70 errno = EDOM; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 r.real = (a.real*b.real + a.imag*b.imag)/d; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
72 r.imag = (a.imag*b.real - a.real*b.imag)/d; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
73 return r; |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
74 ******************************************************************/ |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
75 |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
76 /* This algorithm is better, and is pretty obvious: first divide the |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
77 * numerators and denominator by whichever of {b.real, b.imag} has |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
78 * larger magnitude. The earliest reference I found was to CACM |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
79 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
80 * University). As usual, though, we're still ignoring all IEEE |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
81 * endcases. |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
82 */ |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
83 Py_complex r; /* the result */ |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
84 const double abs_breal = b.real < 0 ? -b.real : b.real; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
85 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
86 |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
87 if (abs_breal >= abs_bimag) { |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
88 /* divide tops and bottom by b.real */ |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
89 if (abs_breal == 0.0) { |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
90 errno = EDOM; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
91 r.real = r.imag = 0.0; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
92 } |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
93 else { |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
94 const double ratio = b.imag / b.real; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
95 const double denom = b.real + b.imag * ratio; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
96 r.real = (a.real + a.imag * ratio) / denom; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
97 r.imag = (a.imag - a.real * ratio) / denom; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
98 } |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
99 } |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
100 else { |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
101 /* divide tops and bottom by b.imag */ |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
102 const double ratio = b.real / b.imag; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
103 const double denom = b.real * ratio + b.imag; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
104 assert(b.imag != 0.0); |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
105 r.real = (a.real * ratio + a.imag) / denom; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
106 r.imag = (a.imag * ratio - a.real) / denom; |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
107 } |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
108 return r; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
111 Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
112 c_pow(Py_complex a, Py_complex b) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
113 { |
| 3771 | 114 Py_complex r; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 double vabs,len,at,phase; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 if (b.real == 0. && b.imag == 0.) { |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
117 r.real = 1.; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 r.imag = 0.; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 else if (a.real == 0. && a.imag == 0.) { |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 if (b.imag != 0. || b.real < 0.) |
|
22540
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
122 errno = EDOM; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 r.real = 0.; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 r.imag = 0.; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
125 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
126 else { |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
127 vabs = hypot(a.real,a.imag); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 len = pow(vabs,b.real); |
|
19758
64bcef1702ad
Revert parts of patch #453627, documenting the resulting test failures
Martin v. Löwis <martin@v.loewis.de>
parents:
19730
diff
changeset
|
129 at = atan2(a.imag, a.real); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
130 phase = at*b.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
131 if (b.imag != 0.0) { |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
132 len /= exp(at*b.imag); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
133 phase += b.imag*log(vabs); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
134 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
135 r.real = len*cos(phase); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
136 r.imag = len*sin(phase); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
137 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
138 return r; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
139 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
140 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
141 static Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
142 c_powu(Py_complex x, long n) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
143 { |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
144 Py_complex r, p; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
145 long mask = 1; |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
146 r = c_1; |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
147 p = x; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
148 while (mask > 0 && n >= mask) { |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 if (n & mask) |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
150 r = c_prod(r,p); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
151 mask <<= 1; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
152 p = c_prod(p,p); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
153 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
154 return r; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
156 |
|
17066
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
157 static Py_complex |
|
2c1be7924b04
SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents:
17029
diff
changeset
|
158 c_powi(Py_complex x, long n) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
159 { |
| 3771 | 160 Py_complex cn; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 if (n > 100 || n < -100) { |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 cn.real = (double) n; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 cn.imag = 0.; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 return c_pow(x,cn); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
166 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
167 else if (n > 0) |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
168 return c_powu(x,n); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 else |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
170 return c_quot(c_1,c_powu(x,-n)); |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
173 |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
174 double |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
175 c_abs(Py_complex z) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
176 { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
177 /* sets errno = ERANGE on overflow; otherwise errno = 0 */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
178 double result; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
179 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
180 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
181 /* C99 rules: if either the real or the imaginary part is an |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
182 infinity, return infinity, even if the other part is a |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
183 NaN. */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
184 if (Py_IS_INFINITY(z.real)) { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
185 result = fabs(z.real); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
186 errno = 0; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
187 return result; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
188 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
189 if (Py_IS_INFINITY(z.imag)) { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
190 result = fabs(z.imag); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
191 errno = 0; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
192 return result; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
193 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
194 /* either the real or imaginary part is a NaN, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
195 and neither is infinite. Result should be NaN. */ |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
196 return Py_NAN; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
197 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
198 result = hypot(z.real, z.imag); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
199 if (!Py_IS_FINITE(result)) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
200 errno = ERANGE; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
201 else |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
202 errno = 0; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
203 return result; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
204 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
205 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
206 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
207 complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
208 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
209 PyObject *op; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
210 |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
211 op = type->tp_alloc(type, 0); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
212 if (op != NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
213 ((PyComplexObject *)op)->cval = cval; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
214 return op; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
215 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
216 |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
217 PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
218 PyComplex_FromCComplex(Py_complex cval) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 { |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
220 register PyComplexObject *op; |
|
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
221 |
|
24898
a869d2de536f
Call me anal, but there was a particular phrase that was speading to
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
222 /* Inline PyObject_New */ |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
223 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject)); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
224 if (op == NULL) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
225 return PyErr_NoMemory(); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11882
diff
changeset
|
226 PyObject_INIT(op, &PyComplex_Type); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 op->cval = cval; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
228 return (PyObject *) op; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
230 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
231 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
232 complex_subtype_from_doubles(PyTypeObject *type, double real, double imag) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
233 { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
234 Py_complex c; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
235 c.real = real; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
236 c.imag = imag; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
237 return complex_subtype_from_c_complex(type, c); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
238 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
239 |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
240 PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
241 PyComplex_FromDoubles(double real, double imag) |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
242 { |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
243 Py_complex c; |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
244 c.real = real; |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
245 c.imag = imag; |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
246 return PyComplex_FromCComplex(c); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
249 double |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
250 PyComplex_RealAsDouble(PyObject *op) |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
251 { |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
252 if (PyComplex_Check(op)) { |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
253 return ((PyComplexObject *)op)->cval.real; |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
254 } |
|
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
255 else { |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
256 return PyFloat_AsDouble(op); |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
257 } |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
258 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
259 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
260 double |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
261 PyComplex_ImagAsDouble(PyObject *op) |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
262 { |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
263 if (PyComplex_Check(op)) { |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
264 return ((PyComplexObject *)op)->cval.imag; |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
265 } |
|
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
266 else { |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
267 return 0.0; |
|
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
268 } |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
269 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
270 |
| 3771 | 271 Py_complex |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
272 PyComplex_AsCComplex(PyObject *op) |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
273 { |
| 3771 | 274 Py_complex cv; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
275 PyObject *newop = NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
276 static PyObject *complex_str = NULL; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
277 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
278 assert(op); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
279 /* If op is already of type PyComplex_Type, return its value */ |
|
3328
4c655115dfce
Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents:
3316
diff
changeset
|
280 if (PyComplex_Check(op)) { |
|
4c655115dfce
Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents:
3316
diff
changeset
|
281 return ((PyComplexObject *)op)->cval; |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
282 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
283 /* If not, use op's __complex__ method, if it exists */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
284 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
285 /* return -1 on failure */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
286 cv.real = -1.; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
287 cv.imag = 0.; |
|
45029
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44767
diff
changeset
|
288 |
|
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44767
diff
changeset
|
289 if (complex_str == NULL) { |
|
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44767
diff
changeset
|
290 if (!(complex_str = PyUnicode_FromString("__complex__"))) |
|
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44767
diff
changeset
|
291 return cv; |
|
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44767
diff
changeset
|
292 } |
|
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44767
diff
changeset
|
293 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
294 { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
295 PyObject *complexfunc; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
296 complexfunc = _PyType_Lookup(op->ob_type, complex_str); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
297 /* complexfunc is a borrowed reference */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
298 if (complexfunc) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
299 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
300 if (!newop) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
301 return cv; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
302 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
303 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
304 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
305 if (newop) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
306 if (!PyComplex_Check(newop)) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
307 PyErr_SetString(PyExc_TypeError, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
308 "__complex__ should return a complex object"); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
309 Py_DECREF(newop); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
310 return cv; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
311 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
312 cv = ((PyComplexObject *)newop)->cval; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
313 Py_DECREF(newop); |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
314 return cv; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
315 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
316 /* If neither of the above works, interpret op as a float giving the |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
317 real part of the result, and fill in the imaginary part as 0. */ |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
318 else { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
319 /* PyFloat_AsDouble will return -1 on failure */ |
|
3328
4c655115dfce
Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents:
3316
diff
changeset
|
320 cv.real = PyFloat_AsDouble(op); |
|
4c655115dfce
Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents:
3316
diff
changeset
|
321 return cv; |
|
17029
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
322 } |
|
3328
4c655115dfce
Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents:
3316
diff
changeset
|
323 } |
|
4c655115dfce
Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents:
3316
diff
changeset
|
324 |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 static void |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
326 complex_dealloc(PyObject *op) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 { |
|
20277
2983b54256c7
Enable GC for new-style instances. This touches lots of files, since
Guido van Rossum <guido@python.org>
parents:
20140
diff
changeset
|
328 op->ob_type->tp_free(op); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
332 static PyObject * |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
333 complex_format(PyComplexObject *v, char format_code) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
335 PyObject *result = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
336 Py_ssize_t len; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
337 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
338 /* If these are non-NULL, they'll need to be freed. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
339 char *pre = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
340 char *pim = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
341 char *buf = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
342 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
343 /* These do not need to be freed. They're either aliases for pim |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
344 and pre, or pointers to constants. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
345 char *re = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
346 char *im = NULL; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
347 char *lead = ""; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
348 char *tail = ""; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
349 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
350 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
351 if (v->cval.real == 0.) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
352 re = ""; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
353 if (!Py_IS_FINITE(v->cval.imag)) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
354 if (Py_IS_NAN(v->cval.imag)) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
355 im = "nan*"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
356 else if (copysign(1, v->cval.imag) == 1) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
357 im = "inf*"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
358 else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
359 im = "-inf*"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
360 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
361 else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
362 pim = PyOS_double_to_string(v->cval.imag, format_code, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
363 0, 0, NULL); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
364 if (!pim) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
365 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
366 goto done; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
367 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
368 im = pim; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
369 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
370 } else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
371 /* Format imaginary part with sign, real part without */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
372 if (!Py_IS_FINITE(v->cval.real)) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
373 if (Py_IS_NAN(v->cval.real)) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
374 re = "nan"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
375 /* else if (copysign(1, v->cval.real) == 1) */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
376 else if (v->cval.real > 0) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
377 re = "inf"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
378 else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
379 re = "-inf"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
380 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
381 else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
382 pre = PyOS_double_to_string(v->cval.real, format_code, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
383 0, 0, NULL); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
384 if (!pre) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
385 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
386 goto done; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
387 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
388 re = pre; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
389 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
390 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
391 if (!Py_IS_FINITE(v->cval.imag)) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
392 if (Py_IS_NAN(v->cval.imag)) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
393 im = "+nan*"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
394 /* else if (copysign(1, v->cval.imag) == 1) */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
395 else if (v->cval.imag > 0) |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
396 im = "+inf*"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
397 else |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
398 im = "-inf*"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
399 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
400 else { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
401 pim = PyOS_double_to_string(v->cval.imag, format_code, |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
402 0, Py_DTSF_SIGN, NULL); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
403 if (!pim) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
404 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
405 goto done; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
406 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
407 im = pim; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
408 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
409 lead = "("; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
410 tail = ")"; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
411 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
412 /* Alloc the final buffer. Add one for the "j" in the format string, and |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
413 one for the trailing zero. */ |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
414 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
415 buf = PyMem_Malloc(len); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
416 if (!buf) { |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
417 PyErr_NoMemory(); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
418 goto done; |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
419 } |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
420 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
421 result = PyUnicode_FromString(buf); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
422 done: |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
423 PyMem_Free(pim); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
424 PyMem_Free(pre); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
425 PyMem_Free(buf); |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
426 |
|
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
427 return result; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
429 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
430 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
431 complex_repr(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
433 return complex_format(v, 'r'); |
|
17029
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
434 } |
|
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
435 |
|
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
436 static PyObject * |
|
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
437 complex_str(PyComplexObject *v) |
|
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
438 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
439 return complex_format(v, 's'); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
441 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
442 static long |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
443 complex_hash(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
444 { |
|
13976
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
445 long hashreal, hashimag, combined; |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
446 hashreal = _Py_HashDouble(v->cval.real); |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
447 if (hashreal == -1) |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
448 return -1; |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
449 hashimag = _Py_HashDouble(v->cval.imag); |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
450 if (hashimag == -1) |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
451 return -1; |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
452 /* Note: if the imaginary part is 0, hashimag is 0 now, |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
453 * so the following returns hashreal unchanged. This is |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
454 * important because numbers of different types that |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
455 * compare equal must have the same hash value, so that |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
456 * hash(x + 0*j) must equal hash(x). |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
457 */ |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
458 combined = hashreal + 1000003 * hashimag; |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
459 if (combined == -1) |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
460 combined = -2; |
|
5ada9fa54801
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
Tim Peters <tim.peters@gmail.com>
parents:
13761
diff
changeset
|
461 return combined; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
463 |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
464 /* This macro may return! */ |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
465 #define TO_COMPLEX(obj, c) \ |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
466 if (PyComplex_Check(obj)) \ |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
467 c = ((PyComplexObject *)(obj))->cval; \ |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
468 else if (to_complex(&(obj), &(c)) < 0) \ |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
469 return (obj) |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
470 |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
471 static int |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
472 to_complex(PyObject **pobj, Py_complex *pc) |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
473 { |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
474 PyObject *obj = *pobj; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
475 |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
476 pc->real = pc->imag = 0.0; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
477 if (PyLong_Check(obj)) { |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
478 pc->real = PyLong_AsDouble(obj); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
479 if (pc->real == -1.0 && PyErr_Occurred()) { |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
480 *pobj = NULL; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
481 return -1; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
482 } |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
483 return 0; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
484 } |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
485 if (PyFloat_Check(obj)) { |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
486 pc->real = PyFloat_AsDouble(obj); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
487 return 0; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
488 } |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
489 Py_INCREF(Py_NotImplemented); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
490 *pobj = Py_NotImplemented; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
491 return -1; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
492 } |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
493 |
|
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
494 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
495 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
496 complex_add(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
498 Py_complex result; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
499 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
500 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
501 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
502 PyFPE_START_PROTECT("complex_add", return 0) |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
503 result = c_sum(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
504 PyFPE_END_PROTECT(result) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
505 return PyComplex_FromCComplex(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
506 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
507 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
508 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
509 complex_sub(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
511 Py_complex result; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
512 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
513 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
514 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
515 PyFPE_START_PROTECT("complex_sub", return 0) |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
516 result = c_diff(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
517 PyFPE_END_PROTECT(result) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
518 return PyComplex_FromCComplex(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
521 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
522 complex_mul(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
524 Py_complex result; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
525 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
526 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
527 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
528 PyFPE_START_PROTECT("complex_mul", return 0) |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
529 result = c_prod(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
530 PyFPE_END_PROTECT(result) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
531 return PyComplex_FromCComplex(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
532 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
534 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
535 complex_div(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
536 { |
| 3771 | 537 Py_complex quot; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
538 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
539 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
540 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
541 PyFPE_START_PROTECT("complex_div", return 0) |
|
5559
1eced1aaad5a
Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
542 errno = 0; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
543 quot = c_quot(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
544 PyFPE_END_PROTECT(quot) |
|
5559
1eced1aaad5a
Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
545 if (errno == EDOM) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
546 PyErr_SetString(PyExc_ZeroDivisionError, "complex division"); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
547 return NULL; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
548 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
549 return PyComplex_FromCComplex(quot); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
550 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
551 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
552 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
553 complex_remainder(PyObject *v, PyObject *w) |
|
4275
cb841f1b022e
Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents:
4025
diff
changeset
|
554 { |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
555 PyErr_SetString(PyExc_TypeError, |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
556 "can't mod complex numbers."); |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
557 return NULL; |
|
4275
cb841f1b022e
Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents:
4025
diff
changeset
|
558 } |
|
cb841f1b022e
Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents:
4025
diff
changeset
|
559 |
|
cb841f1b022e
Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents:
4025
diff
changeset
|
560 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
561 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
562 complex_divmod(PyObject *v, PyObject *w) |
|
4304
95c31931b76a
Properly(?) implemented remainder and divmod (Tim Hochberg)
Guido van Rossum <guido@python.org>
parents:
4290
diff
changeset
|
563 { |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
564 PyErr_SetString(PyExc_TypeError, |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
565 "can't take floor or mod of complex number."); |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
566 return NULL; |
|
4304
95c31931b76a
Properly(?) implemented remainder and divmod (Tim Hochberg)
Guido van Rossum <guido@python.org>
parents:
4290
diff
changeset
|
567 } |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
568 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
569 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
570 complex_pow(PyObject *v, PyObject *w, PyObject *z) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
571 { |
| 3771 | 572 Py_complex p; |
| 573 Py_complex exponent; | |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
574 long int_exponent; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
575 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
576 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
577 TO_COMPLEX(w, b); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
578 |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
579 if (z != Py_None) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
580 PyErr_SetString(PyExc_ValueError, "complex modulo"); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
581 return NULL; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
582 } |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
583 PyFPE_START_PROTECT("complex_pow", return 0) |
|
5559
1eced1aaad5a
Got rid of c_error in favor of errno (and EDOM/ERANGE).
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
584 errno = 0; |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
585 exponent = b; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
586 int_exponent = (long)exponent.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
587 if (exponent.imag == 0. && exponent.real == int_exponent) |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
588 p = c_powi(a, int_exponent); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
589 else |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
590 p = c_pow(a, exponent); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
591 |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
592 PyFPE_END_PROTECT(p) |
|
22540
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
593 Py_ADJUST_ERANGE2(p.real, p.imag); |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
594 if (errno == EDOM) { |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
595 PyErr_SetString(PyExc_ZeroDivisionError, |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
596 "0.0 to a negative or complex power"); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
597 return NULL; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
598 } |
|
22540
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
599 else if (errno == ERANGE) { |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
600 PyErr_SetString(PyExc_OverflowError, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
601 "complex exponentiation"); |
|
22540
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
602 return NULL; |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
603 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
604 return PyComplex_FromCComplex(p); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
605 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
606 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
607 static PyObject * |
|
39222
b0cdcbcc5f45
Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents:
38669
diff
changeset
|
608 complex_int_div(PyObject *v, PyObject *w) |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
609 { |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
610 PyErr_SetString(PyExc_TypeError, |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
611 "can't take floor of complex number."); |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
612 return NULL; |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
613 } |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
614 |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
615 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
616 complex_neg(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
617 { |
| 3771 | 618 Py_complex neg; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
619 neg.real = -v->cval.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
620 neg.imag = -v->cval.imag; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
621 return PyComplex_FromCComplex(neg); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
622 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
623 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
624 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
625 complex_pos(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
626 { |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
627 if (PyComplex_CheckExact(v)) { |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
628 Py_INCREF(v); |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
629 return (PyObject *)v; |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
630 } |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
631 else |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
632 return PyComplex_FromCComplex(v->cval); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
633 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
634 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
635 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
636 complex_abs(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
637 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
638 double result; |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
639 |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
640 PyFPE_START_PROTECT("complex_abs", return 0) |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
641 result = c_abs(v->cval); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
642 PyFPE_END_PROTECT(result) |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
643 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
644 if (errno == ERANGE) { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
645 PyErr_SetString(PyExc_OverflowError, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
646 "absolute value too large"); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
647 return NULL; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
648 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
649 return PyFloat_FromDouble(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
650 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
651 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
652 static int |
|
40401
88133417dfd0
- patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents:
39607
diff
changeset
|
653 complex_bool(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
654 { |
|
9940
93b9eafe1f1d
Ai! complex_nonzero() has && which should be ||, else decidedly
Guido van Rossum <guido@python.org>
parents:
8261
diff
changeset
|
655 return v->cval.real != 0.0 || v->cval.imag != 0.0; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
656 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
657 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
658 static PyObject * |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
659 complex_richcompare(PyObject *v, PyObject *w, int op) |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
660 { |
|
39607
6f1020743077
Fix comparing complex to non-complex numbers.
Guido van Rossum <guido@python.org>
parents:
39603
diff
changeset
|
661 PyObject *res; |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
662 Py_complex i, j; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
663 TO_COMPLEX(v, i); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
664 TO_COMPLEX(w, j); |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
665 |
|
20061
2caddb82ffea
Do the same thing to complex that I did to str: the rich comparison
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
666 if (op != Py_EQ && op != Py_NE) { |
|
39607
6f1020743077
Fix comparing complex to non-complex numbers.
Guido van Rossum <guido@python.org>
parents:
39603
diff
changeset
|
667 /* XXX Should eventually return NotImplemented */ |
|
20061
2caddb82ffea
Do the same thing to complex that I did to str: the rich comparison
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
668 PyErr_SetString(PyExc_TypeError, |
|
34195
46fa0e20cbcf
Bug #1079011: Incorrect error message (somewhat)
Raymond Hettinger <python@rcn.com>
parents:
33233
diff
changeset
|
669 "no ordering relation is defined for complex numbers"); |
|
20061
2caddb82ffea
Do the same thing to complex that I did to str: the rich comparison
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
670 return NULL; |
|
2caddb82ffea
Do the same thing to complex that I did to str: the rich comparison
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
671 } |
|
2caddb82ffea
Do the same thing to complex that I did to str: the rich comparison
Guido van Rossum <guido@python.org>
parents:
20012
diff
changeset
|
672 |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
673 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ)) |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
674 res = Py_True; |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
675 else |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
676 res = Py_False; |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
677 |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
678 Py_INCREF(res); |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
679 return res; |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
680 } |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
681 |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
682 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
683 complex_int(PyObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
684 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
685 PyErr_SetString(PyExc_TypeError, |
|
30252
66654ac69622
Remove 'e.g.' from error message
Raymond Hettinger <python@rcn.com>
parents:
30155
diff
changeset
|
686 "can't convert complex to int; use int(abs(z))"); |
|
4290
9c6eab0cf542
Raise exception instead of dropping imag part for conversion to int,
Guido van Rossum <guido@python.org>
parents:
4275
diff
changeset
|
687 return NULL; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
688 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
689 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
690 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
691 complex_float(PyObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
692 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
693 PyErr_SetString(PyExc_TypeError, |
|
30252
66654ac69622
Remove 'e.g.' from error message
Raymond Hettinger <python@rcn.com>
parents:
30155
diff
changeset
|
694 "can't convert complex to float; use abs(z)"); |
|
4290
9c6eab0cf542
Raise exception instead of dropping imag part for conversion to int,
Guido van Rossum <guido@python.org>
parents:
4275
diff
changeset
|
695 return NULL; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
696 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
697 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
698 static PyObject * |
|
19301
b9701538f827
Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents:
19051
diff
changeset
|
699 complex_conjugate(PyObject *self) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
700 { |
|
4025
854f25fde8f4
Changes to make the file acceptable to K&R C compilers (HPUX, SunOS 4.x).
Guido van Rossum <guido@python.org>
parents:
3771
diff
changeset
|
701 Py_complex c; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
702 c = ((PyComplexObject *)self)->cval; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
703 c.imag = -c.imag; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
704 return PyComplex_FromCComplex(c); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
705 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
706 |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
707 PyDoc_STRVAR(complex_conjugate_doc, |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
708 "complex.conjugate() -> complex\n" |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
709 "\n" |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
710 "Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j."); |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
711 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
712 static PyObject * |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
713 complex_getnewargs(PyComplexObject *v) |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
714 { |
|
47555
7d824fd131ad
Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents:
46477
diff
changeset
|
715 Py_complex c = v->cval; |
|
7d824fd131ad
Merged revisions 63829-63831,63858,63865,63879,63882,63948,63970-63972,63976,63989,64014-64015,64021-64022,64063-64065,64067 via svnmerge from
Georg Brandl <georg@python.org>
parents:
46477
diff
changeset
|
716 return Py_BuildValue("(dd)", c.real, c.imag); |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
717 } |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
718 |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
719 #if 0 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
720 static PyObject * |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
721 complex_is_finite(PyObject *self) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
722 { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
723 Py_complex c; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
724 c = ((PyComplexObject *)self)->cval; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
725 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) && |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
726 Py_IS_FINITE(c.imag))); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
727 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
728 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
729 PyDoc_STRVAR(complex_is_finite_doc, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
730 "complex.is_finite() -> bool\n" |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
731 "\n" |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
732 "Returns True if the real and the imaginary part is finite."); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
733 #endif |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
734 |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
735 static PyMethodDef complex_methods[] = { |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
736 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS, |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
737 complex_conjugate_doc}, |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
738 #if 0 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
739 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
740 complex_is_finite_doc}, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
741 #endif |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
742 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS}, |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
743 {NULL, NULL} /* sentinel */ |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
744 }; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
745 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19974
diff
changeset
|
746 static PyMemberDef complex_members[] = { |
|
21894
f245955b3fbe
Declare real and imag as read-only attributes.
Guido van Rossum <guido@python.org>
parents:
21399
diff
changeset
|
747 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY, |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19974
diff
changeset
|
748 "the real part of a complex number"}, |
|
21894
f245955b3fbe
Declare real and imag as read-only attributes.
Guido van Rossum <guido@python.org>
parents:
21399
diff
changeset
|
749 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY, |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19974
diff
changeset
|
750 "the imaginary part of a complex number"}, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
751 {0}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
752 }; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
753 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
754 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
755 complex_subtype_from_string(PyTypeObject *type, PyObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
756 { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
757 const char *s, *start; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
758 char *end; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
759 double x=0.0, y=0.0, z; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
760 int got_re=0, got_im=0, got_bracket=0, done=0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
761 int digit_or_dot; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
762 int sw_error=0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
763 int sign; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
764 char buffer[256]; /* For errors */ |
|
20666
88a242bfb23a
complex_subtype_from_string(): move the declaration of s_buffer[] out
Guido van Rossum <guido@python.org>
parents:
20277
diff
changeset
|
765 char s_buffer[256]; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
766 Py_ssize_t len; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
767 |
|
42855
d5b52d56beba
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42477
diff
changeset
|
768 if (PyUnicode_Check(v)) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37191
diff
changeset
|
769 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
770 PyErr_SetString(PyExc_ValueError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
771 "complex() literal too large to convert"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
772 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
773 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
774 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
775 PyUnicode_GET_SIZE(v), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
776 s_buffer, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
777 NULL)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
778 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
779 s = s_buffer; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
780 len = strlen(s); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
781 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
782 else if (PyObject_AsCharBuffer(v, &s, &len)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
783 PyErr_SetString(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
784 "complex() arg is not a string"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
785 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
786 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
787 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
788 /* position on first nonblank */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
789 start = s; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
790 while (*s && isspace(Py_CHARMASK(*s))) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
791 s++; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
792 if (s[0] == '\0') { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
793 PyErr_SetString(PyExc_ValueError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
794 "complex() arg is an empty string"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
795 return NULL; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
796 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
797 if (s[0] == '(') { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
798 /* Skip over possible bracket from repr(). */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
799 got_bracket = 1; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
800 s++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
801 while (*s && isspace(Py_CHARMASK(*s))) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
802 s++; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
803 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
804 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
805 z = -1.0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
806 sign = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
807 do { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
808 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
809 switch (*s) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
810 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
811 case '\0': |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
812 if (s-start != len) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
813 PyErr_SetString( |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
814 PyExc_ValueError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
815 "complex() arg contains a null byte"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
816 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
817 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
818 if(!done) sw_error=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
819 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
820 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
821 case ')': |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
822 if (!got_bracket || !(got_re || got_im)) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
823 sw_error=1; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
824 break; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
825 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
826 got_bracket=0; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
827 done=1; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
828 s++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
829 while (*s && isspace(Py_CHARMASK(*s))) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
830 s++; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
831 if (*s) sw_error=1; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
832 break; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
833 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
834 case '-': |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
835 sign = -1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
836 /* Fallthrough */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
837 case '+': |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
838 if (done) sw_error=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
839 s++; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
840 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'|| |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
841 isspace(Py_CHARMASK(*s)) ) sw_error=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
842 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
843 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
844 case 'J': |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
845 case 'j': |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
846 if (got_im || done) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
847 sw_error = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
848 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
849 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
850 if (z<0.0) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
851 y=sign; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
852 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
853 else{ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
854 y=sign*z; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
855 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
856 got_im=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
857 s++; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
858 if (*s!='+' && *s!='-' ) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
859 done=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
860 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
861 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
862 default: |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
863 if (isspace(Py_CHARMASK(*s))) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
864 while (*s && isspace(Py_CHARMASK(*s))) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
865 s++; |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
866 if (*s && *s != ')') |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
867 sw_error=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
868 else |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
869 done = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
870 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
871 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
872 digit_or_dot = |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
873 (*s=='.' || isdigit(Py_CHARMASK(*s))); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
874 if (done||!digit_or_dot) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
875 sw_error=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
876 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
877 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
878 errno = 0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
879 PyFPE_START_PROTECT("strtod", return 0) |
|
32305
13656d58d450
Patch #774665: Make Python LC_NUMERIC agnostic.
Martin v. Löwis <martin@v.loewis.de>
parents:
30683
diff
changeset
|
880 z = PyOS_ascii_strtod(s, &end) ; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
881 PyFPE_END_PROTECT(z) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
882 if (errno != 0) { |
|
21078
025ad27d4224
complex_to_buf(), complex_subtype_from_c_complex(): Conversion of
Barry Warsaw <barry@python.org>
parents:
20666
diff
changeset
|
883 PyOS_snprintf(buffer, sizeof(buffer), |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
884 "float() out of range: %.150s", s); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
885 PyErr_SetString( |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
886 PyExc_ValueError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
887 buffer); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
888 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
889 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
890 s=end; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
891 if (*s=='J' || *s=='j') { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
892 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
893 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
894 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
895 if (got_re) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
896 sw_error=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
897 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
898 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
899 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
900 /* accept a real part */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
901 x=sign*z; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
902 got_re=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
903 if (got_im) done=1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
904 z = -1.0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
905 sign = 1; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
906 break; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
907 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
908 } /* end of switch */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
909 |
|
23031
5bda546ebe24
SF bug 543840: complex(string) accepts strings with \0
Tim Peters <tim.peters@gmail.com>
parents:
22974
diff
changeset
|
910 } while (s - start < len && !sw_error); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
911 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
912 if (sw_error || got_bracket) { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
913 PyErr_SetString(PyExc_ValueError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
914 "complex() arg is a malformed string"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
915 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
916 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
917 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
918 return complex_subtype_from_doubles(type, x, y); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
919 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
920 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
921 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
922 complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
923 { |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
924 PyObject *r, *i, *tmp, *f; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
925 PyNumberMethods *nbr, *nbi = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
926 Py_complex cr, ci; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
927 int own_r = 0; |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
928 int cr_is_complex = 0; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
929 int ci_is_complex = 0; |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
930 static PyObject *complexstr; |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
931 static char *kwlist[] = {"real", "imag", 0}; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
932 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
933 r = Py_False; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
934 i = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
935 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
936 &r, &i)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
937 return NULL; |
|
25064
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
938 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
939 /* Special-case for a single argument when type(arg) is complex. */ |
|
28134
cde444184336
Fix from Greg Chapman from SF bug #695651: a complex subclass
Guido van Rossum <guido@python.org>
parents:
27521
diff
changeset
|
940 if (PyComplex_CheckExact(r) && i == NULL && |
|
cde444184336
Fix from Greg Chapman from SF bug #695651: a complex subclass
Guido van Rossum <guido@python.org>
parents:
27521
diff
changeset
|
941 type == &PyComplex_Type) { |
|
25064
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
942 /* Note that we can't know whether it's safe to return |
|
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
943 a complex *subclass* instance as-is, hence the restriction |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
944 to exact complexes here. If either the input or the |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
945 output is a complex subclass, it will be handled below |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
946 as a non-orthogonal vector. */ |
|
25064
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
947 Py_INCREF(r); |
|
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
948 return r; |
|
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
949 } |
|
42855
d5b52d56beba
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42477
diff
changeset
|
950 if (PyUnicode_Check(r)) { |
|
21399
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
951 if (i != NULL) { |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
952 PyErr_SetString(PyExc_TypeError, |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
953 "complex() can't take second arg" |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
954 " if first is a string"); |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
955 return NULL; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
956 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
957 return complex_subtype_from_string(type, r); |
|
21399
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
958 } |
|
42855
d5b52d56beba
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42477
diff
changeset
|
959 if (i != NULL && PyUnicode_Check(i)) { |
|
21399
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
960 PyErr_SetString(PyExc_TypeError, |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
961 "complex() second arg can't be a string"); |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
962 return NULL; |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
963 } |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
964 |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
965 /* XXX Hack to support classes with __complex__ method */ |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
966 if (complexstr == NULL) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41920
diff
changeset
|
967 complexstr = PyUnicode_InternFromString("__complex__"); |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
968 if (complexstr == NULL) |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
969 return NULL; |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
970 } |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
971 f = PyObject_GetAttr(r, complexstr); |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
972 if (f == NULL) |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
973 PyErr_Clear(); |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
974 else { |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
30252
diff
changeset
|
975 PyObject *args = PyTuple_New(0); |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
976 if (args == NULL) |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
977 return NULL; |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
978 r = PyEval_CallObject(f, args); |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
979 Py_DECREF(args); |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
980 Py_DECREF(f); |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
981 if (r == NULL) |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
982 return NULL; |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
983 own_r = 1; |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
984 } |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
985 nbr = r->ob_type->tp_as_number; |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
986 if (i != NULL) |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
987 nbi = i->ob_type->tp_as_number; |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
988 if (nbr == NULL || nbr->nb_float == NULL || |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
989 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
990 PyErr_SetString(PyExc_TypeError, |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
991 "complex() argument must be a string or a number"); |
|
30155
e3281b0df6a4
complex_new(): This could leak when the argument was neither string nor
Tim Peters <tim.peters@gmail.com>
parents:
29520
diff
changeset
|
992 if (own_r) { |
|
e3281b0df6a4
complex_new(): This could leak when the argument was neither string nor
Tim Peters <tim.peters@gmail.com>
parents:
29520
diff
changeset
|
993 Py_DECREF(r); |
|
e3281b0df6a4
complex_new(): This could leak when the argument was neither string nor
Tim Peters <tim.peters@gmail.com>
parents:
29520
diff
changeset
|
994 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
995 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
996 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
997 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
998 /* If we get this far, then the "real" and "imag" parts should |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
999 both be treated as numbers, and the constructor should return a |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1000 complex number equal to (real + imag*1j). |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1001 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1002 Note that we do NOT assume the input to already be in canonical |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1003 form; the "real" and "imag" parts might themselves be complex |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1004 numbers, which slightly complicates the code below. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1005 if (PyComplex_Check(r)) { |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
1006 /* Note that if r is of a complex subtype, we're only |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
1007 retaining its real & imag parts here, and the return |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
1008 value is (properly) of the builtin complex type. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1009 cr = ((PyComplexObject*)r)->cval; |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1010 cr_is_complex = 1; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1011 if (own_r) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1012 Py_DECREF(r); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1013 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1014 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1015 else { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1016 /* The "real" part really is entirely real, and contributes |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1017 nothing in the imaginary direction. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1018 Just treat it as a double. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1019 tmp = PyNumber_Float(r); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1020 if (own_r) { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1021 /* r was a newly created complex number, rather |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1022 than the original "real" argument. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1023 Py_DECREF(r); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1024 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1025 if (tmp == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1026 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1027 if (!PyFloat_Check(tmp)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1028 PyErr_SetString(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1029 "float(r) didn't return a float"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1030 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1031 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1032 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1033 cr.real = PyFloat_AsDouble(tmp); |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
1034 cr.imag = 0.0; /* Shut up compiler warning */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1035 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1036 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1037 if (i == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1038 ci.real = 0.0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1039 } |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1040 else if (PyComplex_Check(i)) { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1041 ci = ((PyComplexObject*)i)->cval; |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1042 ci_is_complex = 1; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1043 } else { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1044 /* The "imag" part really is entirely imaginary, and |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1045 contributes nothing in the real direction. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1046 Just treat it as a double. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1047 tmp = (*nbi->nb_float)(i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1048 if (tmp == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1049 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1050 ci.real = PyFloat_AsDouble(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1051 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1052 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1053 /* If the input was in canonical form, then the "real" and "imag" |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1054 parts are real numbers, so that ci.imag and cr.imag are zero. |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1055 We need this correction in case they were not real numbers. */ |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1056 |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1057 if (ci_is_complex) { |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1058 cr.real -= ci.imag; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1059 } |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1060 if (cr_is_complex) { |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1061 ci.real += cr.imag; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1062 } |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1063 return complex_subtype_from_doubles(type, cr.real, ci.real); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1064 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1065 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23820
diff
changeset
|
1066 PyDoc_STRVAR(complex_doc, |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
1067 "complex(real[, imag]) -> complex number\n" |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
1068 "\n" |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
1069 "Create a complex number from a real part and an optional imaginary part.\n" |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23820
diff
changeset
|
1070 "This is equivalent to (real + imag*1j) where imag defaults to 0."); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1071 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
1072 static PyNumberMethods complex_as_number = { |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1073 (binaryfunc)complex_add, /* nb_add */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1074 (binaryfunc)complex_sub, /* nb_subtract */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1075 (binaryfunc)complex_mul, /* nb_multiply */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1076 (binaryfunc)complex_remainder, /* nb_remainder */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1077 (binaryfunc)complex_divmod, /* nb_divmod */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1078 (ternaryfunc)complex_pow, /* nb_power */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1079 (unaryfunc)complex_neg, /* nb_negative */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1080 (unaryfunc)complex_pos, /* nb_positive */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1081 (unaryfunc)complex_abs, /* nb_absolute */ |
|
40401
88133417dfd0
- patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents:
39607
diff
changeset
|
1082 (inquiry)complex_bool, /* nb_bool */ |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1083 0, /* nb_invert */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1084 0, /* nb_lshift */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1085 0, /* nb_rshift */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1086 0, /* nb_and */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1087 0, /* nb_xor */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1088 0, /* nb_or */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37191
diff
changeset
|
1089 complex_int, /* nb_int */ |
|
50829
af02b6e42142
Merged revisions 68650-68653 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50804
diff
changeset
|
1090 0, /* nb_reserved */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37191
diff
changeset
|
1091 complex_float, /* nb_float */ |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1092 0, /* nb_inplace_add */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1093 0, /* nb_inplace_subtract */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1094 0, /* nb_inplace_multiply*/ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1095 0, /* nb_inplace_remainder */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1096 0, /* nb_inplace_power */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1097 0, /* nb_inplace_lshift */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1098 0, /* nb_inplace_rshift */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1099 0, /* nb_inplace_and */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1100 0, /* nb_inplace_xor */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1101 0, /* nb_inplace_or */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1102 (binaryfunc)complex_int_div, /* nb_floor_divide */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1103 (binaryfunc)complex_div, /* nb_true_divide */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1104 0, /* nb_inplace_floor_divide */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1105 0, /* nb_inplace_true_divide */ |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1106 }; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1107 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
1108 PyTypeObject PyComplex_Type = { |
|
42334
e70cdce0e8b2
Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
42013
diff
changeset
|
1109 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1110 "complex", |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
1111 sizeof(PyComplexObject), |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1112 0, |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37191
diff
changeset
|
1113 complex_dealloc, /* tp_dealloc */ |
|
42477
e7fd327e0c19
Kill all uses and definitions of tp_print under Objects/. (Others will follow.)
Guido van Rossum <guido@python.org>
parents:
42414
diff
changeset
|
1114 0, /* tp_print */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1115 0, /* tp_getattr */ |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1116 0, /* tp_setattr */ |
|
51271
87fbbf22adf3
Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50829
diff
changeset
|
1117 0, /* tp_reserved */ |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1118 (reprfunc)complex_repr, /* tp_repr */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1119 &complex_as_number, /* tp_as_number */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1120 0, /* tp_as_sequence */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1121 0, /* tp_as_mapping */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1122 (hashfunc)complex_hash, /* tp_hash */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1123 0, /* tp_call */ |
|
17029
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
1124 (reprfunc)complex_str, /* tp_str */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1125 PyObject_GenericGetAttr, /* tp_getattro */ |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1126 0, /* tp_setattro */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1127 0, /* tp_as_buffer */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1128 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1129 complex_doc, /* tp_doc */ |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1130 0, /* tp_traverse */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1131 0, /* tp_clear */ |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
1132 complex_richcompare, /* tp_richcompare */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1133 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1134 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1135 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1136 complex_methods, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1137 complex_members, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1138 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1139 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1140 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1141 0, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1142 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1143 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1144 0, /* tp_init */ |
|
38669
19fd6141940d
Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
1145 PyType_GenericAlloc, /* tp_alloc */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1146 complex_new, /* tp_new */ |
|
22974
72778ec94dec
PyObject_Del can now be used as a function designator.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
22540
diff
changeset
|
1147 PyObject_Del, /* tp_free */ |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1148 }; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1149 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1150 #endif |
