annotate Objects/complexobject.c @ 63009:8635523ef5c6

#9258: fix copy-paste errors.
author Georg Brandl <georg@python.org>
date Wed, 14 Jul 2010 08:00:22 +0000
parents 0bc8ffe6ba9a
children eafe07d40eb7
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
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 /* elementary operations on complex numbers */
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3608
diff changeset
13 static Py_complex c_1 = {1., 0.};
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
15 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
16 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
17 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
18 Py_complex r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
19 r.real = a.real + b.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
20 r.imag = a.imag + b.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
21 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
24 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
25 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
26 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
27 Py_complex r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
28 r.real = a.real - b.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
29 r.imag = a.imag - b.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
30 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
33 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
34 c_neg(Py_complex a)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
36 Py_complex r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
37 r.real = -a.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
38 r.imag = -a.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
39 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
41
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
42 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
43 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
44 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
45 Py_complex r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
46 r.real = a.real*b.real - a.imag*b.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
47 r.imag = a.real*b.imag + a.imag*b.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
48 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
51 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
52 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
53 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
54 /******************************************************************
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
55 This was the original algorithm. It's grossly prone to spurious
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
56 overflow and underflow errors. It also merrily divides by 0 despite
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
57 checking for that(!). The code still serves a doc purpose here, as
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
58 the algorithm following is a simple by-cases transformation of this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
59 one:
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
60
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
61 Py_complex r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
62 double d = b.real*b.real + b.imag*b.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
63 if (d == 0.)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
64 errno = EDOM;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
65 r.real = (a.real*b.real + a.imag*b.imag)/d;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
66 r.imag = (a.imag*b.real - a.real*b.imag)/d;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
67 return r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
68 ******************************************************************/
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
69
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
70 /* This algorithm is better, and is pretty obvious: first divide the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
71 * numerators and denominator by whichever of {b.real, b.imag} has
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
72 * larger magnitude. The earliest reference I found was to CACM
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
73 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
74 * University). As usual, though, we're still ignoring all IEEE
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
75 * endcases.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
76 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
77 Py_complex r; /* the result */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
78 const double abs_breal = b.real < 0 ? -b.real : b.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
79 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
80
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
81 if (abs_breal >= abs_bimag) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
82 /* divide tops and bottom by b.real */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
83 if (abs_breal == 0.0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
84 errno = EDOM;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
85 r.real = r.imag = 0.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
86 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
87 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
88 const double ratio = b.imag / b.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
89 const double denom = b.real + b.imag * ratio;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
90 r.real = (a.real + a.imag * ratio) / denom;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
91 r.imag = (a.imag - a.real * ratio) / denom;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
92 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
93 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
94 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
95 /* divide tops and bottom by b.imag */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
96 const double ratio = b.real / b.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
97 const double denom = b.real * ratio + b.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
98 assert(b.imag != 0.0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
99 r.real = (a.real * ratio + a.imag) / denom;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
100 r.imag = (a.imag * ratio - a.real) / denom;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
101 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
102 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
104
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
105 Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
106 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
107 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
108 Py_complex r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
109 double vabs,len,at,phase;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
110 if (b.real == 0. && b.imag == 0.) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
111 r.real = 1.;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
112 r.imag = 0.;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
113 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
114 else if (a.real == 0. && a.imag == 0.) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
115 if (b.imag != 0. || b.real < 0.)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
116 errno = EDOM;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
117 r.real = 0.;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
118 r.imag = 0.;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
119 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
120 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
121 vabs = hypot(a.real,a.imag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
122 len = pow(vabs,b.real);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
123 at = atan2(a.imag, a.real);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
124 phase = at*b.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
125 if (b.imag != 0.0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
126 len /= exp(at*b.imag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
127 phase += b.imag*log(vabs);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
128 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
129 r.real = len*cos(phase);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
130 r.imag = len*sin(phase);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
131 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
132 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
134
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
135 static Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
136 c_powu(Py_complex x, long n)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
138 Py_complex r, p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
139 long mask = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
140 r = c_1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
141 p = x;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
142 while (mask > 0 && n >= mask) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
143 if (n & mask)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
144 r = c_prod(r,p);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
145 mask <<= 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
146 p = c_prod(p,p);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
147 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
148 return r;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
150
17066
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
151 static Py_complex
2c1be7924b04 SF bug [ #409448 ] Complex division is braindead
Tim Peters <tim.peters@gmail.com>
parents: 17029
diff changeset
152 c_powi(Py_complex x, long n)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
154 Py_complex cn;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
155
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
156 if (n > 100 || n < -100) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
157 cn.real = (double) n;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
158 cn.imag = 0.;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
159 return c_pow(x,cn);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
160 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
161 else if (n > 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
162 return c_powu(x,n);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
163 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
164 return c_quot(c_1,c_powu(x,-n));
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
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
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
168 double
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
169 c_abs(Py_complex z)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
170 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
171 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
172 double result;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
173
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
174 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
175 /* C99 rules: if either the real or the imaginary part is an
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
176 infinity, return infinity, even if the other part is a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
177 NaN. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
178 if (Py_IS_INFINITY(z.real)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
179 result = fabs(z.real);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
180 errno = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
181 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
182 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
183 if (Py_IS_INFINITY(z.imag)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
184 result = fabs(z.imag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
185 errno = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
186 return result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
187 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
188 /* either the real or imaginary part is a NaN,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
189 and neither is infinite. Result should be NaN. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
190 return Py_NAN;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
191 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
192 result = hypot(z.real, z.imag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
193 if (!Py_IS_FINITE(result))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
194 errno = ERANGE;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
195 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
196 errno = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
197 return result;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
198 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
199
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
200 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
201 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
202 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
203 PyObject *op;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
204
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
205 op = type->tp_alloc(type, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
206 if (op != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
207 ((PyComplexObject *)op)->cval = cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
208 return op;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
209 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
210
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
212 PyComplex_FromCComplex(Py_complex cval)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
214 register PyComplexObject *op;
12576
1c7c2dd1beb1 Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents: 11882
diff changeset
215
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
216 /* Inline PyObject_New */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
217 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
218 if (op == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
219 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
220 PyObject_INIT(op, &PyComplex_Type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
221 op->cval = cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
222 return (PyObject *) op;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
224
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
225 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
226 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
227 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
228 Py_complex c;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
229 c.real = real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
230 c.imag = imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
231 return complex_subtype_from_c_complex(type, c);
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
232 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
233
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
235 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
236 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
237 Py_complex c;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
238 c.real = real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
239 c.imag = imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
240 return PyComplex_FromCComplex(c);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
242
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 double
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
244 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
245 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
246 if (PyComplex_Check(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
247 return ((PyComplexObject *)op)->cval.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
248 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
249 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
250 return PyFloat_AsDouble(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
251 }
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
253
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 double
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
255 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
256 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
257 if (PyComplex_Check(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
258 return ((PyComplexObject *)op)->cval.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
259 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
260 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
261 return 0.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
262 }
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
264
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
265 static PyObject *
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
266 try_complex_special_method(PyObject *op) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
267 PyObject *f;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
268 static PyObject *complexstr;
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
269
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
270 f = _PyObject_LookupSpecial(op, "__complex__", &complexstr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
271 if (f) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
272 PyObject *res = PyObject_CallFunctionObjArgs(f, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
273 Py_DECREF(f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
274 return res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
275 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
276 return NULL;
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
277 }
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
278
3771
d0988318b756 complex -> Py_complex
Guido van Rossum <guido@python.org>
parents: 3608
diff changeset
279 Py_complex
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
280 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
281 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
282 Py_complex cv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
283 PyObject *newop = NULL;
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
284
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
285 assert(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
286 /* If op is already of type PyComplex_Type, return its value */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
287 if (PyComplex_Check(op)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
288 return ((PyComplexObject *)op)->cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
289 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
290 /* If not, use op's __complex__ method, if it exists */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
291
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
292 /* return -1 on failure */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
293 cv.real = -1.;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
294 cv.imag = 0.;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
295
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
296 newop = try_complex_special_method(op);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
297
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
298 if (newop) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
299 if (!PyComplex_Check(newop)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
300 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
301 "__complex__ should return a complex object");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
302 Py_DECREF(newop);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
303 return cv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
304 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
305 cv = ((PyComplexObject *)newop)->cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
306 Py_DECREF(newop);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
307 return cv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
308 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
309 else if (PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
310 return cv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
311 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
312 /* If neither of the above works, interpret op as a float giving the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
313 real part of the result, and fill in the imaginary part as 0. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
314 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
315 /* PyFloat_AsDouble will return -1 on failure */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
316 cv.real = PyFloat_AsDouble(op);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
317 return cv;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
318 }
3328
4c655115dfce Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents: 3316
diff changeset
319 }
4c655115dfce Added PyComplex_AsCComplex
Guido van Rossum <guido@python.org>
parents: 3316
diff changeset
320
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 static void
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
322 complex_dealloc(PyObject *op)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
324 op->ob_type->tp_free(op);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
326
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
327
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
328 static PyObject *
53787
c6376d3fa968 Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents: 53714
diff changeset
329 complex_format(PyComplexObject *v, int precision, char format_code)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
331 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
332 Py_ssize_t len;
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
333
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
334 /* If these are non-NULL, they'll need to be freed. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
335 char *pre = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
336 char *im = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
337 char *buf = NULL;
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
338
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
339 /* These do not need to be freed. re is either an alias
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
340 for pre or a pointer to a constant. lead and tail
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
341 are pointers to constants. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
342 char *re = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
343 char *lead = "";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
344 char *tail = "";
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
345
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
346 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
347 re = "";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
348 im = PyOS_double_to_string(v->cval.imag, format_code,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
349 precision, 0, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
350 if (!im) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
351 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
352 goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
353 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
354 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
355 /* Format imaginary part with sign, real part without */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
356 pre = PyOS_double_to_string(v->cval.real, format_code,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
357 precision, 0, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
358 if (!pre) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
359 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
360 goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
361 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
362 re = pre;
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
363
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
364 im = PyOS_double_to_string(v->cval.imag, format_code,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
365 precision, Py_DTSF_SIGN, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
366 if (!im) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
367 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
368 goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
369 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
370 lead = "(";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
371 tail = ")";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
372 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
373 /* Alloc the final buffer. Add one for the "j" in the format string,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
374 and one for the trailing zero. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
375 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
376 buf = PyMem_Malloc(len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
377 if (!buf) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
378 PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
379 goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
380 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
381 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
382 result = PyUnicode_FromString(buf);
53332
330115137414 Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents: 53187
diff changeset
383 done:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
384 PyMem_Free(im);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
385 PyMem_Free(pre);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
386 PyMem_Free(buf);
53187
b653eab13b73 The other half of Issue #1580: use short float repr where possible.
Eric Smith <eric@trueblade.com>
parents: 51271
diff changeset
387
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
388 return result;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
390
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
391 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
392 complex_repr(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 {
53787
c6376d3fa968 Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents: 53714
diff changeset
394 return complex_format(v, 0, 'r');
17029
65a638a24f7e When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents: 15976
diff changeset
395 }
65a638a24f7e When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents: 15976
diff changeset
396
65a638a24f7e When 1.6 boosted the # of digits produced by repr(float), repr(complex)
Tim Peters <tim.peters@gmail.com>
parents: 15976
diff changeset
397 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
398 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
399 {
53787
c6376d3fa968 Issue #5920: Changed format.__float__ and complex.__float__ to use a precision of 12 when using the empty presentation type. This more closely matches str()'s behavior and reduces surprises when adding alignment flags to an empty format string. Patch by Mark Dickinson.
Eric Smith <eric@trueblade.com>
parents: 53714
diff changeset
400 return complex_format(v, PyFloat_STR_PRECISION, 'g');
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
402
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 static long
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
404 complex_hash(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 {
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
406 unsigned long hashreal, hashimag, combined;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
407 hashreal = (unsigned long)_Py_HashDouble(v->cval.real);
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
408 if (hashreal == (unsigned long)-1)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
409 return -1;
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
410 hashimag = (unsigned long)_Py_HashDouble(v->cval.imag);
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
411 if (hashimag == (unsigned long)-1)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
412 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
413 /* Note: if the imaginary part is 0, hashimag is 0 now,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
414 * so the following returns hashreal unchanged. This is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
415 * important because numbers of different types that
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
416 * compare equal must have the same hash value, so that
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
417 * hash(x + 0*j) must equal hash(x).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
418 */
61873
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
419 combined = hashreal + _PyHASH_IMAG * hashimag;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
420 if (combined == (unsigned long)-1)
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
421 combined = (unsigned long)-2;
0bc8ffe6ba9a Issue #8188: Introduce a new scheme for computing hashes of numbers
Mark Dickinson <dickinsm@gmail.com>
parents: 61787
diff changeset
422 return (long)combined;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
424
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
425 /* 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
426 #define TO_COMPLEX(obj, c) \
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
427 if (PyComplex_Check(obj)) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
428 c = ((PyComplexObject *)(obj))->cval; \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
429 else if (to_complex(&(obj), &(c)) < 0) \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
430 return (obj)
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
431
b0cdcbcc5f45 Get rid of most of the flags (in tp_flags) that keep track of various
Guido van Rossum <guido@python.org>
parents: 38669
diff changeset
432 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
433 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
434 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
435 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
436
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
437 pc->real = pc->imag = 0.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
438 if (PyLong_Check(obj)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
439 pc->real = PyLong_AsDouble(obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
440 if (pc->real == -1.0 && PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
441 *pobj = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
442 return -1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
443 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
444 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
445 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
446 if (PyFloat_Check(obj)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
447 pc->real = PyFloat_AsDouble(obj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
448 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
449 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
450 Py_INCREF(Py_NotImplemented);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
451 *pobj = Py_NotImplemented;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
452 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
453 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
454
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
455
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
456 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
457 complex_add(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
459 Py_complex result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
460 Py_complex a, b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
461 TO_COMPLEX(v, a);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
462 TO_COMPLEX(w, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
463 PyFPE_START_PROTECT("complex_add", return 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
464 result = c_sum(a, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
465 PyFPE_END_PROTECT(result)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
466 return PyComplex_FromCComplex(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
468
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
469 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
470 complex_sub(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
472 Py_complex result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
473 Py_complex a, b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
474 TO_COMPLEX(v, a);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
475 TO_COMPLEX(w, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
476 PyFPE_START_PROTECT("complex_sub", return 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
477 result = c_diff(a, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
478 PyFPE_END_PROTECT(result)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
479 return PyComplex_FromCComplex(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
481
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
482 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
483 complex_mul(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
484 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
485 Py_complex result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
486 Py_complex a, b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
487 TO_COMPLEX(v, a);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
488 TO_COMPLEX(w, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
489 PyFPE_START_PROTECT("complex_mul", return 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
490 result = c_prod(a, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
491 PyFPE_END_PROTECT(result)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
492 return PyComplex_FromCComplex(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
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_div(PyObject *v, PyObject *w)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
498 Py_complex quot;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
499 Py_complex a, b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
500 TO_COMPLEX(v, a);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
501 TO_COMPLEX(w, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
502 PyFPE_START_PROTECT("complex_div", return 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
503 errno = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
504 quot = c_quot(a, b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
505 PyFPE_END_PROTECT(quot)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
506 if (errno == EDOM) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
507 PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
508 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
509 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
510 return PyComplex_FromCComplex(quot);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
512
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
513 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
514 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
515 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
516 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
517 "can't mod complex numbers.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
518 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
519 }
cb841f1b022e Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents: 4025
diff changeset
520
cb841f1b022e Don't dump core on complex % or divmod -- raise a TypeError exception.
Guido van Rossum <guido@python.org>
parents: 4025
diff changeset
521
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
522 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
523 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
524 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
525 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
526 "can't take floor or mod of complex number.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
527 return NULL;
4304
95c31931b76a Properly(?) implemented remainder and divmod (Tim Hochberg)
Guido van Rossum <guido@python.org>
parents: 4290
diff changeset
528 }
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
529
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
530 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
531 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
532 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
533 Py_complex p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
534 Py_complex exponent;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
535 long int_exponent;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
536 Py_complex a, b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
537 TO_COMPLEX(v, a);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
538 TO_COMPLEX(w, b);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
539
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
540 if (z != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
541 PyErr_SetString(PyExc_ValueError, "complex modulo");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
542 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
543 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
544 PyFPE_START_PROTECT("complex_pow", return 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
545 errno = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
546 exponent = b;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
547 int_exponent = (long)exponent.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
548 if (exponent.imag == 0. && exponent.real == int_exponent)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
549 p = c_powi(a, int_exponent);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
550 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
551 p = c_pow(a, exponent);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
552
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
553 PyFPE_END_PROTECT(p)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
554 Py_ADJUST_ERANGE2(p.real, p.imag);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
555 if (errno == EDOM) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
556 PyErr_SetString(PyExc_ZeroDivisionError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
557 "0.0 to a negative or complex power");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
558 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
559 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
560 else if (errno == ERANGE) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
561 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
562 "complex exponentiation");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
563 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
564 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
565 return PyComplex_FromCComplex(p);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
567
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
568 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
569 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
570 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
571 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
572 "can't take floor of complex number.");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
573 return NULL;
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
574 }
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
575
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
576 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
577 complex_neg(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
578 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
579 Py_complex neg;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
580 neg.real = -v->cval.real;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
581 neg.imag = -v->cval.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
582 return PyComplex_FromCComplex(neg);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
583 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
584
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
585 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
586 complex_pos(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
588 if (PyComplex_CheckExact(v)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
589 Py_INCREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
590 return (PyObject *)v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
591 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
592 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
593 return PyComplex_FromCComplex(v->cval);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
595
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
596 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
597 complex_abs(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
599 double result;
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
600
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
601 PyFPE_START_PROTECT("complex_abs", return 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
602 result = c_abs(v->cval);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
603 PyFPE_END_PROTECT(result)
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
604
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
605 if (errno == ERANGE) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
606 PyErr_SetString(PyExc_OverflowError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
607 "absolute value too large");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
608 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
609 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
610 return PyFloat_FromDouble(result);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
612
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 static int
40401
88133417dfd0 - patch #1600346 submitted by Tomer Filiba
Jack Diederich <jackdied@gmail.com>
parents: 39607
diff changeset
614 complex_bool(PyComplexObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
616 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
617 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
618
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
619 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
620 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
621 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
622 PyObject *res;
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
623 Py_complex i;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
624 int equal;
15976
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
625
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
626 if (op != Py_EQ && op != Py_NE) {
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
627 goto Unimplemented;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
628 }
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
629
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
630 assert(PyComplex_Check(v));
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
631 TO_COMPLEX(v, i);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
632
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
633 if (PyLong_Check(w)) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
634 /* Check for 0.0 imaginary part first to avoid the rich
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
635 * comparison when possible.
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
636 */
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
637 if (i.imag == 0.0) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
638 PyObject *j, *sub_res;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
639 j = PyFloat_FromDouble(i.real);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
640 if (j == NULL)
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
641 return NULL;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
642
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
643 sub_res = PyObject_RichCompare(j, w, op);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
644 Py_DECREF(j);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
645 return sub_res;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
646 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
647 else {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
648 equal = 0;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
649 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
650 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
651 else if (PyFloat_Check(w)) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
652 equal = (i.real == PyFloat_AsDouble(w) && i.imag == 0.0);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
653 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
654 else if (PyComplex_Check(w)) {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
655 Py_complex j;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
656
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
657 TO_COMPLEX(w, j);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
658 equal = (i.real == j.real && i.imag == j.imag);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
659 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
660 else {
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
661 goto Unimplemented;
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
662 }
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
663
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
664 if (equal == (op == Py_EQ))
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
665 res = Py_True;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
666 else
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
667 res = Py_False;
15976
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
668
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
669 Py_INCREF(res);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
670 return res;
61787
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
671
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
672 Unimplemented:
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
673 Py_INCREF(Py_NotImplemented);
d6016fa58df6 Issue #8748: Fix two issues with comparisons between complex and integer
Mark Dickinson <dickinsm@gmail.com>
parents: 61466
diff changeset
674 return Py_NotImplemented;
15976
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
675 }
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
676
51fc45276a43 Use rich comparisons to fulfill an old wish: complex numbers now raise
Guido van Rossum <guido@python.org>
parents: 14869
diff changeset
677 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
678 complex_int(PyObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
679 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
680 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
681 "can't convert complex to int");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
682 return NULL;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
683 }
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 static PyObject *
13452
ed4f7a22e928 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
686 complex_float(PyObject *v)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
687 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
688 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
689 "can't convert complex to float");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
690 return NULL;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
691 }
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 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
694 complex_conjugate(PyObject *self)
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
695 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
696 Py_complex c;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
697 c = ((PyComplexObject *)self)->cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
698 c.imag = -c.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
699 return PyComplex_FromCComplex(c);
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
700 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
701
42414
8c165d20709f Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
702 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
703 "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
704 "\n"
8c165d20709f Kill div, mod and divmod on complex (already deprecated in 2.x).
Guido van Rossum <guido@python.org>
parents: 42334
diff changeset
705 "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
706
27521
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
707 static PyObject *
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
708 complex_getnewargs(PyComplexObject *v)
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
709 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
710 Py_complex c = v->cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
711 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
712 }
17bfd5dbc0f1 Implement appropriate __getnewargs__ for all immutable subclassable builtin
Guido van Rossum <guido@python.org>
parents: 25064
diff changeset
713
53632
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
714 PyDoc_STRVAR(complex__format__doc,
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
715 "complex.__format__() -> str\n"
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
716 "\n"
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
717 "Converts to a string according to format_spec.");
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
718
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
719 static PyObject *
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
720 complex__format__(PyObject* self, PyObject* args)
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
721 {
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
722 PyObject *format_spec;
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
723
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
724 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
725 return NULL;
53632
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
726 return _PyComplex_FormatAdvanced(self,
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
727 PyUnicode_AS_UNICODE(format_spec),
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
728 PyUnicode_GET_SIZE(format_spec));
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
729 }
2cde0d003ffc Issue #1588: Add complex.__format__.
Eric Smith <eric@trueblade.com>
parents: 53466
diff changeset
730
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
731 #if 0
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
732 static PyObject *
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
733 complex_is_finite(PyObject *self)
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
734 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
735 Py_complex c;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
736 c = ((PyComplexObject *)self)->cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
737 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
738 Py_IS_FINITE(c.imag)));
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
739 }
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
740
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
741 PyDoc_STRVAR(complex_is_finite_doc,
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
742 "complex.is_finite() -> bool\n"
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
743 "\n"
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
744 "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
745 #endif
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
746
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
747 static PyMethodDef complex_methods[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
748 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
749 complex_conjugate_doc},
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
750 #if 0
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
751 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
752 complex_is_finite_doc},
46477
b69f443ef480 Merged revisions 62380,62382-62383 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46161
diff changeset
753 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
754 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
755 {"__format__", (PyCFunction)complex__format__,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
756 METH_VARARGS, complex__format__doc},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
757 {NULL, NULL} /* sentinel */
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 };
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
759
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 19974
diff changeset
760 static PyMemberDef complex_members[] = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
761 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
762 "the real part of a complex number"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
763 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
764 "the imaginary part of a complex number"},
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
765 {0},
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
766 };
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
767
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
768 static PyObject *
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
769 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
770 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
771 const char *s, *start;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
772 char *end;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
773 double x=0.0, y=0.0, z;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
774 int got_bracket=0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
775 char *s_buffer = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
776 Py_ssize_t len;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
777
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
778 if (PyUnicode_Check(v)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
779 s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v) + 1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
780 if (s_buffer == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
781 return PyErr_NoMemory();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
782 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
783 PyUnicode_GET_SIZE(v),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
784 s_buffer,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
785 NULL))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
786 goto error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
787 s = s_buffer;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
788 len = strlen(s);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
789 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
790 else if (PyObject_AsCharBuffer(v, &s, &len)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
791 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
792 "complex() arg is not a string");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
793 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
794 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
795
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
796 /* position on first nonblank */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
797 start = s;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
798 while (Py_ISSPACE(*s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
799 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
800 if (*s == '(') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
801 /* Skip over possible bracket from repr(). */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
802 got_bracket = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
803 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
804 while (Py_ISSPACE(*s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
805 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
806 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
807
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
808 /* a valid complex string usually takes one of the three forms:
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
809
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
810 <float> - real part only
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
811 <float>j - imaginary part only
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
812 <float><signed-float>j - real and imaginary parts
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
813
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
814 where <float> represents any numeric string that's accepted by the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
815 float constructor (including 'nan', 'inf', 'infinity', etc.), and
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
816 <signed-float> is any string of the form <float> whose first
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
817 character is '+' or '-'.
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
818
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
819 For backwards compatibility, the extra forms
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
820
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
821 <float><sign>j
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
822 <sign>j
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
823 j
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
824
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
825 are also accepted, though support for these forms may be removed from
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
826 a future version of Python.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
827 */
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
828
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
829 /* first look for forms starting with <float> */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
830 z = PyOS_string_to_double(s, &end, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
831 if (z == -1.0 && PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
832 if (PyErr_ExceptionMatches(PyExc_ValueError))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
833 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
834 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
835 goto error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
836 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
837 if (end != s) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
838 /* all 4 forms starting with <float> land here */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
839 s = end;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
840 if (*s == '+' || *s == '-') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
841 /* <float><signed-float>j | <float><sign>j */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
842 x = z;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
843 y = PyOS_string_to_double(s, &end, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
844 if (y == -1.0 && PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
845 if (PyErr_ExceptionMatches(PyExc_ValueError))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
846 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
847 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
848 goto error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
849 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
850 if (end != s)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
851 /* <float><signed-float>j */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
852 s = end;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
853 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
854 /* <float><sign>j */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
855 y = *s == '+' ? 1.0 : -1.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
856 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
857 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
858 if (!(*s == 'j' || *s == 'J'))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
859 goto parse_error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
860 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
861 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
862 else if (*s == 'j' || *s == 'J') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
863 /* <float>j */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
864 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
865 y = z;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
866 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
867 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
868 /* <float> */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
869 x = z;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
870 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
871 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
872 /* not starting with <float>; must be <sign>j or j */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
873 if (*s == '+' || *s == '-') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
874 /* <sign>j */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
875 y = *s == '+' ? 1.0 : -1.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
876 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
877 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
878 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
879 /* j */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
880 y = 1.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
881 if (!(*s == 'j' || *s == 'J'))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
882 goto parse_error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
883 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
884 }
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
885
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
886 /* trailing whitespace and closing bracket */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
887 while (Py_ISSPACE(*s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
888 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
889 if (got_bracket) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
890 /* if there was an opening parenthesis, then the corresponding
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
891 closing parenthesis should be right here */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
892 if (*s != ')')
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
893 goto parse_error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
894 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
895 while (Py_ISSPACE(*s))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
896 s++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
897 }
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
898
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
899 /* we should now be at the end of the string */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
900 if (s-start != len)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
901 goto parse_error;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
902
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
903 if (s_buffer)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
904 PyMem_FREE(s_buffer);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
905 return complex_subtype_from_doubles(type, x, y);
53332
330115137414 Issue #5816: Simplify code for parsing and printing of complex numbers.
Mark Dickinson <dickinsm@gmail.com>
parents: 53187
diff changeset
906
53343
06db1d9d255f Make sure that complex parsing code and corresponding tests
Mark Dickinson <dickinsm@gmail.com>
parents: 53332
diff changeset
907 parse_error:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
908 PyErr_SetString(PyExc_ValueError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
909 "complex() arg is a malformed string");
56770
5a8e81594f0f Make sure memory is freed on error in complex_subtype_from_string.
Mark Dickinson <dickinsm@gmail.com>
parents: 56769
diff changeset
910 error:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
911 if (s_buffer)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
912 PyMem_FREE(s_buffer);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
913 return NULL;
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
914 }
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
915
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
916 static PyObject *
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
917 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
918 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
919 PyObject *r, *i, *tmp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
920 PyNumberMethods *nbr, *nbi = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
921 Py_complex cr, ci;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
922 int own_r = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
923 int cr_is_complex = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
924 int ci_is_complex = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
925 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
926
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
927 r = Py_False;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
928 i = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
929 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
930 &r, &i))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
931 return NULL;
25064
81a36d2a2d13 complex() was the only numeric constructor that created a new instance
Raymond Hettinger <python@rcn.com>
parents: 24898
diff changeset
932
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
933 /* Special-case for a single argument when type(arg) is complex. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
934 if (PyComplex_CheckExact(r) && i == NULL &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
935 type == &PyComplex_Type) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
936 /* Note that we can't know whether it's safe to return
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
937 a complex *subclass* instance as-is, hence the restriction
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
938 to exact complexes here. If either the input or the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
939 output is a complex subclass, it will be handled below
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
940 as a non-orthogonal vector. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
941 Py_INCREF(r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
942 return r;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
943 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
944 if (PyUnicode_Check(r)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
945 if (i != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
946 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
947 "complex() can't take second arg"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
948 " if first is a string");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
949 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
950 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
951 return complex_subtype_from_string(type, r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
952 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
953 if (i != NULL && PyUnicode_Check(i)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
954 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
955 "complex() second arg can't be a string");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
956 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
957 }
19889
733314fcfdaa Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents: 19758
diff changeset
958
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
959 tmp = try_complex_special_method(r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
960 if (tmp) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
961 r = tmp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
962 own_r = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
963 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
964 else if (PyErr_Occurred()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
965 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
966 }
58143
6049fe4022ff Merged revisions 77292-77293 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 57487
diff changeset
967
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
968 nbr = r->ob_type->tp_as_number;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
969 if (i != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
970 nbi = i->ob_type->tp_as_number;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
971 if (nbr == NULL || nbr->nb_float == NULL ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
972 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
973 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
974 "complex() argument must be a string or a number");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
975 if (own_r) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
976 Py_DECREF(r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
977 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
978 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
979 }
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
980
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
981 /* If we get this far, then the "real" and "imag" parts should
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
982 both be treated as numbers, and the constructor should return a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
983 complex number equal to (real + imag*1j).
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40626
diff changeset
984
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
985 Note that we do NOT assume the input to already be in canonical
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
986 form; the "real" and "imag" parts might themselves be complex
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
987 numbers, which slightly complicates the code below. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
988 if (PyComplex_Check(r)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
989 /* Note that if r is of a complex subtype, we're only
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
990 retaining its real & imag parts here, and the return
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
991 value is (properly) of the builtin complex type. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
992 cr = ((PyComplexObject*)r)->cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
993 cr_is_complex = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
994 if (own_r) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
995 Py_DECREF(r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
996 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
997 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
998 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
999 /* The "real" part really is entirely real, and contributes
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1000 nothing in the imaginary direction.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1001 Just treat it as a double. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1002 tmp = PyNumber_Float(r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1003 if (own_r) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1004 /* r was a newly created complex number, rather
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1005 than the original "real" argument. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1006 Py_DECREF(r);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1007 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1008 if (tmp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1009 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1010 if (!PyFloat_Check(tmp)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1011 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1012 "float(r) didn't return a float");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1013 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1014 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1015 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1016 cr.real = PyFloat_AsDouble(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1017 cr.imag = 0.0; /* Shut up compiler warning */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1018 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1019 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1020 if (i == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1021 ci.real = 0.0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1022 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1023 else if (PyComplex_Check(i)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1024 ci = ((PyComplexObject*)i)->cval;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1025 ci_is_complex = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1026 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1027 /* The "imag" part really is entirely imaginary, and
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1028 contributes nothing in the real direction.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1029 Just treat it as a double. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1030 tmp = (*nbi->nb_float)(i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1031 if (tmp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1032 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1033 ci.real = PyFloat_AsDouble(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1034 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1035 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1036 /* If the input was in canonical form, then the "real" and "imag"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1037 parts are real numbers, so that ci.imag and cr.imag are zero.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1038 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
1039
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1040 if (ci_is_complex) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1041 cr.real -= ci.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1042 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1043 if (cr_is_complex) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1044 ci.real += cr.imag;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1045 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1046 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
1047 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17066
diff changeset
1048
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23820
diff changeset
1049 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
1050 "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
1051 "\n"
733314fcfdaa Again perhaps the end of [#460020] bug or feature: unicode() and subclasses.
Tim Peters <tim.peters@gmail.com>
parents: 19758
diff changeset
1052 "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
1053 "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
1054
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
1055 static PyNumberMethods complex_as_number = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1056 (binaryfunc)complex_add, /* nb_add */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1057 (binaryfunc)complex_sub, /* nb_subtract */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1058 (binaryfunc)complex_mul, /* nb_multiply */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1059 (binaryfunc)complex_remainder, /* nb_remainder */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1060 (binaryfunc)complex_divmod, /* nb_divmod */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1061 (ternaryfunc)complex_pow, /* nb_power */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1062 (unaryfunc)complex_neg, /* nb_negative */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1063 (unaryfunc)complex_pos, /* nb_positive */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1064 (unaryfunc)complex_abs, /* nb_absolute */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1065 (inquiry)complex_bool, /* nb_bool */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1066 0, /* nb_invert */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1067 0, /* nb_lshift */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1068 0, /* nb_rshift */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1069 0, /* nb_and */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1070 0, /* nb_xor */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1071 0, /* nb_or */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1072 complex_int, /* nb_int */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1073 0, /* nb_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1074 complex_float, /* nb_float */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1075 0, /* nb_inplace_add */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1076 0, /* nb_inplace_subtract */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1077 0, /* nb_inplace_multiply*/
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1078 0, /* nb_inplace_remainder */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1079 0, /* nb_inplace_power */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1080 0, /* nb_inplace_lshift */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1081 0, /* nb_inplace_rshift */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1082 0, /* nb_inplace_and */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1083 0, /* nb_inplace_xor */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1084 0, /* nb_inplace_or */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1085 (binaryfunc)complex_int_div, /* nb_floor_divide */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1086 (binaryfunc)complex_div, /* nb_true_divide */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1087 0, /* nb_inplace_floor_divide */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1088 0, /* nb_inplace_true_divide */
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
1089 };
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5286
diff changeset
1091 PyTypeObject PyComplex_Type = {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1092 PyVarObject_HEAD_INIT(&PyType_Type, 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1093 "complex",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1094 sizeof(PyComplexObject),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1095 0,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1096 complex_dealloc, /* tp_dealloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1097 0, /* tp_print */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1098 0, /* tp_getattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1099 0, /* tp_setattr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1100 0, /* tp_reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1101 (reprfunc)complex_repr, /* tp_repr */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1102 &complex_as_number, /* tp_as_number */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1103 0, /* tp_as_sequence */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1104 0, /* tp_as_mapping */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1105 (hashfunc)complex_hash, /* tp_hash */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1106 0, /* tp_call */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1107 (reprfunc)complex_str, /* tp_str */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1108 PyObject_GenericGetAttr, /* tp_getattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1109 0, /* tp_setattro */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1110 0, /* tp_as_buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1111 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1112 complex_doc, /* tp_doc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1113 0, /* tp_traverse */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1114 0, /* tp_clear */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1115 complex_richcompare, /* tp_richcompare */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1116 0, /* tp_weaklistoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1117 0, /* tp_iter */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1118 0, /* tp_iternext */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1119 complex_methods, /* tp_methods */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1120 complex_members, /* tp_members */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1121 0, /* tp_getset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1122 0, /* tp_base */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1123 0, /* tp_dict */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1124 0, /* tp_descr_get */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1125 0, /* tp_descr_set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1126 0, /* tp_dictoffset */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1127 0, /* tp_init */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1128 PyType_GenericAlloc, /* tp_alloc */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1129 complex_new, /* tp_new */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59563
diff changeset
1130 PyObject_Del, /* tp_free */
3316
e5d1f242daf9 complex numbers a la Konrad Hinsen
Guido van Rossum <guido@python.org>
parents:
diff changeset
1131 };