blob: ee0ede4fc5bd993315e57846bb719db4494aa83c [file] [log] [blame]
Guido van Rossum96783941997-05-20 18:21:34 +00001
Guido van Rossumf9fca921996-01-12 00:47:05 +00002/* Complex object implementation */
3
4/* Borrows heavily from floatobject.c */
5
Guido van Rossum96783941997-05-20 18:21:34 +00006/* Submitted by Jim Hugunin */
7
Guido van Rossumf9fca921996-01-12 00:47:05 +00008#ifndef WITHOUT_COMPLEX
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000011#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000012
Tim Peters70695122001-03-11 08:37:29 +000013/* Precisions used by repr() and str(), respectively.
14
15 The repr() precision (17 significant decimal digits) is the minimal number
16 that is guaranteed to have enough precision so that if the number is read
17 back in the exact same binary value is recreated. This is true for IEEE
18 floating point by design, and also happens to work for all other modern
19 hardware.
20
21 The str() precision is chosen so that in most cases, the rounding noise
22 created by various operations is suppressed, while giving plenty of
23 precision for practical use.
24*/
25
26#define PREC_REPR 17
27#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000028
29/* elementary operations on complex numbers */
30
Guido van Rossum9e720e31996-07-21 02:31:35 +000031static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
Tim Peters0f336042001-03-18 08:21:57 +000033Py_complex
34c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000035{
Guido van Rossum9e720e31996-07-21 02:31:35 +000036 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000037 r.real = a.real + b.real;
38 r.imag = a.imag + b.imag;
39 return r;
40}
41
Tim Peters0f336042001-03-18 08:21:57 +000042Py_complex
43c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000044{
Guido van Rossum9e720e31996-07-21 02:31:35 +000045 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000046 r.real = a.real - b.real;
47 r.imag = a.imag - b.imag;
48 return r;
49}
50
Tim Peters0f336042001-03-18 08:21:57 +000051Py_complex
52c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000053{
Guido van Rossum9e720e31996-07-21 02:31:35 +000054 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000055 r.real = -a.real;
56 r.imag = -a.imag;
57 return r;
58}
59
Tim Peters0f336042001-03-18 08:21:57 +000060Py_complex
61c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000062{
Guido van Rossum9e720e31996-07-21 02:31:35 +000063 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000064 r.real = a.real*b.real - a.imag*b.imag;
65 r.imag = a.real*b.imag + a.imag*b.real;
66 return r;
67}
68
Tim Peters0f336042001-03-18 08:21:57 +000069Py_complex
70c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000071{
Tim Peters0f336042001-03-18 08:21:57 +000072 /******************************************************************
73 This was the original algorithm. It's grossly prone to spurious
74 overflow and underflow errors. It also merrily divides by 0 despite
75 checking for that(!). The code still serves a doc purpose here, as
76 the algorithm following is a simple by-cases transformation of this
77 one:
78
Guido van Rossum9e720e31996-07-21 02:31:35 +000079 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000080 double d = b.real*b.real + b.imag*b.imag;
81 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000082 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000083 r.real = (a.real*b.real + a.imag*b.imag)/d;
84 r.imag = (a.imag*b.real - a.real*b.imag)/d;
85 return r;
Tim Peters0f336042001-03-18 08:21:57 +000086 ******************************************************************/
87
88 /* This algorithm is better, and is pretty obvious: first divide the
89 * numerators and denominator by whichever of {b.real, b.imag} has
90 * larger magnitude. The earliest reference I found was to CACM
91 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
92 * University). As usual, though, we're still ignoring all IEEE
93 * endcases.
94 */
95 Py_complex r; /* the result */
96 const double abs_breal = b.real < 0 ? -b.real : b.real;
97 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
98
99 if (abs_breal >= abs_bimag) {
100 /* divide tops and bottom by b.real */
101 if (abs_breal == 0.0) {
102 errno = EDOM;
103 r.real = r.imag = 0.0;
104 }
105 else {
106 const double ratio = b.imag / b.real;
107 const double denom = b.real + b.imag * ratio;
108 r.real = (a.real + a.imag * ratio) / denom;
109 r.imag = (a.imag - a.real * ratio) / denom;
110 }
111 }
112 else {
113 /* divide tops and bottom by b.imag */
114 const double ratio = b.real / b.imag;
115 const double denom = b.real * ratio + b.imag;
116 assert(b.imag != 0.0);
117 r.real = (a.real * ratio + a.imag) / denom;
118 r.imag = (a.imag * ratio - a.real) / denom;
119 }
120 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000121}
122
Tim Peters0f336042001-03-18 08:21:57 +0000123Py_complex
124c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000126 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000127 double vabs,len,at,phase;
128 if (b.real == 0. && b.imag == 0.) {
129 r.real = 1.;
130 r.imag = 0.;
131 }
132 else if (a.real == 0. && a.imag == 0.) {
133 if (b.imag != 0. || b.real < 0.)
Guido van Rossum96783941997-05-20 18:21:34 +0000134 errno = ERANGE;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000135 r.real = 0.;
136 r.imag = 0.;
137 }
138 else {
139 vabs = hypot(a.real,a.imag);
140 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000141 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000142 phase = at*b.real;
143 if (b.imag != 0.0) {
144 len /= exp(at*b.imag);
145 phase += b.imag*log(vabs);
146 }
147 r.real = len*cos(phase);
148 r.imag = len*sin(phase);
149 }
150 return r;
151}
152
Tim Peters0f336042001-03-18 08:21:57 +0000153static Py_complex
154c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155{
Guido van Rossum926518b1996-08-19 19:30:45 +0000156 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000157 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000158 r = c_1;
159 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000160 while (mask > 0 && n >= mask) {
161 if (n & mask)
162 r = c_prod(r,p);
163 mask <<= 1;
164 p = c_prod(p,p);
165 }
166 return r;
167}
168
Tim Peters0f336042001-03-18 08:21:57 +0000169static Py_complex
170c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000171{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000172 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000173
174 if (n > 100 || n < -100) {
175 cn.real = (double) n;
176 cn.imag = 0.;
177 return c_pow(x,cn);
178 }
179 else if (n > 0)
180 return c_powu(x,n);
181 else
182 return c_quot(c_1,c_powu(x,-n));
183
184}
185
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186static PyObject *
187complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
188{
189 PyObject *op;
190
191 op = PyType_GenericAlloc(type, 0);
192 if (op != NULL)
193 ((PyComplexObject *)op)->cval = cval;
194 return op;
195}
196
Guido van Rossumf9fca921996-01-12 00:47:05 +0000197PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000198PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000199{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000200 register PyComplexObject *op;
201
202 /* PyObject_New is inlined */
203 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000204 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000206 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000207 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000209}
210
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211static PyObject *
212complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
213{
214 Py_complex c;
215 c.real = real;
216 c.imag = imag;
217 return complex_subtype_from_c_complex(type, c);
218}
219
Guido van Rossumf9fca921996-01-12 00:47:05 +0000220PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000221PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000222{
223 Py_complex c;
224 c.real = real;
225 c.imag = imag;
226 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000227}
228
229double
Fred Drake4288c802000-07-09 04:36:04 +0000230PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000231{
232 if (PyComplex_Check(op)) {
233 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000234 }
235 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000236 return PyFloat_AsDouble(op);
237 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000238}
239
240double
Fred Drake4288c802000-07-09 04:36:04 +0000241PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000242{
243 if (PyComplex_Check(op)) {
244 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000245 }
246 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000247 return 0.0;
248 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000249}
250
Guido van Rossum9e720e31996-07-21 02:31:35 +0000251Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000252PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000253{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000254 Py_complex cv;
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000255 if (PyComplex_Check(op)) {
256 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000257 }
258 else {
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000259 cv.real = PyFloat_AsDouble(op);
260 cv.imag = 0.;
261 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000262 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000263}
264
Guido van Rossumf9fca921996-01-12 00:47:05 +0000265static void
Fred Drake4288c802000-07-09 04:36:04 +0000266complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000267{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000268 PyObject_DEL(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000269}
270
271
Guido van Rossum363078a1996-05-24 20:45:01 +0000272static void
Tim Peters70695122001-03-11 08:37:29 +0000273complex_to_buf(char *buf, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274{
275 if (v->cval.real == 0.)
Tim Peters70695122001-03-11 08:37:29 +0000276 sprintf(buf, "%.*gj", precision, v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000277 else
Tim Peters70695122001-03-11 08:37:29 +0000278 sprintf(buf, "(%.*g%+.*gj)", precision, v->cval.real,
279 precision, v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000280}
281
282static int
Fred Drake4288c802000-07-09 04:36:04 +0000283complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000284{
285 char buf[100];
Tim Peters70695122001-03-11 08:37:29 +0000286 complex_to_buf(buf, v,
287 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000288 fputs(buf, fp);
289 return 0;
290}
291
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000293complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000294{
295 char buf[100];
Tim Peters70695122001-03-11 08:37:29 +0000296 complex_to_buf(buf, v, PREC_REPR);
297 return PyString_FromString(buf);
298}
299
300static PyObject *
301complex_str(PyComplexObject *v)
302{
303 char buf[100];
304 complex_to_buf(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000306}
307
Guido van Rossumf9fca921996-01-12 00:47:05 +0000308static long
Fred Drake4288c802000-07-09 04:36:04 +0000309complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000310{
Tim Peters39dce292000-08-15 03:34:48 +0000311 long hashreal, hashimag, combined;
312 hashreal = _Py_HashDouble(v->cval.real);
313 if (hashreal == -1)
314 return -1;
315 hashimag = _Py_HashDouble(v->cval.imag);
316 if (hashimag == -1)
317 return -1;
318 /* Note: if the imaginary part is 0, hashimag is 0 now,
319 * so the following returns hashreal unchanged. This is
320 * important because numbers of different types that
321 * compare equal must have the same hash value, so that
322 * hash(x + 0*j) must equal hash(x).
323 */
324 combined = hashreal + 1000003 * hashimag;
325 if (combined == -1)
326 combined = -2;
327 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000328}
329
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000331complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000332{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000333 Py_complex result;
334 PyFPE_START_PROTECT("complex_add", return 0)
335 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000336 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000338}
339
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000341complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000342{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000343 Py_complex result;
344 PyFPE_START_PROTECT("complex_sub", return 0)
345 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000346 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000348}
349
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000351complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000352{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000353 Py_complex result;
354 PyFPE_START_PROTECT("complex_mul", return 0)
355 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000356 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000358}
359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000361complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000362{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000363 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000364 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000365 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000367 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000368 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000370 return NULL;
371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000376complex_classic_div(PyComplexObject *v, PyComplexObject *w)
377{
378 Py_complex quot;
379
Guido van Rossum1832de42001-09-04 03:51:09 +0000380 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000381 PyErr_Warn(PyExc_DeprecationWarning,
382 "classic complex division") < 0)
383 return NULL;
384
385 PyFPE_START_PROTECT("complex_classic_div", return 0)
386 errno = 0;
387 quot = c_quot(v->cval,w->cval);
388 PyFPE_END_PROTECT(quot)
389 if (errno == EDOM) {
390 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
391 return NULL;
392 }
393 return PyComplex_FromCComplex(quot);
394}
395
396static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000397complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000398{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000399 Py_complex div, mod;
Guido van Rossum96783941997-05-20 18:21:34 +0000400 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000401 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000402 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000404 return NULL;
405 }
406 div.real = floor(div.real); /* Use the floor of the real part. */
407 div.imag = 0.0;
408 mod = c_diff(v->cval, c_prod(w->cval, div));
409
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000411}
412
Guido van Rossumee09fc11996-09-11 13:55:55 +0000413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000415complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000416{
417 Py_complex div, mod;
418 PyObject *d, *m, *z;
Guido van Rossum96783941997-05-20 18:21:34 +0000419 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000420 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000421 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000423 return NULL;
424 }
425 div.real = floor(div.real); /* Use the floor of the real part. */
426 div.imag = 0.0;
427 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 d = PyComplex_FromCComplex(div);
429 m = PyComplex_FromCComplex(mod);
430 z = Py_BuildValue("(OO)", d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000431 Py_XDECREF(d);
432 Py_XDECREF(m);
433 return z;
434}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000435
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000437complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000438{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000439 Py_complex p;
440 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000441 long int_exponent;
442
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 if ((PyObject *)z!=Py_None) {
444 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000445 return NULL;
446 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000447 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000448 errno = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 exponent = ((PyComplexObject*)w)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000450 int_exponent = (long)exponent.real;
451 if (exponent.imag == 0. && exponent.real == int_exponent)
452 p = c_powi(v->cval,int_exponent);
453 else
454 p = c_pow(v->cval,exponent);
455
Guido van Rossum45b83911997-03-14 04:32:50 +0000456 PyFPE_END_PROTECT(p)
Guido van Rossum96783941997-05-20 18:21:34 +0000457 if (errno == ERANGE) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 PyErr_SetString(PyExc_ValueError,
459 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000460 return NULL;
461 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000463}
464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000466complex_int_div(PyComplexObject *v, PyComplexObject *w)
467{
468 PyObject *t, *r;
469
470 t = complex_divmod(v, w);
471 if (t != NULL) {
472 r = PyTuple_GET_ITEM(t, 0);
473 Py_INCREF(r);
474 Py_DECREF(t);
475 return r;
476 }
477 return NULL;
478}
479
480static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000481complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000482{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000483 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000484 neg.real = -v->cval.real;
485 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000487}
488
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000490complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000491{
Tim Peters2400fa42001-09-12 19:12:49 +0000492 if (PyComplex_CheckExact(v)) {
493 Py_INCREF(v);
494 return (PyObject *)v;
495 }
496 else
497 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000498}
499
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000501complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000502{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000503 double result;
504 PyFPE_START_PROTECT("complex_abs", return 0)
505 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000506 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000508}
509
510static int
Fred Drake4288c802000-07-09 04:36:04 +0000511complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000512{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000513 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000514}
515
516static int
Fred Drake4288c802000-07-09 04:36:04 +0000517complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000518{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000519 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000520 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 if (PyInt_Check(*pw)) {
522 cval.real = (double)PyInt_AsLong(*pw);
523 *pw = PyComplex_FromCComplex(cval);
524 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000525 return 0;
526 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 else if (PyLong_Check(*pw)) {
528 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000529 if (cval.real == -1.0 && PyErr_Occurred())
530 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 *pw = PyComplex_FromCComplex(cval);
532 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000533 return 0;
534 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 else if (PyFloat_Check(*pw)) {
536 cval.real = PyFloat_AsDouble(*pw);
537 *pw = PyComplex_FromCComplex(cval);
538 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539 return 0;
540 }
Guido van Rossum63805962001-09-19 01:13:10 +0000541 else if (PyComplex_Check(*pw)) {
542 Py_INCREF(*pv);
543 Py_INCREF(*pw);
544 return 0;
545 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000546 return 1; /* Can't do it */
547}
548
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000550complex_richcompare(PyObject *v, PyObject *w, int op)
551{
552 int c;
553 Py_complex i, j;
554 PyObject *res;
555
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000556 c = PyNumber_CoerceEx(&v, &w);
557 if (c < 0)
558 return NULL;
559 if (c > 0) {
560 Py_INCREF(Py_NotImplemented);
561 return Py_NotImplemented;
562 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000563 /* Make sure both arguments are complex. */
564 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000565 Py_DECREF(v);
566 Py_DECREF(w);
567 Py_INCREF(Py_NotImplemented);
568 return Py_NotImplemented;
569 }
570
571 i = ((PyComplexObject *)v)->cval;
572 j = ((PyComplexObject *)w)->cval;
573 Py_DECREF(v);
574 Py_DECREF(w);
575
Guido van Rossum22056422001-09-24 17:52:04 +0000576 if (op != Py_EQ && op != Py_NE) {
577 PyErr_SetString(PyExc_TypeError,
578 "cannot compare complex numbers using <, <=, >, >=");
579 return NULL;
580 }
581
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000582 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
583 res = Py_True;
584 else
585 res = Py_False;
586
587 Py_INCREF(res);
588 return res;
589}
590
591static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000592complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000593{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000595 "can't convert complex to int; use e.g. int(abs(z))");
596 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000597}
598
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000600complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000601{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000603 "can't convert complex to long; use e.g. long(abs(z))");
604 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000605}
606
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000608complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000609{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000611 "can't convert complex to float; use e.g. abs(z)");
612 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000613}
614
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000616complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000617{
Guido van Rossum926518b1996-08-19 19:30:45 +0000618 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000620 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000622}
623
624static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000625 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000626 {NULL, NULL} /* sentinel */
627};
628
Guido van Rossum6f799372001-09-20 20:46:19 +0000629static PyMemberDef complex_members[] = {
630 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), 0,
631 "the real part of a complex number"},
632 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), 0,
633 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000634 {0},
635};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000636
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000638complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000639{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000640 extern double strtod(const char *, char **);
641 const char *s, *start;
642 char *end;
643 double x=0.0, y=0.0, z;
644 int got_re=0, got_im=0, done=0;
645 int digit_or_dot;
646 int sw_error=0;
647 int sign;
648 char buffer[256]; /* For errors */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000649 int len;
650
651 if (PyString_Check(v)) {
652 s = PyString_AS_STRING(v);
653 len = PyString_GET_SIZE(v);
654 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000655#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656 else if (PyUnicode_Check(v)) {
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000657 char s_buffer[256];
Tim Peters6d6c1a32001-08-02 04:15:00 +0000658 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
659 PyErr_SetString(PyExc_ValueError,
660 "complex() literal too large to convert");
661 return NULL;
662 }
663 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
664 PyUnicode_GET_SIZE(v),
665 s_buffer,
666 NULL))
667 return NULL;
668 s = s_buffer;
669 len = (int)strlen(s);
670 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000671#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000672 else if (PyObject_AsCharBuffer(v, &s, &len)) {
673 PyErr_SetString(PyExc_TypeError,
674 "complex() arg is not a string");
675 return NULL;
676 }
677
678 /* position on first nonblank */
679 start = s;
680 while (*s && isspace(Py_CHARMASK(*s)))
681 s++;
682 if (s[0] == '\0') {
683 PyErr_SetString(PyExc_ValueError,
684 "complex() arg is an empty string");
685 return NULL;
686 }
687
688 z = -1.0;
689 sign = 1;
690 do {
691
692 switch (*s) {
693
694 case '\0':
695 if (s-start != len) {
696 PyErr_SetString(
697 PyExc_ValueError,
698 "complex() arg contains a null byte");
699 return NULL;
700 }
701 if(!done) sw_error=1;
702 break;
703
704 case '-':
705 sign = -1;
706 /* Fallthrough */
707 case '+':
708 if (done) sw_error=1;
709 s++;
710 if ( *s=='\0'||*s=='+'||*s=='-' ||
711 isspace(Py_CHARMASK(*s)) ) sw_error=1;
712 break;
713
714 case 'J':
715 case 'j':
716 if (got_im || done) {
717 sw_error = 1;
718 break;
719 }
720 if (z<0.0) {
721 y=sign;
722 }
723 else{
724 y=sign*z;
725 }
726 got_im=1;
727 s++;
728 if (*s!='+' && *s!='-' )
729 done=1;
730 break;
731
732 default:
733 if (isspace(Py_CHARMASK(*s))) {
734 while (*s && isspace(Py_CHARMASK(*s)))
735 s++;
736 if (s[0] != '\0')
737 sw_error=1;
738 else
739 done = 1;
740 break;
741 }
742 digit_or_dot =
743 (*s=='.' || isdigit(Py_CHARMASK(*s)));
744 if (done||!digit_or_dot) {
745 sw_error=1;
746 break;
747 }
748 errno = 0;
749 PyFPE_START_PROTECT("strtod", return 0)
750 z = strtod(s, &end) ;
751 PyFPE_END_PROTECT(z)
752 if (errno != 0) {
753 sprintf(buffer,
754 "float() out of range: %.150s", s);
755 PyErr_SetString(
756 PyExc_ValueError,
757 buffer);
758 return NULL;
759 }
760 s=end;
761 if (*s=='J' || *s=='j') {
762
763 break;
764 }
765 if (got_re) {
766 sw_error=1;
767 break;
768 }
769
770 /* accept a real part */
771 x=sign*z;
772 got_re=1;
773 if (got_im) done=1;
774 z = -1.0;
775 sign = 1;
776 break;
777
778 } /* end of switch */
779
780 } while (*s!='\0' && !sw_error);
781
782 if (sw_error) {
783 PyErr_SetString(PyExc_ValueError,
784 "complex() arg is a malformed string");
785 return NULL;
786 }
787
788 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000789}
790
Tim Peters6d6c1a32001-08-02 04:15:00 +0000791static PyObject *
792complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
793{
794 PyObject *r, *i, *tmp;
795 PyNumberMethods *nbr, *nbi = NULL;
796 Py_complex cr, ci;
797 int own_r = 0;
798 static char *kwlist[] = {"real", "imag", 0};
799
800 r = Py_False;
801 i = NULL;
802 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
803 &r, &i))
804 return NULL;
805 if (PyString_Check(r) || PyUnicode_Check(r))
806 return complex_subtype_from_string(type, r);
Tim Peters2400fa42001-09-12 19:12:49 +0000807
808 nbr = r->ob_type->tp_as_number;
809 if (i != NULL)
810 nbi = i->ob_type->tp_as_number;
811 if (nbr == NULL || nbr->nb_float == NULL ||
812 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813 PyErr_SetString(PyExc_TypeError,
814 "complex() arg can't be converted to complex");
815 return NULL;
816 }
817 /* XXX Hack to support classes with __complex__ method */
818 if (PyInstance_Check(r)) {
819 static PyObject *complexstr;
820 PyObject *f;
821 if (complexstr == NULL) {
822 complexstr = PyString_InternFromString("__complex__");
823 if (complexstr == NULL)
824 return NULL;
825 }
826 f = PyObject_GetAttr(r, complexstr);
827 if (f == NULL)
828 PyErr_Clear();
829 else {
830 PyObject *args = Py_BuildValue("()");
831 if (args == NULL)
832 return NULL;
833 r = PyEval_CallObject(f, args);
834 Py_DECREF(args);
835 Py_DECREF(f);
836 if (r == NULL)
837 return NULL;
838 own_r = 1;
839 }
840 }
841 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000842 /* Note that if r is of a complex subtype, we're only
843 retaining its real & imag parts here, and the return
844 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000845 cr = ((PyComplexObject*)r)->cval;
846 if (own_r) {
847 Py_DECREF(r);
848 }
849 }
850 else {
851 tmp = PyNumber_Float(r);
852 if (own_r) {
853 Py_DECREF(r);
854 }
855 if (tmp == NULL)
856 return NULL;
857 if (!PyFloat_Check(tmp)) {
858 PyErr_SetString(PyExc_TypeError,
859 "float(r) didn't return a float");
860 Py_DECREF(tmp);
861 return NULL;
862 }
863 cr.real = PyFloat_AsDouble(tmp);
864 Py_DECREF(tmp);
865 cr.imag = 0.0;
866 }
867 if (i == NULL) {
868 ci.real = 0.0;
869 ci.imag = 0.0;
870 }
871 else if (PyComplex_Check(i))
872 ci = ((PyComplexObject*)i)->cval;
873 else {
874 tmp = (*nbi->nb_float)(i);
875 if (tmp == NULL)
876 return NULL;
877 ci.real = PyFloat_AsDouble(tmp);
878 Py_DECREF(tmp);
879 ci.imag = 0.;
880 }
881 cr.real -= ci.imag;
882 cr.imag += ci.real;
883 return complex_subtype_from_c_complex(type, cr);
884}
885
886static char complex_doc[] =
Tim Peters2400fa42001-09-12 19:12:49 +0000887"complex(real[, imag]) -> complex number\n"
888"\n"
889"Create a complex number from a real part and an optional imaginary part.\n"
890"This is equivalent to (real + imag*1j) where imag defaults to 0.";
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000892static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000893 (binaryfunc)complex_add, /* nb_add */
894 (binaryfunc)complex_sub, /* nb_subtract */
895 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +0000896 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000897 (binaryfunc)complex_remainder, /* nb_remainder */
898 (binaryfunc)complex_divmod, /* nb_divmod */
899 (ternaryfunc)complex_pow, /* nb_power */
900 (unaryfunc)complex_neg, /* nb_negative */
901 (unaryfunc)complex_pos, /* nb_positive */
902 (unaryfunc)complex_abs, /* nb_absolute */
903 (inquiry)complex_nonzero, /* nb_nonzero */
904 0, /* nb_invert */
905 0, /* nb_lshift */
906 0, /* nb_rshift */
907 0, /* nb_and */
908 0, /* nb_xor */
909 0, /* nb_or */
910 (coercion)complex_coerce, /* nb_coerce */
911 (unaryfunc)complex_int, /* nb_int */
912 (unaryfunc)complex_long, /* nb_long */
913 (unaryfunc)complex_float, /* nb_float */
914 0, /* nb_oct */
915 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000916 0, /* nb_inplace_add */
917 0, /* nb_inplace_subtract */
918 0, /* nb_inplace_multiply*/
919 0, /* nb_inplace_divide */
920 0, /* nb_inplace_remainder */
921 0, /* nb_inplace_power */
922 0, /* nb_inplace_lshift */
923 0, /* nb_inplace_rshift */
924 0, /* nb_inplace_and */
925 0, /* nb_inplace_xor */
926 0, /* nb_inplace_or */
927 (binaryfunc)complex_int_div, /* nb_floor_divide */
928 (binaryfunc)complex_div, /* nb_true_divide */
929 0, /* nb_inplace_floor_divide */
930 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000931};
932
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933PyTypeObject PyComplex_Type = {
934 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000935 0,
936 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000938 0,
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000939 (destructor)complex_dealloc, /* tp_dealloc */
940 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000941 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000942 0, /* tp_setattr */
943 0, /* tp_compare */
944 (reprfunc)complex_repr, /* tp_repr */
945 &complex_as_number, /* tp_as_number */
946 0, /* tp_as_sequence */
947 0, /* tp_as_mapping */
948 (hashfunc)complex_hash, /* tp_hash */
949 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +0000950 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000952 0, /* tp_setattro */
953 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000954 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
955 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000956 0, /* tp_traverse */
957 0, /* tp_clear */
958 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000959 0, /* tp_weaklistoffset */
960 0, /* tp_iter */
961 0, /* tp_iternext */
962 complex_methods, /* tp_methods */
963 complex_members, /* tp_members */
964 0, /* tp_getset */
965 0, /* tp_base */
966 0, /* tp_dict */
967 0, /* tp_descr_get */
968 0, /* tp_descr_set */
969 0, /* tp_dictoffset */
970 0, /* tp_init */
971 0, /* tp_alloc */
972 complex_new, /* tp_new */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000973};
974
975#endif