Mercurial > cpython-lru_cache-weakref
annotate Objects/complexobject.c @ 58689:514b56efd89a 3.1
Merged revisions 77962 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
r77962 | r.david.murray | 2010-02-04 11:41:57 -0500 (Thu, 04 Feb 2010) | 17 lines
Merged revisions 77943,77959-77960 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77943 | r.david.murray | 2010-02-03 08:36:23 -0500 (Wed, 03 Feb 2010) | 2 lines
Explicitly mention the default value for formatdate's usegmt parameter.
........
r77959 | nick.coghlan | 2010-02-04 07:43:58 -0500 (Thu, 04 Feb 2010) | 1 line
Issue 6760: Clarify args handling for subprocess.Popen. Patch by Chris Rebert
........
r77960 | r.david.murray | 2010-02-04 11:33:31 -0500 (Thu, 04 Feb 2010) | 2 lines
Add Chris Rebert to ACKS for issue 6760 Popen doc improvements.
........
................
| author | R. David Murray <rdmurray@bitdance.com> |
|---|---|
| date | Thu, 04 Feb 2010 16:44:31 +0000 |
| parents | 670fa0c0ff9a |
| children | f197407bdba2 0f9e8d3ecac3 |
| 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 * |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53714
diff
changeset
|
333 complex_format(PyComplexObject *v, int precision, 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, |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53714
diff
changeset
|
353 precision, 0, NULL); |
|
53332
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, |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53714
diff
changeset
|
361 precision, 0, NULL); |
|
53332
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, |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53714
diff
changeset
|
369 precision, Py_DTSF_SIGN, NULL); |
|
53332
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 { |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53714
diff
changeset
|
398 return complex_format(v, 0, '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 { |
|
53787
c6376d3fa968
Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents:
53714
diff
changeset
|
404 return complex_format(v, PyFloat_STR_PRECISION, 'g'); |
|
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, |
|
54147
adbc662ff4c1
Merged revisions 72718 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53787
diff
changeset
|
651 "can't convert complex to int"); |
|
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, |
|
54147
adbc662ff4c1
Merged revisions 72718 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
53787
diff
changeset
|
659 "can't convert complex to float"); |
|
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> */ |
|
54225
670fa0c0ff9a
Issue #5829: complex('1e500') shouldn't raise OverflowError
Mark Dickinson <dickinsm@gmail.com>
parents:
54147
diff
changeset
|
802 z = PyOS_string_to_double(s, &end, NULL); |
|
53707
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; |
|
54225
670fa0c0ff9a
Issue #5829: complex('1e500') shouldn't raise OverflowError
Mark Dickinson <dickinsm@gmail.com>
parents:
54147
diff
changeset
|
815 y = PyOS_string_to_double(s, &end, NULL); |
|
53707
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 |
