annotate Objects/complexobject.c @ 53191:cc5565415ada

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