Mercurial > cpython-lru_cache-weakref
annotate Objects/complexobject.c @ 53746:82ffdfbc42e5
Merged revisions 72288 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r72288 | georg.brandl | 2009-05-04 22:42:08 +0200 (Mo, 04 Mai 2009) | 1 line
#5925: fix highlighting of keyword table.
........
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Mon, 04 May 2009 20:43:44 +0000 |
| parents | e2b553d7205f |
| children | c6376d3fa968 |
| 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 { |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
335 PyObject *result = NULL; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
336 Py_ssize_t len; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
337 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
338 /* If these are non-NULL, they'll need to be freed. */ |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
339 char *pre = NULL; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
340 char *im = NULL; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
341 char *buf = NULL; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
342 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
343 /* These do not need to be freed. re is either an alias |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
344 for pre or a pointer to a constant. lead and tail |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
345 are pointers to constants. */ |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
346 char *re = NULL; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
347 char *lead = ""; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
348 char *tail = ""; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
349 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
350 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
351 re = ""; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
352 im = PyOS_double_to_string(v->cval.imag, format_code, |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
353 0, 0, NULL); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
354 if (!im) { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
355 PyErr_NoMemory(); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
356 goto done; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
357 } |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
358 } else { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
359 /* Format imaginary part with sign, real part without */ |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
360 pre = PyOS_double_to_string(v->cval.real, format_code, |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
361 0, 0, NULL); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
362 if (!pre) { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
363 PyErr_NoMemory(); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
364 goto done; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
365 } |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
366 re = pre; |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
367 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
368 im = PyOS_double_to_string(v->cval.imag, format_code, |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
369 0, Py_DTSF_SIGN, NULL); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
370 if (!im) { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
371 PyErr_NoMemory(); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
372 goto done; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
373 } |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
374 lead = "("; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
375 tail = ")"; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
376 } |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
377 /* Alloc the final buffer. Add one for the "j" in the format string, |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
378 and one for the trailing zero. */ |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
379 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
380 buf = PyMem_Malloc(len); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
381 if (!buf) { |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
382 PyErr_NoMemory(); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
383 goto done; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
384 } |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
385 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
386 result = PyUnicode_FromString(buf); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
387 done: |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
388 PyMem_Free(im); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
389 PyMem_Free(pre); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
390 PyMem_Free(buf); |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
391 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
392 return result; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
393 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
394 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
395 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
396 complex_repr(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
398 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
|
399 } |
|
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
400 |
|
65a638a24f7e
When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents:
15976
diff
changeset
|
401 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
|
402 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
|
403 { |
|
53187
b653eab13b73
The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents:
51271
diff
changeset
|
404 return complex_format(v, 's'); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 static long |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
408 complex_hash(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 { |
|
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
|
410 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
|
411 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
|
412 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
|
413 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
|
414 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
|
415 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
|
416 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
|
417 /* 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
|
418 * 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
|
419 * 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
|
420 * 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
|
421 * 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
|
422 */ |
|
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
|
423 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
|
424 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
|
425 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
|
426 return combined; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
427 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 |
|
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
|
429 /* 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
|
430 #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
|
431 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
|
432 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
|
433 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
|
434 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
|
435 |
|
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
|
436 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
|
437 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
|
438 { |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
439 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
|
440 |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
441 pc->real = pc->imag = 0.0; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
442 if (PyLong_Check(obj)) { |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
443 pc->real = PyLong_AsDouble(obj); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
444 if (pc->real == -1.0 && PyErr_Occurred()) { |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
445 *pobj = NULL; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
446 return -1; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
447 } |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
448 return 0; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
449 } |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
450 if (PyFloat_Check(obj)) { |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
451 pc->real = PyFloat_AsDouble(obj); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
452 return 0; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
453 } |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
454 Py_INCREF(Py_NotImplemented); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
455 *pobj = Py_NotImplemented; |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
456 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
|
457 } |
|
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
|
458 |
|
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
|
459 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
460 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
|
461 complex_add(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
463 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
|
464 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
465 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
466 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
467 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
|
468 result = c_sum(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
469 PyFPE_END_PROTECT(result) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
470 return PyComplex_FromCComplex(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
473 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
|
474 complex_sub(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
476 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
|
477 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
478 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
479 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
480 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
|
481 result = c_diff(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
482 PyFPE_END_PROTECT(result) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
483 return PyComplex_FromCComplex(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
486 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
|
487 complex_mul(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
489 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
|
490 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
491 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
492 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
493 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
|
494 result = c_prod(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
495 PyFPE_END_PROTECT(result) |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
496 return PyComplex_FromCComplex(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
499 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
|
500 complex_div(PyObject *v, PyObject *w) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 { |
| 3771 | 502 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
|
503 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
504 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
505 TO_COMPLEX(w, b); |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
506 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
|
507 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
|
508 quot = c_quot(a, b); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
509 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
|
510 if (errno == EDOM) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
511 PyErr_SetString(PyExc_ZeroDivisionError, "complex division"); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 return NULL; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
514 return PyComplex_FromCComplex(quot); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
517 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
|
518 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
|
519 { |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
520 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
|
521 "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
|
522 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
|
523 } |
|
cb841f1b022e
Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents:
4025
diff
changeset
|
524 |
|
cb841f1b022e
Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents:
4025
diff
changeset
|
525 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
526 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
|
527 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
|
528 { |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
529 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
|
530 "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
|
531 return NULL; |
|
4304
95c31931b76a
Properly(?) implemented remainder and divmod (Tim Hochberg)
Guido van Rossum <guido@python.org>
parents:
4290
diff
changeset
|
532 } |
|
3316
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_pow(PyObject *v, PyObject *w, PyObject *z) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
536 { |
| 3771 | 537 Py_complex p; |
| 538 Py_complex exponent; | |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
539 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
|
540 Py_complex a, b; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
541 TO_COMPLEX(v, a); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
542 TO_COMPLEX(w, b); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
543 |
|
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
|
544 if (z != Py_None) { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
545 PyErr_SetString(PyExc_ValueError, "complex modulo"); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
546 return NULL; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
547 } |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
548 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
|
549 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
|
550 exponent = b; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
551 int_exponent = (long)exponent.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
552 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
|
553 p = c_powi(a, int_exponent); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
554 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
|
555 p = c_pow(a, exponent); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
556 |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
557 PyFPE_END_PROTECT(p) |
|
22540
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
558 Py_ADJUST_ERANGE2(p.real, p.imag); |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
559 if (errno == EDOM) { |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
560 PyErr_SetString(PyExc_ZeroDivisionError, |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
561 "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
|
562 return NULL; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
563 } |
|
22540
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
564 else if (errno == ERANGE) { |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
565 PyErr_SetString(PyExc_OverflowError, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
566 "complex exponentiation"); |
|
22540
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
567 return NULL; |
|
75ef1f16725e
backport tim_one's checkin of
Michael W. Hudson <mwh@python.net>
parents:
21894
diff
changeset
|
568 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
569 return PyComplex_FromCComplex(p); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
570 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
571 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
572 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
|
573 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
|
574 { |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
575 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
|
576 "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
|
577 return NULL; |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
578 } |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
579 |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
580 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
581 complex_neg(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
582 { |
| 3771 | 583 Py_complex neg; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
584 neg.real = -v->cval.real; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
585 neg.imag = -v->cval.imag; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
586 return PyComplex_FromCComplex(neg); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
587 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
588 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
589 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
590 complex_pos(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
591 { |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
592 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
|
593 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
|
594 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
|
595 } |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
596 else |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
597 return PyComplex_FromCComplex(v->cval); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
598 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
599 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
600 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
601 complex_abs(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
602 { |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
603 double result; |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
604 |
|
5118
002865af55e5
Changes for Lee Busby's SIGFPE patch set.
Guido van Rossum <guido@python.org>
parents:
4933
diff
changeset
|
605 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
|
606 result = c_abs(v->cval); |
|
5197
74c12704a0bd
New form of PyFPE_END_PROTECT macro.
Guido van Rossum <guido@python.org>
parents:
5118
diff
changeset
|
607 PyFPE_END_PROTECT(result) |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
608 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
609 if (errno == ERANGE) { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
610 PyErr_SetString(PyExc_OverflowError, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
611 "absolute value too large"); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
612 return NULL; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
613 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
614 return PyFloat_FromDouble(result); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
615 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
616 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
617 static int |
|
40401
88133417dfd0
- patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents:
39607
diff
changeset
|
618 complex_bool(PyComplexObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
619 { |
|
9940
93b9eafe1f1d
Ai! complex_nonzero() has && which should be ||, else decidedly
Guido van Rossum <guido@python.org>
parents:
8261
diff
changeset
|
620 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
|
621 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
622 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
623 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
|
624 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
|
625 { |
|
39607
6f1020743077
Fix comparing complex to non-complex numbers.
Guido van Rossum <guido@python.org>
parents:
39603
diff
changeset
|
626 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
|
627 Py_complex i, j; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
628 TO_COMPLEX(v, i); |
|
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
629 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
|
630 |
|
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
|
631 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
|
632 /* 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
|
633 PyErr_SetString(PyExc_TypeError, |
|
34195
46fa0e20cbcf
Bug #1079011: Incorrect error message (somewhat)
Raymond Hettinger <python@rcn.com>
parents:
33233
diff
changeset
|
634 "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
|
635 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
|
636 } |
|
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
|
637 |
|
15976
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
638 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
|
639 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
|
640 else |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
641 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
|
642 |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
643 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
|
644 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
|
645 } |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
646 |
|
51fc45276a43
Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents:
14869
diff
changeset
|
647 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
648 complex_int(PyObject *v) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
649 { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
650 PyErr_SetString(PyExc_TypeError, |
|
30252
66654ac69622
Remove 'e.g.' from error message
Raymond Hettinger <python@rcn.com>
parents:
30155
diff
changeset
|
651 "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
|
652 return NULL; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
653 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
654 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
655 static PyObject * |
|
13452
ed4f7a22e928
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
656 complex_float(PyObject *v) |
|
3316
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 PyErr_SetString(PyExc_TypeError, |
|
30252
66654ac69622
Remove 'e.g.' from error message
Raymond Hettinger <python@rcn.com>
parents:
30155
diff
changeset
|
659 "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
|
660 return NULL; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
661 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
662 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
663 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
|
664 complex_conjugate(PyObject *self) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
665 { |
|
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
|
666 Py_complex c; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
667 c = ((PyComplexObject *)self)->cval; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
668 c.imag = -c.imag; |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
669 return PyComplex_FromCComplex(c); |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
670 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
671 |
|
42414
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
672 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
|
673 "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
|
674 "\n" |
|
8c165d20709f
Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents:
42334
diff
changeset
|
675 "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
|
676 |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
677 static PyObject * |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
678 complex_getnewargs(PyComplexObject *v) |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
679 { |
|
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
|
680 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
|
681 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
|
682 } |
|
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
683 |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
684 PyDoc_STRVAR(complex__format__doc, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
685 "complex.__format__() -> str\n" |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
686 "\n" |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
687 "Converts to a string according to format_spec."); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
688 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
689 static PyObject * |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
690 complex__format__(PyObject* self, PyObject* args) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
691 { |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
692 PyObject *format_spec; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
693 |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
694 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec)) |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
695 return NULL; |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
696 return _PyComplex_FormatAdvanced(self, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
697 PyUnicode_AS_UNICODE(format_spec), |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
698 PyUnicode_GET_SIZE(format_spec)); |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
699 } |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
700 |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
701 #if 0 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
702 static PyObject * |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
703 complex_is_finite(PyObject *self) |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
704 { |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
705 Py_complex c; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
706 c = ((PyComplexObject *)self)->cval; |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
707 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
|
708 Py_IS_FINITE(c.imag))); |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
709 } |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
710 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
711 PyDoc_STRVAR(complex_is_finite_doc, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
712 "complex.is_finite() -> bool\n" |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
713 "\n" |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
714 "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
|
715 #endif |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
716 |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
717 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
|
718 {"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
|
719 complex_conjugate_doc}, |
|
46477
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
720 #if 0 |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
721 {"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
|
722 complex_is_finite_doc}, |
|
b69f443ef480
Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
46161
diff
changeset
|
723 #endif |
|
27521
17bfd5dbc0f1
Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents:
25064
diff
changeset
|
724 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS}, |
|
53632
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
725 {"__format__", (PyCFunction)complex__format__, |
|
2cde0d003ffc
Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents:
53466
diff
changeset
|
726 METH_VARARGS, complex__format__doc}, |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
727 {NULL, NULL} /* sentinel */ |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
728 }; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
729 |
|
20012
3faabf54b8b8
Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents:
19974
diff
changeset
|
730 static PyMemberDef complex_members[] = { |
|
21894
f245955b3fbe
Declare real and imag as read-only attributes.
Guido van Rossum <guido@python.org>
parents:
21399
diff
changeset
|
731 {"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
|
732 "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
|
733 {"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
|
734 "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
|
735 {0}, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
736 }; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
737 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
738 static PyObject * |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
739 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
|
740 { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
741 const char *s, *start; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
742 char *end; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
743 double x=0.0, y=0.0, z; |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
744 int got_bracket=0; |
|
20666
88a242bfb23a
complex_subtype_from_string(): move the declaration of s_buffer[] out
Guido van Rossum <guido@python.org>
parents:
20277
diff
changeset
|
745 char s_buffer[256]; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
746 Py_ssize_t len; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
747 |
|
42855
d5b52d56beba
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42477
diff
changeset
|
748 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
|
749 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
|
750 PyErr_SetString(PyExc_ValueError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
751 "complex() literal too large to convert"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
752 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
753 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
754 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
|
755 PyUnicode_GET_SIZE(v), |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
756 s_buffer, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
757 NULL)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
758 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
759 s = s_buffer; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
35999
diff
changeset
|
760 len = strlen(s); |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
761 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
762 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
|
763 PyErr_SetString(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
764 "complex() arg is not a string"); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
765 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
766 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
767 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
768 /* position on first nonblank */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
769 start = s; |
|
53714
e2b553d7205f
Merged revisions 72253 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53707
diff
changeset
|
770 while (Py_ISSPACE(*s)) |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
771 s++; |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
772 if (*s == '(') { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
773 /* Skip over possible bracket from repr(). */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
774 got_bracket = 1; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
775 s++; |
|
53714
e2b553d7205f
Merged revisions 72253 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53707
diff
changeset
|
776 while (Py_ISSPACE(*s)) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
777 s++; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
778 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
779 |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
780 /* a valid complex string usually takes one of the three forms: |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
781 |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
782 <float> - real part only |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
783 <float>j - imaginary part only |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
784 <float><signed-float>j - real and imaginary parts |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
785 |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
786 where <float> represents any numeric string that's accepted by the |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
787 float constructor (including 'nan', 'inf', 'infinity', etc.), and |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
788 <signed-float> is any string of the form <float> whose first |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
789 character is '+' or '-'. |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
790 |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
791 For backwards compatibility, the extra forms |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
792 |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
793 <float><sign>j |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
794 <sign>j |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
795 j |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
796 |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
797 are also accepted, though support for these forms may be removed from |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
798 a future version of Python. |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
799 */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
800 |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
801 /* first look for forms starting with <float> */ |
|
53707
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
802 z = PyOS_string_to_double(s, &end, PyExc_OverflowError); |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
803 if (z == -1.0 && PyErr_Occurred()) { |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
804 if (PyErr_ExceptionMatches(PyExc_ValueError)) |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
805 PyErr_Clear(); |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
806 else |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
807 return NULL; |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
808 } |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
809 if (end != s) { |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
810 /* all 4 forms starting with <float> land here */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
811 s = end; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
812 if (*s == '+' || *s == '-') { |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
813 /* <float><signed-float>j | <float><sign>j */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
814 x = z; |
|
53707
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
815 y = PyOS_string_to_double(s, &end, PyExc_OverflowError); |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
816 if (y == -1.0 && PyErr_Occurred()) { |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
817 if (PyErr_ExceptionMatches(PyExc_ValueError)) |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
818 PyErr_Clear(); |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
819 else |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
820 return NULL; |
|
13a82a710f19
Issue #5914: Add new C-API function PyOS_string_to_double, to complement
Mark Dickinson <dickinsm@gmail.com>
parents:
53632
diff
changeset
|
821 } |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
822 if (end != s) |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
823 /* <float><signed-float>j */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
824 s = end; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
825 else { |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
826 /* <float><sign>j */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
827 y = *s == '+' ? 1.0 : -1.0; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
828 s++; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
829 } |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
830 if (!(*s == 'j' || *s == 'J')) |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
831 goto parse_error; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
832 s++; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
833 } |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
834 else if (*s == 'j' || *s == 'J') { |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
835 /* <float>j */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
836 s++; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
837 y = z; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
838 } |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
839 else |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
840 /* <float> */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
841 x = z; |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
842 } |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
843 else { |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
844 /* not starting with <float>; must be <sign>j or j */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
845 if (*s == '+' || *s == '-') { |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
846 /* <sign>j */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
847 y = *s == '+' ? 1.0 : -1.0; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
848 s++; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
849 } |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
850 else |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
851 /* j */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
852 y = 1.0; |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
853 if (!(*s == 'j' || *s == 'J')) |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
854 goto parse_error; |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
855 s++; |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
856 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
857 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
858 /* trailing whitespace and closing bracket */ |
|
53714
e2b553d7205f
Merged revisions 72253 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53707
diff
changeset
|
859 while (Py_ISSPACE(*s)) |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
860 s++; |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
861 if (got_bracket) { |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
862 /* if there was an opening parenthesis, then the corresponding |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
863 closing parenthesis should be right here */ |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
864 if (*s != ')') |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
865 goto parse_error; |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
866 s++; |
|
53714
e2b553d7205f
Merged revisions 72253 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53707
diff
changeset
|
867 while (Py_ISSPACE(*s)) |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
868 s++; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
869 } |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
870 |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
871 /* we should now be at the end of the string */ |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
872 if (s-start != len) |
|
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
873 goto parse_error; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
874 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
875 return complex_subtype_from_doubles(type, x, y); |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
876 |
|
53343
06db1d9d255f
Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents:
53332
diff
changeset
|
877 parse_error: |
|
53332
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
878 PyErr_SetString(PyExc_ValueError, |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
879 "complex() arg is a malformed string"); |
|
330115137414
Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents:
53187
diff
changeset
|
880 return NULL; |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
881 } |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
882 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
883 static PyObject * |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
884 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
|
885 { |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
886 PyObject *r, *i, *tmp, *f; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
887 PyNumberMethods *nbr, *nbi = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
888 Py_complex cr, ci; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
889 int own_r = 0; |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
890 int cr_is_complex = 0; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
891 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
|
892 static PyObject *complexstr; |
|
36675
dba6494735d0
Revert backwards-incompatible const changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36501
diff
changeset
|
893 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
|
894 |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
895 r = Py_False; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
896 i = NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
897 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
|
898 &r, &i)) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
899 return NULL; |
|
25064
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
900 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
901 /* 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
|
902 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
|
903 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
|
904 /* 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
|
905 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
|
906 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
|
907 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
|
908 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
|
909 Py_INCREF(r); |
|
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
910 return r; |
|
81a36d2a2d13
complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents:
24898
diff
changeset
|
911 } |
|
42855
d5b52d56beba
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42477
diff
changeset
|
912 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
|
913 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
|
914 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
|
915 "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
|
916 " 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
|
917 return NULL; |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
918 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
919 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
|
920 } |
|
42855
d5b52d56beba
Use unicode and remove support for some uses of str8.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42477
diff
changeset
|
921 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
|
922 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
|
923 "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
|
924 return NULL; |
|
33d59e18b68d
Ensure that complex() only accepts a string argument as the first arg,
Fred Drake <fdrake@acm.org>
parents:
21078
diff
changeset
|
925 } |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
926 |
|
23703
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
927 /* 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
|
928 if (complexstr == NULL) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41920
diff
changeset
|
929 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
|
930 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
|
931 return NULL; |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
932 } |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
933 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
|
934 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
|
935 PyErr_Clear(); |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
936 else { |
|
30683
3b59fa5d25b1
Simplify and speedup uses of Py_BuildValue():
Raymond Hettinger <python@rcn.com>
parents:
30252
diff
changeset
|
937 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
|
938 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
|
939 return NULL; |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
940 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
|
941 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
|
942 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
|
943 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
|
944 return NULL; |
|
abe1bb76ee44
Close SF bug 563740. complex() now finds __complex__() in new style classes.
Raymond Hettinger <python@rcn.com>
parents:
23043
diff
changeset
|
945 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
|
946 } |
|
19889
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
947 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
|
948 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
|
949 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
|
950 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
|
951 ((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
|
952 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
|
953 "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
|
954 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
|
955 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
|
956 } |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
957 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
958 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
959 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
960 /* 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
|
961 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
|
962 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
|
963 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
964 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
|
965 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
|
966 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
|
967 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
|
968 /* 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
|
969 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
|
970 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
|
971 cr = ((PyComplexObject*)r)->cval; |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
972 cr_is_complex = 1; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
973 if (own_r) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
974 Py_DECREF(r); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
975 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
976 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
977 else { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
978 /* 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
|
979 nothing in the imaginary direction. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
980 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
|
981 tmp = PyNumber_Float(r); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
982 if (own_r) { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
983 /* 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
|
984 than the original "real" argument. */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
985 Py_DECREF(r); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
986 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
987 if (tmp == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
988 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
989 if (!PyFloat_Check(tmp)) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
990 PyErr_SetString(PyExc_TypeError, |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
991 "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
|
992 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
993 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
994 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
995 cr.real = PyFloat_AsDouble(tmp); |
|
44767
a6f9a2ba8962
Merged revisions 60053-60078 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44134
diff
changeset
|
996 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
|
997 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
998 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
999 if (i == NULL) { |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1000 ci.real = 0.0; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1001 } |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1002 else if (PyComplex_Check(i)) { |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1003 ci = ((PyComplexObject*)i)->cval; |
|
44045
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1004 ci_is_complex = 1; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1005 } else { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1006 /* 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
|
1007 contributes nothing in the real direction. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1008 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
|
1009 tmp = (*nbi->nb_float)(i); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1010 if (tmp == NULL) |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1011 return NULL; |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1012 ci.real = PyFloat_AsDouble(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1013 Py_DECREF(tmp); |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1014 } |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40626
diff
changeset
|
1015 /* 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
|
1016 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
|
1017 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
|
1018 |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1019 if (ci_is_complex) { |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1020 cr.real -= ci.imag; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1021 } |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1022 if (cr_is_complex) { |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1023 ci.real += cr.imag; |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1024 } |
|
530fb9852c50
Merged revisions 59202-59211 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43420
diff
changeset
|
1025 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
|
1026 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1027 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23820
diff
changeset
|
1028 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
|
1029 "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
|
1030 "\n" |
|
733314fcfdaa
Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents:
19758
diff
changeset
|
1031 "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
|
1032 "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
|
1033 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
1034 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
|
1035 (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
|
1036 (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
|
1037 (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
|
1038 (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
|
1039 (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
|
1040 (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
|
1041 (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
|
1042 (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
|
1043 (unaryfunc)complex_abs, /* nb_absolute */ |
|
40401
88133417dfd0
- patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents:
39607
diff
changeset
|
1044 (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
|
1045 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
|
1046 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
|
1047 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
|
1048 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
|
1049 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
|
1050 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
|
1051 complex_int, /* nb_int */ |
|
50829
af02b6e42142
Merged revisions 68650-68653 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50804
diff
changeset
|
1052 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
|
1053 complex_float, /* nb_float */ |
|
19051
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1054 0, /* nb_inplace_add */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1055 0, /* nb_inplace_subtract */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1056 0, /* nb_inplace_multiply*/ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1057 0, /* nb_inplace_remainder */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1058 0, /* nb_inplace_power */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1059 0, /* nb_inplace_lshift */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1060 0, /* nb_inplace_rshift */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1061 0, /* nb_inplace_and */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1062 0, /* nb_inplace_xor */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1063 0, /* nb_inplace_or */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1064 (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
|
1065 (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
|
1066 0, /* nb_inplace_floor_divide */ |
|
f20727cc3d0f
Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents:
18933
diff
changeset
|
1067 0, /* nb_inplace_true_divide */ |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1068 }; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1069 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
1070 PyTypeObject PyComplex_Type = { |
|
42334
e70cdce0e8b2
Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
42013
diff
changeset
|
1071 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1072 "complex", |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5286
diff
changeset
|
1073 sizeof(PyComplexObject), |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1074 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
|
1075 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
|
1076 0, /* tp_print */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1077 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
|
1078 0, /* tp_setattr */ |
|
51271
87fbbf22adf3
Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
50829
diff
changeset
|
1079 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
|
1080 (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
|
1081 &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
|
1082 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
|
1083 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
|
1084 (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
|
1085 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
|
1086 (reprfunc)complex_str, /* tp_str */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1087 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
|
1088 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
|
1089 0, /* tp_as_buffer */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1090 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
|
1091 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
|
1092 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
|
1093 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
|
1094 complex_richcompare, /* tp_richcompare */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1095 0, /* tp_weaklistoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1096 0, /* tp_iter */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1097 0, /* tp_iternext */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1098 complex_methods, /* tp_methods */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1099 complex_members, /* tp_members */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1100 0, /* tp_getset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1101 0, /* tp_base */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1102 0, /* tp_dict */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1103 0, /* tp_descr_get */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1104 0, /* tp_descr_set */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1105 0, /* tp_dictoffset */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1106 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
|
1107 PyType_GenericAlloc, /* tp_alloc */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
17066
diff
changeset
|
1108 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
|
1109 PyObject_Del, /* tp_free */ |
|
3316
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1110 }; |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1111 |
|
e5d1f242daf9
complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1112 #endif |
