blob: 60f2c15b77a5ac9d67e6957a8231b117e3599e1b [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 Rossumc0b618a1997-05-02 03:12:38 +00008#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00009#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000010
Guido van Rossum65ce6de2002-06-13 17:07:07 +000011#ifndef WITHOUT_COMPLEX
12
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.)
Tim Petersbab22be2002-03-22 02:48:46 +0000134 errno = EDOM;
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
Christian Heimes6f341092008-04-18 23:13:07 +0000186double
187c_abs(Py_complex z)
188{
189 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
190 double result;
191
192 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
193 /* C99 rules: if either the real or the imaginary part is an
194 infinity, return infinity, even if the other part is a
195 NaN. */
196 if (Py_IS_INFINITY(z.real)) {
197 result = fabs(z.real);
198 errno = 0;
199 return result;
200 }
201 if (Py_IS_INFINITY(z.imag)) {
202 result = fabs(z.imag);
203 errno = 0;
204 return result;
205 }
206 /* either the real or imaginary part is a NaN,
207 and neither is infinite. Result should be NaN. */
208 return Py_NAN;
209 }
210 result = hypot(z.real, z.imag);
211 if (!Py_IS_FINITE(result))
212 errno = ERANGE;
213 else
214 errno = 0;
215 return result;
216}
217
Tim Peters6d6c1a32001-08-02 04:15:00 +0000218static PyObject *
219complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
220{
221 PyObject *op;
222
Georg Brandl6b50c632006-06-01 08:27:32 +0000223 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000224 if (op != NULL)
225 ((PyComplexObject *)op)->cval = cval;
226 return op;
227}
228
Guido van Rossumf9fca921996-01-12 00:47:05 +0000229PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000230PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000231{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000232 register PyComplexObject *op;
233
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000234 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000235 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000236 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000238 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000239 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000241}
242
Tim Peters6d6c1a32001-08-02 04:15:00 +0000243static PyObject *
244complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
245{
246 Py_complex c;
247 c.real = real;
248 c.imag = imag;
249 return complex_subtype_from_c_complex(type, c);
250}
251
Guido van Rossumf9fca921996-01-12 00:47:05 +0000252PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000253PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000254{
255 Py_complex c;
256 c.real = real;
257 c.imag = imag;
258 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000259}
260
261double
Fred Drake4288c802000-07-09 04:36:04 +0000262PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000263{
264 if (PyComplex_Check(op)) {
265 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000266 }
267 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000268 return PyFloat_AsDouble(op);
269 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000270}
271
272double
Fred Drake4288c802000-07-09 04:36:04 +0000273PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000274{
275 if (PyComplex_Check(op)) {
276 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000277 }
278 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000279 return 0.0;
280 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000281}
282
Guido van Rossum9e720e31996-07-21 02:31:35 +0000283Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000284PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000285{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000286 Py_complex cv;
Georg Brandl2b869942007-03-17 16:08:45 +0000287 PyObject *newop = NULL;
288 static PyObject *complex_str = NULL;
289
290 assert(op);
291 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000292 if (PyComplex_Check(op)) {
293 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000294 }
Georg Brandl2b869942007-03-17 16:08:45 +0000295 /* If not, use op's __complex__ method, if it exists */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000296
Georg Brandl2b869942007-03-17 16:08:45 +0000297 /* return -1 on failure */
298 cv.real = -1.;
299 cv.imag = 0.;
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000300
301 if (complex_str == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000302 if (!(complex_str = PyString_InternFromString("__complex__")))
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000303 return cv;
304 }
Georg Brandl2b869942007-03-17 16:08:45 +0000305
306 if (PyInstance_Check(op)) {
307 /* this can go away in python 3000 */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000308 if (PyObject_HasAttr(op, complex_str)) {
Georg Brandl2b869942007-03-17 16:08:45 +0000309 newop = PyObject_CallMethod(op, "__complex__", NULL);
310 if (!newop)
311 return cv;
312 }
313 /* else try __float__ */
314 } else {
315 PyObject *complexfunc;
Georg Brandl2b869942007-03-17 16:08:45 +0000316 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
317 /* complexfunc is a borrowed reference */
318 if (complexfunc) {
319 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
320 if (!newop)
321 return cv;
322 }
323 }
324
325 if (newop) {
326 if (!PyComplex_Check(newop)) {
327 PyErr_SetString(PyExc_TypeError,
328 "__complex__ should return a complex object");
329 Py_DECREF(newop);
330 return cv;
331 }
332 cv = ((PyComplexObject *)newop)->cval;
333 Py_DECREF(newop);
334 return cv;
335 }
336 /* If neither of the above works, interpret op as a float giving the
337 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000338 else {
Georg Brandl2b869942007-03-17 16:08:45 +0000339 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000340 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000341 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000342 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000343}
344
Guido van Rossumf9fca921996-01-12 00:47:05 +0000345static void
Fred Drake4288c802000-07-09 04:36:04 +0000346complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000347{
Guido van Rossum9475a232001-10-05 20:51:39 +0000348 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000349}
350
351
Mark Dickinson95bc9802009-04-24 12:46:53 +0000352static PyObject *
Eric Smitha985a3a2009-05-05 18:26:08 +0000353complex_format(PyComplexObject *v, int precision, char format_code)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000354{
Mark Dickinson95bc9802009-04-24 12:46:53 +0000355 PyObject *result = NULL;
356 Py_ssize_t len;
357
358 /* If these are non-NULL, they'll need to be freed. */
359 char *pre = NULL;
360 char *im = NULL;
361 char *buf = NULL;
362
363 /* These do not need to be freed. re is either an alias
364 for pre or a pointer to a constant. lead and tail
365 are pointers to constants. */
366 char *re = NULL;
367 char *lead = "";
368 char *tail = "";
369
370 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
371 re = "";
372 im = PyOS_double_to_string(v->cval.imag, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000373 precision, 0, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000374 if (!im) {
375 PyErr_NoMemory();
376 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000377 }
Martin v. Löwis737ea822004-06-08 18:52:54 +0000378 } else {
Georg Brandlc404ff22005-09-16 06:42:26 +0000379 /* Format imaginary part with sign, real part without */
Mark Dickinson95bc9802009-04-24 12:46:53 +0000380 pre = PyOS_double_to_string(v->cval.real, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000381 precision, 0, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000382 if (!pre) {
383 PyErr_NoMemory();
384 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000385 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000386 re = pre;
387
388 im = PyOS_double_to_string(v->cval.imag, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000389 precision, Py_DTSF_SIGN, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000390 if (!im) {
391 PyErr_NoMemory();
392 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000393 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000394 lead = "(";
395 tail = ")";
Martin v. Löwis737ea822004-06-08 18:52:54 +0000396 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000397 /* Alloc the final buffer. Add one for the "j" in the format string,
398 and one for the trailing zero. */
399 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
400 buf = PyMem_Malloc(len);
401 if (!buf) {
402 PyErr_NoMemory();
403 goto done;
404 }
405 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
406 result = PyString_FromString(buf);
407 done:
408 PyMem_Free(im);
409 PyMem_Free(pre);
410 PyMem_Free(buf);
411
412 return result;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000413}
414
415static int
Fred Drake4288c802000-07-09 04:36:04 +0000416complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000417{
Mark Dickinson95bc9802009-04-24 12:46:53 +0000418 PyObject *formatv;
419 char *buf;
Eric Smitha985a3a2009-05-05 18:26:08 +0000420 if (flags & Py_PRINT_RAW)
421 formatv = complex_format(v, PyFloat_STR_PRECISION, 'g');
422 else
423 formatv = complex_format(v, 0, 'r');
Mark Dickinson95bc9802009-04-24 12:46:53 +0000424 if (formatv == NULL)
425 return -1;
426 buf = PyString_AS_STRING(formatv);
Brett Cannon01531592007-09-17 03:28:34 +0000427 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000428 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000429 Py_END_ALLOW_THREADS
Mark Dickinson95bc9802009-04-24 12:46:53 +0000430 Py_DECREF(formatv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000431 return 0;
432}
433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000435complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000436{
Eric Smitha985a3a2009-05-05 18:26:08 +0000437 return complex_format(v, 0, 'r');
Tim Peters70695122001-03-11 08:37:29 +0000438}
439
440static PyObject *
441complex_str(PyComplexObject *v)
442{
Eric Smitha985a3a2009-05-05 18:26:08 +0000443 return complex_format(v, PyFloat_STR_PRECISION, 'g');
Guido van Rossumf9fca921996-01-12 00:47:05 +0000444}
445
Guido van Rossumf9fca921996-01-12 00:47:05 +0000446static long
Fred Drake4288c802000-07-09 04:36:04 +0000447complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000448{
Tim Peters39dce292000-08-15 03:34:48 +0000449 long hashreal, hashimag, combined;
450 hashreal = _Py_HashDouble(v->cval.real);
451 if (hashreal == -1)
452 return -1;
453 hashimag = _Py_HashDouble(v->cval.imag);
454 if (hashimag == -1)
455 return -1;
456 /* Note: if the imaginary part is 0, hashimag is 0 now,
457 * so the following returns hashreal unchanged. This is
458 * important because numbers of different types that
459 * compare equal must have the same hash value, so that
460 * hash(x + 0*j) must equal hash(x).
461 */
462 combined = hashreal + 1000003 * hashimag;
463 if (combined == -1)
464 combined = -2;
465 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000466}
467
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000468/* This macro may return! */
469#define TO_COMPLEX(obj, c) \
470 if (PyComplex_Check(obj)) \
471 c = ((PyComplexObject *)(obj))->cval; \
472 else if (to_complex(&(obj), &(c)) < 0) \
473 return (obj)
474
475static int
476to_complex(PyObject **pobj, Py_complex *pc)
477{
478 PyObject *obj = *pobj;
479
480 pc->real = pc->imag = 0.0;
481 if (PyInt_Check(obj)) {
482 pc->real = PyInt_AS_LONG(obj);
483 return 0;
484 }
485 if (PyLong_Check(obj)) {
486 pc->real = PyLong_AsDouble(obj);
487 if (pc->real == -1.0 && PyErr_Occurred()) {
488 *pobj = NULL;
489 return -1;
490 }
491 return 0;
492 }
493 if (PyFloat_Check(obj)) {
494 pc->real = PyFloat_AsDouble(obj);
495 return 0;
496 }
497 Py_INCREF(Py_NotImplemented);
498 *pobj = Py_NotImplemented;
499 return -1;
500}
501
502
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000504complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000505{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000506 Py_complex result;
507 PyFPE_START_PROTECT("complex_add", return 0)
508 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000509 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000511}
512
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000514complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000515{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000516 Py_complex result;
517 PyFPE_START_PROTECT("complex_sub", return 0)
518 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000519 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000520 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000521}
522
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000524complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000525{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000526 Py_complex result;
527 PyFPE_START_PROTECT("complex_mul", return 0)
528 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000529 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000531}
532
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000534complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000535{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000536 Py_complex quot;
Christian Heimes6f341092008-04-18 23:13:07 +0000537
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000538 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000539 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000540 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000541 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000542 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000544 return NULL;
545 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000547}
548
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000550complex_classic_div(PyComplexObject *v, PyComplexObject *w)
551{
552 Py_complex quot;
553
Guido van Rossum1832de42001-09-04 03:51:09 +0000554 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000555 PyErr_Warn(PyExc_DeprecationWarning,
556 "classic complex division") < 0)
557 return NULL;
558
559 PyFPE_START_PROTECT("complex_classic_div", return 0)
560 errno = 0;
561 quot = c_quot(v->cval,w->cval);
562 PyFPE_END_PROTECT(quot)
563 if (errno == EDOM) {
564 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
565 return NULL;
566 }
567 return PyComplex_FromCComplex(quot);
568}
569
570static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000571complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000572{
Georg Brandl96f21842008-01-19 10:18:07 +0000573 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000574
575 if (PyErr_Warn(PyExc_DeprecationWarning,
576 "complex divmod(), // and % are deprecated") < 0)
577 return NULL;
578
Guido van Rossum96783941997-05-20 18:21:34 +0000579 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000580 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000581 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000583 return NULL;
584 }
585 div.real = floor(div.real); /* Use the floor of the real part. */
586 div.imag = 0.0;
587 mod = c_diff(v->cval, c_prod(w->cval, div));
588
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000590}
591
Guido van Rossumee09fc11996-09-11 13:55:55 +0000592
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000594complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000595{
Georg Brandl96f21842008-01-19 10:18:07 +0000596 Py_complex div, mod;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000597 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000598
599 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000600 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000601 return NULL;
602
Guido van Rossum96783941997-05-20 18:21:34 +0000603 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000604 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000605 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000607 return NULL;
608 }
609 div.real = floor(div.real); /* Use the floor of the real part. */
610 div.imag = 0.0;
611 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 d = PyComplex_FromCComplex(div);
613 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000614 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000615 Py_XDECREF(d);
616 Py_XDECREF(m);
617 return z;
618}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620static PyObject *
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000621complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000622{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000623 Py_complex p;
624 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000625 long int_exponent;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000626 Py_complex a, b;
Georg Brandl96f21842008-01-19 10:18:07 +0000627 TO_COMPLEX(v, a);
628 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000629
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000630 if (z!=Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000632 return NULL;
633 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000634 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000635 errno = 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000636 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637 int_exponent = (long)exponent.real;
638 if (exponent.imag == 0. && exponent.real == int_exponent)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000639 p = c_powi(a,int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000640 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000641 p = c_pow(a,exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000642
Guido van Rossum45b83911997-03-14 04:32:50 +0000643 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000644 Py_ADJUST_ERANGE2(p.real, p.imag);
645 if (errno == EDOM) {
646 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000648 return NULL;
649 }
Tim Petersbab22be2002-03-22 02:48:46 +0000650 else if (errno == ERANGE) {
651 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000652 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000653 return NULL;
654 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000656}
657
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000659complex_int_div(PyComplexObject *v, PyComplexObject *w)
660{
661 PyObject *t, *r;
662
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000663 if (PyErr_Warn(PyExc_DeprecationWarning,
664 "complex divmod(), // and % are deprecated") < 0)
665 return NULL;
666
Guido van Rossum4668b002001-08-08 05:00:18 +0000667 t = complex_divmod(v, w);
668 if (t != NULL) {
669 r = PyTuple_GET_ITEM(t, 0);
670 Py_INCREF(r);
671 Py_DECREF(t);
672 return r;
673 }
674 return NULL;
675}
676
677static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000678complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000679{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000680 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000681 neg.real = -v->cval.real;
682 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000684}
685
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000687complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000688{
Tim Peters2400fa42001-09-12 19:12:49 +0000689 if (PyComplex_CheckExact(v)) {
690 Py_INCREF(v);
691 return (PyObject *)v;
692 }
693 else
694 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000695}
696
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000698complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000699{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000700 double result;
Christian Heimes6f341092008-04-18 23:13:07 +0000701
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000702 PyFPE_START_PROTECT("complex_abs", return 0)
Christian Heimes6f341092008-04-18 23:13:07 +0000703 result = c_abs(v->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000704 PyFPE_END_PROTECT(result)
Christian Heimes6f341092008-04-18 23:13:07 +0000705
706 if (errno == ERANGE) {
707 PyErr_SetString(PyExc_OverflowError,
708 "absolute value too large");
709 return NULL;
710 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000712}
713
714static int
Fred Drake4288c802000-07-09 04:36:04 +0000715complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000716{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000717 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000718}
719
720static int
Fred Drake4288c802000-07-09 04:36:04 +0000721complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000722{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000723 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000724 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000725 if (PyInt_Check(*pw)) {
726 cval.real = (double)PyInt_AsLong(*pw);
727 *pw = PyComplex_FromCComplex(cval);
728 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000729 return 0;
730 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 else if (PyLong_Check(*pw)) {
732 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000733 if (cval.real == -1.0 && PyErr_Occurred())
734 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 *pw = PyComplex_FromCComplex(cval);
736 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000737 return 0;
738 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 else if (PyFloat_Check(*pw)) {
740 cval.real = PyFloat_AsDouble(*pw);
741 *pw = PyComplex_FromCComplex(cval);
742 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000743 return 0;
744 }
Guido van Rossum63805962001-09-19 01:13:10 +0000745 else if (PyComplex_Check(*pw)) {
746 Py_INCREF(*pv);
747 Py_INCREF(*pw);
748 return 0;
749 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000750 return 1; /* Can't do it */
751}
752
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000753static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000754complex_richcompare(PyObject *v, PyObject *w, int op)
755{
756 int c;
757 Py_complex i, j;
758 PyObject *res;
759
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000760 c = PyNumber_CoerceEx(&v, &w);
761 if (c < 0)
762 return NULL;
763 if (c > 0) {
764 Py_INCREF(Py_NotImplemented);
765 return Py_NotImplemented;
766 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000767 /* Make sure both arguments are complex. */
768 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000769 Py_DECREF(v);
770 Py_DECREF(w);
771 Py_INCREF(Py_NotImplemented);
772 return Py_NotImplemented;
773 }
774
775 i = ((PyComplexObject *)v)->cval;
776 j = ((PyComplexObject *)w)->cval;
777 Py_DECREF(v);
778 Py_DECREF(w);
779
Guido van Rossum22056422001-09-24 17:52:04 +0000780 if (op != Py_EQ && op != Py_NE) {
781 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000782 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000783 return NULL;
784 }
785
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000786 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
787 res = Py_True;
788 else
789 res = Py_False;
790
791 Py_INCREF(res);
792 return res;
793}
794
795static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000796complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000797{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000798 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000799 "can't convert complex to int");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000800 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000801}
802
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000804complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000805{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000806 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000807 "can't convert complex to long");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000808 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000809}
810
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000811static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000812complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000813{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000815 "can't convert complex to float");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000816 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000817}
818
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000820complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000821{
Guido van Rossum926518b1996-08-19 19:30:45 +0000822 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000824 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000826}
827
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000828PyDoc_STRVAR(complex_conjugate_doc,
829"complex.conjugate() -> complex\n"
830"\n"
831"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
832
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000833static PyObject *
834complex_getnewargs(PyComplexObject *v)
835{
Alexandre Vassalotti80af6da2008-06-04 20:41:44 +0000836 Py_complex c = v->cval;
837 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000838}
839
Eric Smith9139cc62009-04-30 00:58:58 +0000840PyDoc_STRVAR(complex__format__doc,
841"complex.__format__() -> str\n"
842"\n"
843"Converts to a string according to format_spec.");
844
845static PyObject *
846complex__format__(PyObject* self, PyObject* args)
847{
848 PyObject *format_spec;
849
850 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
851 return NULL;
852 if (PyBytes_Check(format_spec))
853 return _PyComplex_FormatAdvanced(self,
854 PyBytes_AS_STRING(format_spec),
855 PyBytes_GET_SIZE(format_spec));
856 if (PyUnicode_Check(format_spec)) {
857 /* Convert format_spec to a str */
858 PyObject *result;
859 PyObject *str_spec = PyObject_Str(format_spec);
860
861 if (str_spec == NULL)
862 return NULL;
863
864 result = _PyComplex_FormatAdvanced(self,
865 PyBytes_AS_STRING(str_spec),
866 PyBytes_GET_SIZE(str_spec));
867
868 Py_DECREF(str_spec);
869 return result;
870 }
871 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
872 return NULL;
873}
874
Christian Heimes6f341092008-04-18 23:13:07 +0000875#if 0
876static PyObject *
877complex_is_finite(PyObject *self)
878{
879 Py_complex c;
880 c = ((PyComplexObject *)self)->cval;
881 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
882 Py_IS_FINITE(c.imag)));
883}
884
885PyDoc_STRVAR(complex_is_finite_doc,
886"complex.is_finite() -> bool\n"
887"\n"
888"Returns True if the real and the imaginary part is finite.");
889#endif
890
Guido van Rossumf9fca921996-01-12 00:47:05 +0000891static PyMethodDef complex_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000892 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
893 complex_conjugate_doc},
Christian Heimes6f341092008-04-18 23:13:07 +0000894#if 0
895 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
896 complex_is_finite_doc},
897#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000898 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Eric Smith9139cc62009-04-30 00:58:58 +0000899 {"__format__", (PyCFunction)complex__format__,
900 METH_VARARGS, complex__format__doc},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000901 {NULL, NULL} /* sentinel */
902};
903
Guido van Rossum6f799372001-09-20 20:46:19 +0000904static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000905 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000906 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000907 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000908 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000909 {0},
910};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000911
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000912static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000913complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000914{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000915 const char *s, *start;
916 char *end;
917 double x=0.0, y=0.0, z;
Mark Dickinson95bc9802009-04-24 12:46:53 +0000918 int got_bracket=0;
Guido van Rossum70e36882001-10-25 18:07:22 +0000919#ifdef Py_USING_UNICODE
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000920 char *s_buffer = NULL;
Guido van Rossum70e36882001-10-25 18:07:22 +0000921#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000922 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000923
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000924 if (PyString_Check(v)) {
925 s = PyString_AS_STRING(v);
926 len = PyString_GET_SIZE(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000927 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000928#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000929 else if (PyUnicode_Check(v)) {
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000930 s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v)+1);
931 if (s_buffer == NULL)
932 return PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000933 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
934 PyUnicode_GET_SIZE(v),
935 s_buffer,
936 NULL))
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000937 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000938 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000939 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000940 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000941#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000942 else if (PyObject_AsCharBuffer(v, &s, &len)) {
943 PyErr_SetString(PyExc_TypeError,
944 "complex() arg is not a string");
945 return NULL;
946 }
947
948 /* position on first nonblank */
949 start = s;
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000950 while (Py_ISSPACE(*s))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +0000952 if (*s == '(') {
Collin Wintere38051d2007-03-09 20:33:07 +0000953 /* Skip over possible bracket from repr(). */
954 got_bracket = 1;
955 s++;
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000956 while (Py_ISSPACE(*s))
Collin Wintere38051d2007-03-09 20:33:07 +0000957 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000958 }
959
Mark Dickinson95bc9802009-04-24 12:46:53 +0000960 /* a valid complex string usually takes one of the three forms:
Tim Peters6d6c1a32001-08-02 04:15:00 +0000961
Mark Dickinson95bc9802009-04-24 12:46:53 +0000962 <float> - real part only
963 <float>j - imaginary part only
964 <float><signed-float>j - real and imaginary parts
Tim Peters6d6c1a32001-08-02 04:15:00 +0000965
Mark Dickinson95bc9802009-04-24 12:46:53 +0000966 where <float> represents any numeric string that's accepted by the
967 float constructor (including 'nan', 'inf', 'infinity', etc.), and
968 <signed-float> is any string of the form <float> whose first
969 character is '+' or '-'.
Tim Peters6d6c1a32001-08-02 04:15:00 +0000970
Mark Dickinson95bc9802009-04-24 12:46:53 +0000971 For backwards compatibility, the extra forms
972
973 <float><sign>j
974 <sign>j
975 j
976
977 are also accepted, though support for these forms may be removed from
978 a future version of Python.
979 */
980
981 /* first look for forms starting with <float> */
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000982 z = PyOS_string_to_double(s, &end, NULL);
983 if (z == -1.0 && PyErr_Occurred()) {
984 if (PyErr_ExceptionMatches(PyExc_ValueError))
985 PyErr_Clear();
986 else
987 goto error;
988 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000989 if (end != s) {
990 /* all 4 forms starting with <float> land here */
991 s = end;
992 if (*s == '+' || *s == '-') {
993 /* <float><signed-float>j | <float><sign>j */
994 x = z;
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000995 y = PyOS_string_to_double(s, &end, NULL);
996 if (y == -1.0 && PyErr_Occurred()) {
997 if (PyErr_ExceptionMatches(PyExc_ValueError))
998 PyErr_Clear();
999 else
1000 goto error;
1001 }
Mark Dickinson95bc9802009-04-24 12:46:53 +00001002 if (end != s)
1003 /* <float><signed-float>j */
1004 s = end;
1005 else {
1006 /* <float><sign>j */
1007 y = *s == '+' ? 1.0 : -1.0;
Collin Wintere38051d2007-03-09 20:33:07 +00001008 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001009 }
1010 if (!(*s == 'j' || *s == 'J'))
1011 goto parse_error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001013 }
1014 else if (*s == 'j' || *s == 'J') {
1015 /* <float>j */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001017 y = z;
1018 }
1019 else
1020 /* <float> */
1021 x = z;
1022 }
1023 else {
1024 /* not starting with <float>; must be <sign>j or j */
1025 if (*s == '+' || *s == '-') {
1026 /* <sign>j */
1027 y = *s == '+' ? 1.0 : -1.0;
1028 s++;
1029 }
1030 else
1031 /* j */
1032 y = 1.0;
1033 if (!(*s == 'j' || *s == 'J'))
1034 goto parse_error;
1035 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036 }
1037
Mark Dickinson95bc9802009-04-24 12:46:53 +00001038 /* trailing whitespace and closing bracket */
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001039 while (Py_ISSPACE(*s))
Mark Dickinson95bc9802009-04-24 12:46:53 +00001040 s++;
1041 if (got_bracket) {
1042 /* if there was an opening parenthesis, then the corresponding
1043 closing parenthesis should be right here */
1044 if (*s != ')')
1045 goto parse_error;
1046 s++;
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001047 while (Py_ISSPACE(*s))
Mark Dickinson95bc9802009-04-24 12:46:53 +00001048 s++;
1049 }
1050
1051 /* we should now be at the end of the string */
1052 if (s-start != len)
1053 goto parse_error;
1054
Mark Dickinsonc04c7c52009-10-26 22:28:14 +00001055
1056#ifdef Py_USING_UNICODE
1057 if (s_buffer)
1058 PyMem_FREE(s_buffer);
1059#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00001060 return complex_subtype_from_doubles(type, x, y);
Mark Dickinson95bc9802009-04-24 12:46:53 +00001061
1062 parse_error:
1063 PyErr_SetString(PyExc_ValueError,
1064 "complex() arg is a malformed string");
Mark Dickinsonc04c7c52009-10-26 22:28:14 +00001065 error:
1066#ifdef Py_USING_UNICODE
1067 if (s_buffer)
1068 PyMem_FREE(s_buffer);
1069#endif
Mark Dickinson95bc9802009-04-24 12:46:53 +00001070 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +00001071}
1072
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073static PyObject *
1074complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1075{
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001076 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001077 PyNumberMethods *nbr, *nbi = NULL;
1078 Py_complex cr, ci;
1079 int own_r = 0;
Guido van Rossum715ec182007-11-27 22:38:36 +00001080 int cr_is_complex = 0;
1081 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001082 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001083 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001084
1085 r = Py_False;
1086 i = NULL;
1087 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
1088 &r, &i))
1089 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001090
Georg Brandl8f032cb2007-03-13 07:57:51 +00001091 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +00001092 if (PyComplex_CheckExact(r) && i == NULL &&
1093 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001094 /* Note that we can't know whether it's safe to return
1095 a complex *subclass* instance as-is, hence the restriction
Georg Brandl8f032cb2007-03-13 07:57:51 +00001096 to exact complexes here. If either the input or the
1097 output is a complex subclass, it will be handled below
1098 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001099 Py_INCREF(r);
1100 return r;
1101 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001102 if (PyString_Check(r) || PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +00001103 if (i != NULL) {
1104 PyErr_SetString(PyExc_TypeError,
1105 "complex() can't take second arg"
1106 " if first is a string");
1107 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +00001108 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001109 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +00001110 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001111 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
Fred Drake526c7a02001-12-13 19:52:22 +00001112 PyErr_SetString(PyExc_TypeError,
1113 "complex() second arg can't be a string");
1114 return NULL;
1115 }
Tim Peters2400fa42001-09-12 19:12:49 +00001116
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001117 if (complexstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001118 complexstr = PyString_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001119 if (complexstr == NULL)
1120 return NULL;
1121 }
Benjamin Petersonecdae192010-01-04 00:43:01 +00001122 if (PyInstance_Check(r)) {
1123 f = PyObject_GetAttr(r, complexstr);
1124 if (f == NULL) {
1125 if (PyErr_ExceptionMatches(PyExc_AttributeError))
1126 PyErr_Clear();
1127 else
1128 return NULL;
1129 }
1130 }
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001131 else {
Benjamin Petersonecdae192010-01-04 00:43:01 +00001132 f = _PyObject_LookupSpecial(r, "__complex__", &complexstr);
1133 if (f == NULL && PyErr_Occurred())
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001134 return NULL;
Benjamin Petersonecdae192010-01-04 00:43:01 +00001135 }
1136 if (f != NULL) {
1137 r = PyObject_CallFunctionObjArgs(f, NULL);
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001138 Py_DECREF(f);
1139 if (r == NULL)
1140 return NULL;
1141 own_r = 1;
1142 }
Tim Peters2400fa42001-09-12 19:12:49 +00001143 nbr = r->ob_type->tp_as_number;
1144 if (i != NULL)
1145 nbi = i->ob_type->tp_as_number;
1146 if (nbr == NULL || nbr->nb_float == NULL ||
1147 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001148 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001149 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +00001150 if (own_r) {
1151 Py_DECREF(r);
1152 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001153 return NULL;
1154 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001155
1156 /* If we get this far, then the "real" and "imag" parts should
1157 both be treated as numbers, and the constructor should return a
1158 complex number equal to (real + imag*1j).
1159
1160 Note that we do NOT assume the input to already be in canonical
1161 form; the "real" and "imag" parts might themselves be complex
1162 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001163 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +00001164 /* Note that if r is of a complex subtype, we're only
1165 retaining its real & imag parts here, and the return
1166 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001167 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001168 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001169 if (own_r) {
1170 Py_DECREF(r);
1171 }
1172 }
1173 else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001174 /* The "real" part really is entirely real, and contributes
1175 nothing in the imaginary direction.
1176 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001177 tmp = PyNumber_Float(r);
1178 if (own_r) {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001179 /* r was a newly created complex number, rather
1180 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181 Py_DECREF(r);
1182 }
1183 if (tmp == NULL)
1184 return NULL;
1185 if (!PyFloat_Check(tmp)) {
1186 PyErr_SetString(PyExc_TypeError,
1187 "float(r) didn't return a float");
1188 Py_DECREF(tmp);
1189 return NULL;
1190 }
1191 cr.real = PyFloat_AsDouble(tmp);
Georg Brandl96f21842008-01-19 10:18:07 +00001192 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001193 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001194 }
1195 if (i == NULL) {
1196 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001197 }
Guido van Rossum715ec182007-11-27 22:38:36 +00001198 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001200 ci_is_complex = 1;
1201 } else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001202 /* The "imag" part really is entirely imaginary, and
1203 contributes nothing in the real direction.
1204 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 tmp = (*nbi->nb_float)(i);
1206 if (tmp == NULL)
1207 return NULL;
1208 ci.real = PyFloat_AsDouble(tmp);
1209 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001210 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001211 /* If the input was in canonical form, then the "real" and "imag"
Guido van Rossum715ec182007-11-27 22:38:36 +00001212 parts are real numbers, so that ci.imag and cr.imag are zero.
Georg Brandl8f032cb2007-03-13 07:57:51 +00001213 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001214
1215 if (ci_is_complex) {
1216 cr.real -= ci.imag;
1217 }
1218 if (cr_is_complex) {
1219 ci.real += cr.imag;
1220 }
1221 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001222}
1223
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001224PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001225"complex(real[, imag]) -> complex number\n"
1226"\n"
1227"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001228"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001229
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001231 (binaryfunc)complex_add, /* nb_add */
1232 (binaryfunc)complex_sub, /* nb_subtract */
1233 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +00001234 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001235 (binaryfunc)complex_remainder, /* nb_remainder */
1236 (binaryfunc)complex_divmod, /* nb_divmod */
1237 (ternaryfunc)complex_pow, /* nb_power */
1238 (unaryfunc)complex_neg, /* nb_negative */
1239 (unaryfunc)complex_pos, /* nb_positive */
1240 (unaryfunc)complex_abs, /* nb_absolute */
1241 (inquiry)complex_nonzero, /* nb_nonzero */
1242 0, /* nb_invert */
1243 0, /* nb_lshift */
1244 0, /* nb_rshift */
1245 0, /* nb_and */
1246 0, /* nb_xor */
1247 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +00001248 complex_coerce, /* nb_coerce */
1249 complex_int, /* nb_int */
1250 complex_long, /* nb_long */
1251 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001252 0, /* nb_oct */
1253 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001254 0, /* nb_inplace_add */
1255 0, /* nb_inplace_subtract */
1256 0, /* nb_inplace_multiply*/
1257 0, /* nb_inplace_divide */
1258 0, /* nb_inplace_remainder */
1259 0, /* nb_inplace_power */
1260 0, /* nb_inplace_lshift */
1261 0, /* nb_inplace_rshift */
1262 0, /* nb_inplace_and */
1263 0, /* nb_inplace_xor */
1264 0, /* nb_inplace_or */
1265 (binaryfunc)complex_int_div, /* nb_floor_divide */
1266 (binaryfunc)complex_div, /* nb_true_divide */
1267 0, /* nb_inplace_floor_divide */
1268 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001269};
1270
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001271PyTypeObject PyComplex_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001272 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001273 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001275 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001276 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001277 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001278 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001279 0, /* tp_setattr */
1280 0, /* tp_compare */
1281 (reprfunc)complex_repr, /* tp_repr */
1282 &complex_as_number, /* tp_as_number */
1283 0, /* tp_as_sequence */
1284 0, /* tp_as_mapping */
1285 (hashfunc)complex_hash, /* tp_hash */
1286 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001287 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001288 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001289 0, /* tp_setattro */
1290 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001291 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1292 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001293 0, /* tp_traverse */
1294 0, /* tp_clear */
1295 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001296 0, /* tp_weaklistoffset */
1297 0, /* tp_iter */
1298 0, /* tp_iternext */
1299 complex_methods, /* tp_methods */
1300 complex_members, /* tp_members */
1301 0, /* tp_getset */
1302 0, /* tp_base */
1303 0, /* tp_dict */
1304 0, /* tp_descr_get */
1305 0, /* tp_descr_set */
1306 0, /* tp_dictoffset */
1307 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001308 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001309 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001310 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001311};
1312
1313#endif