blob: da2075a386f8bd020e2776845d828c070c303f62 [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
Benjamin Peterson36943662010-01-04 01:00:47 +0000283static PyObject *
284try_complex_special_method(PyObject *op) {
285 PyObject *f;
286 static PyObject *complexstr;
287
288 if (complexstr == NULL) {
289 complexstr = PyString_InternFromString("__complex__");
290 if (complexstr == NULL)
291 return NULL;
292 }
293 if (PyInstance_Check(op)) {
294 f = PyObject_GetAttr(op, complexstr);
295 if (f == NULL) {
296 if (PyErr_ExceptionMatches(PyExc_AttributeError))
297 PyErr_Clear();
298 else
299 return NULL;
300 }
301 }
302 else {
303 f = _PyObject_LookupSpecial(op, "__complex__", &complexstr);
304 if (f == NULL && PyErr_Occurred())
305 return NULL;
306 }
307 if (f != NULL) {
308 PyObject *res = PyObject_CallFunctionObjArgs(f, NULL);
309 Py_DECREF(f);
310 return res;
311 }
312 return NULL;
313}
314
Guido van Rossum9e720e31996-07-21 02:31:35 +0000315Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000316PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000317{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000318 Py_complex cv;
Georg Brandl2b869942007-03-17 16:08:45 +0000319 PyObject *newop = NULL;
Georg Brandl2b869942007-03-17 16:08:45 +0000320
321 assert(op);
322 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000323 if (PyComplex_Check(op)) {
324 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000325 }
Georg Brandl2b869942007-03-17 16:08:45 +0000326 /* If not, use op's __complex__ method, if it exists */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000327
Georg Brandl2b869942007-03-17 16:08:45 +0000328 /* return -1 on failure */
329 cv.real = -1.;
330 cv.imag = 0.;
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000331
Benjamin Peterson36943662010-01-04 01:00:47 +0000332 newop = try_complex_special_method(op);
Georg Brandl2b869942007-03-17 16:08:45 +0000333
Georg Brandl2b869942007-03-17 16:08:45 +0000334 if (newop) {
335 if (!PyComplex_Check(newop)) {
336 PyErr_SetString(PyExc_TypeError,
337 "__complex__ should return a complex object");
338 Py_DECREF(newop);
339 return cv;
340 }
341 cv = ((PyComplexObject *)newop)->cval;
342 Py_DECREF(newop);
343 return cv;
344 }
Benjamin Peterson36943662010-01-04 01:00:47 +0000345 else if (PyErr_Occurred()) {
346 return cv;
347 }
Georg Brandl2b869942007-03-17 16:08:45 +0000348 /* If neither of the above works, interpret op as a float giving the
349 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000350 else {
Georg Brandl2b869942007-03-17 16:08:45 +0000351 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000352 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000353 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000354 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000355}
356
Guido van Rossumf9fca921996-01-12 00:47:05 +0000357static void
Fred Drake4288c802000-07-09 04:36:04 +0000358complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000359{
Guido van Rossum9475a232001-10-05 20:51:39 +0000360 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000361}
362
363
Mark Dickinson95bc9802009-04-24 12:46:53 +0000364static PyObject *
Eric Smitha985a3a2009-05-05 18:26:08 +0000365complex_format(PyComplexObject *v, int precision, char format_code)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366{
Mark Dickinson95bc9802009-04-24 12:46:53 +0000367 PyObject *result = NULL;
368 Py_ssize_t len;
369
370 /* If these are non-NULL, they'll need to be freed. */
371 char *pre = NULL;
372 char *im = NULL;
373 char *buf = NULL;
374
375 /* These do not need to be freed. re is either an alias
376 for pre or a pointer to a constant. lead and tail
377 are pointers to constants. */
378 char *re = NULL;
379 char *lead = "";
380 char *tail = "";
381
382 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
383 re = "";
384 im = PyOS_double_to_string(v->cval.imag, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000385 precision, 0, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000386 if (!im) {
387 PyErr_NoMemory();
388 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000389 }
Martin v. Löwis737ea822004-06-08 18:52:54 +0000390 } else {
Georg Brandlc404ff22005-09-16 06:42:26 +0000391 /* Format imaginary part with sign, real part without */
Mark Dickinson95bc9802009-04-24 12:46:53 +0000392 pre = PyOS_double_to_string(v->cval.real, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000393 precision, 0, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000394 if (!pre) {
395 PyErr_NoMemory();
396 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000397 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000398 re = pre;
399
400 im = PyOS_double_to_string(v->cval.imag, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000401 precision, Py_DTSF_SIGN, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000402 if (!im) {
403 PyErr_NoMemory();
404 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000405 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000406 lead = "(";
407 tail = ")";
Martin v. Löwis737ea822004-06-08 18:52:54 +0000408 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000409 /* Alloc the final buffer. Add one for the "j" in the format string,
410 and one for the trailing zero. */
411 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
412 buf = PyMem_Malloc(len);
413 if (!buf) {
414 PyErr_NoMemory();
415 goto done;
416 }
417 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
418 result = PyString_FromString(buf);
419 done:
420 PyMem_Free(im);
421 PyMem_Free(pre);
422 PyMem_Free(buf);
423
424 return result;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000425}
426
427static int
Fred Drake4288c802000-07-09 04:36:04 +0000428complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000429{
Mark Dickinson95bc9802009-04-24 12:46:53 +0000430 PyObject *formatv;
431 char *buf;
Eric Smitha985a3a2009-05-05 18:26:08 +0000432 if (flags & Py_PRINT_RAW)
433 formatv = complex_format(v, PyFloat_STR_PRECISION, 'g');
434 else
435 formatv = complex_format(v, 0, 'r');
Mark Dickinson95bc9802009-04-24 12:46:53 +0000436 if (formatv == NULL)
437 return -1;
438 buf = PyString_AS_STRING(formatv);
Brett Cannon01531592007-09-17 03:28:34 +0000439 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000440 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000441 Py_END_ALLOW_THREADS
Mark Dickinson95bc9802009-04-24 12:46:53 +0000442 Py_DECREF(formatv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000443 return 0;
444}
445
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000447complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000448{
Eric Smitha985a3a2009-05-05 18:26:08 +0000449 return complex_format(v, 0, 'r');
Tim Peters70695122001-03-11 08:37:29 +0000450}
451
452static PyObject *
453complex_str(PyComplexObject *v)
454{
Eric Smitha985a3a2009-05-05 18:26:08 +0000455 return complex_format(v, PyFloat_STR_PRECISION, 'g');
Guido van Rossumf9fca921996-01-12 00:47:05 +0000456}
457
Guido van Rossumf9fca921996-01-12 00:47:05 +0000458static long
Fred Drake4288c802000-07-09 04:36:04 +0000459complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000460{
Tim Peters39dce292000-08-15 03:34:48 +0000461 long hashreal, hashimag, combined;
462 hashreal = _Py_HashDouble(v->cval.real);
463 if (hashreal == -1)
464 return -1;
465 hashimag = _Py_HashDouble(v->cval.imag);
466 if (hashimag == -1)
467 return -1;
468 /* Note: if the imaginary part is 0, hashimag is 0 now,
469 * so the following returns hashreal unchanged. This is
470 * important because numbers of different types that
471 * compare equal must have the same hash value, so that
472 * hash(x + 0*j) must equal hash(x).
473 */
474 combined = hashreal + 1000003 * hashimag;
475 if (combined == -1)
476 combined = -2;
477 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000478}
479
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000480/* This macro may return! */
481#define TO_COMPLEX(obj, c) \
482 if (PyComplex_Check(obj)) \
483 c = ((PyComplexObject *)(obj))->cval; \
484 else if (to_complex(&(obj), &(c)) < 0) \
485 return (obj)
486
487static int
488to_complex(PyObject **pobj, Py_complex *pc)
489{
490 PyObject *obj = *pobj;
491
492 pc->real = pc->imag = 0.0;
493 if (PyInt_Check(obj)) {
494 pc->real = PyInt_AS_LONG(obj);
495 return 0;
496 }
497 if (PyLong_Check(obj)) {
498 pc->real = PyLong_AsDouble(obj);
499 if (pc->real == -1.0 && PyErr_Occurred()) {
500 *pobj = NULL;
501 return -1;
502 }
503 return 0;
504 }
505 if (PyFloat_Check(obj)) {
506 pc->real = PyFloat_AsDouble(obj);
507 return 0;
508 }
509 Py_INCREF(Py_NotImplemented);
510 *pobj = Py_NotImplemented;
511 return -1;
512}
513
514
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000516complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000517{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000518 Py_complex result;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000519 Py_complex a, b;
520 TO_COMPLEX(v, a);
521 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000522 PyFPE_START_PROTECT("complex_add", return 0)
Mark Dickinson82b34c52010-02-21 12:57:35 +0000523 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000524 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000526}
527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000529complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000530{
Mark Dickinson82b34c52010-02-21 12:57:35 +0000531 Py_complex result;
532 Py_complex a, b;
533 TO_COMPLEX(v, a);
534 TO_COMPLEX(w, b);;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000535 PyFPE_START_PROTECT("complex_sub", return 0)
Mark Dickinson82b34c52010-02-21 12:57:35 +0000536 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000537 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539}
540
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000542complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000543{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000544 Py_complex result;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000545 Py_complex a, b;
546 TO_COMPLEX(v, a);
547 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000548 PyFPE_START_PROTECT("complex_mul", return 0)
Mark Dickinson82b34c52010-02-21 12:57:35 +0000549 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000550 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000552}
553
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000555complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000556{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000557 Py_complex quot;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000558 Py_complex a, b;
559 TO_COMPLEX(v, a);
560 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000561 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000562 errno = 0;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000563 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000564 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000565 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000567 return NULL;
568 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000570}
571
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000573complex_classic_div(PyObject *v, PyObject *w)
Guido van Rossum393661d2001-08-31 17:40:15 +0000574{
575 Py_complex quot;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000576 Py_complex a, b;
577 TO_COMPLEX(v, a);
578 TO_COMPLEX(w, b);
Guido van Rossum1832de42001-09-04 03:51:09 +0000579 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000580 PyErr_Warn(PyExc_DeprecationWarning,
581 "classic complex division") < 0)
582 return NULL;
583
584 PyFPE_START_PROTECT("complex_classic_div", return 0)
585 errno = 0;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000586 quot = c_quot(a, b);
Guido van Rossum393661d2001-08-31 17:40:15 +0000587 PyFPE_END_PROTECT(quot)
588 if (errno == EDOM) {
589 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
590 return NULL;
591 }
592 return PyComplex_FromCComplex(quot);
593}
594
595static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000596complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000597{
Georg Brandl96f21842008-01-19 10:18:07 +0000598 Py_complex div, mod;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000599 Py_complex a, b;
600 TO_COMPLEX(v, a);
601 TO_COMPLEX(w, b);
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000602 if (PyErr_Warn(PyExc_DeprecationWarning,
603 "complex divmod(), // and % are deprecated") < 0)
604 return NULL;
605
Guido van Rossum96783941997-05-20 18:21:34 +0000606 errno = 0;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000607 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000608 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000610 return NULL;
611 }
612 div.real = floor(div.real); /* Use the floor of the real part. */
613 div.imag = 0.0;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000614 mod = c_diff(a, c_prod(b, div));
Guido van Rossum3be12e91996-09-12 20:56:18 +0000615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000617}
618
Guido van Rossumee09fc11996-09-11 13:55:55 +0000619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000621complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000622{
Georg Brandl96f21842008-01-19 10:18:07 +0000623 Py_complex div, mod;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000624 PyObject *d, *m, *z;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000625 Py_complex a, b;
626 TO_COMPLEX(v, a);
627 TO_COMPLEX(w, b);
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000628 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000629 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000630 return NULL;
631
Guido van Rossum96783941997-05-20 18:21:34 +0000632 errno = 0;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000633 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000634 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000636 return NULL;
637 }
638 div.real = floor(div.real); /* Use the floor of the real part. */
639 div.imag = 0.0;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000640 mod = c_diff(a, c_prod(b, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 d = PyComplex_FromCComplex(div);
642 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000643 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000644 Py_XDECREF(d);
645 Py_XDECREF(m);
646 return z;
647}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000648
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649static PyObject *
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000650complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000651{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000652 Py_complex p;
653 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000654 long int_exponent;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000655 Py_complex a, b;
Georg Brandl96f21842008-01-19 10:18:07 +0000656 TO_COMPLEX(v, a);
657 TO_COMPLEX(w, b);
Mark Dickinson82b34c52010-02-21 12:57:35 +0000658 if (z!=Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000660 return NULL;
661 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000662 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000663 errno = 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000664 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000665 int_exponent = (long)exponent.real;
666 if (exponent.imag == 0. && exponent.real == int_exponent)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000667 p = c_powi(a,int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000668 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000669 p = c_pow(a,exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000670
Guido van Rossum45b83911997-03-14 04:32:50 +0000671 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000672 Py_ADJUST_ERANGE2(p.real, p.imag);
673 if (errno == EDOM) {
674 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000676 return NULL;
677 }
Tim Petersbab22be2002-03-22 02:48:46 +0000678 else if (errno == ERANGE) {
679 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000680 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000681 return NULL;
682 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000684}
685
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686static PyObject *
Mark Dickinson82b34c52010-02-21 12:57:35 +0000687complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000688{
689 PyObject *t, *r;
Mark Dickinson82b34c52010-02-21 12:57:35 +0000690 Py_complex a, b;
691 TO_COMPLEX(v, a);
692 TO_COMPLEX(w, b);
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000693 if (PyErr_Warn(PyExc_DeprecationWarning,
694 "complex divmod(), // and % are deprecated") < 0)
695 return NULL;
696
Guido van Rossum4668b002001-08-08 05:00:18 +0000697 t = complex_divmod(v, w);
698 if (t != NULL) {
699 r = PyTuple_GET_ITEM(t, 0);
700 Py_INCREF(r);
701 Py_DECREF(t);
702 return r;
703 }
704 return NULL;
705}
706
707static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000708complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000709{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000710 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000711 neg.real = -v->cval.real;
712 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000713 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000714}
715
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000717complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000718{
Tim Peters2400fa42001-09-12 19:12:49 +0000719 if (PyComplex_CheckExact(v)) {
720 Py_INCREF(v);
721 return (PyObject *)v;
722 }
723 else
724 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000725}
726
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000728complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000729{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000730 double result;
Christian Heimes6f341092008-04-18 23:13:07 +0000731
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000732 PyFPE_START_PROTECT("complex_abs", return 0)
Christian Heimes6f341092008-04-18 23:13:07 +0000733 result = c_abs(v->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000734 PyFPE_END_PROTECT(result)
Christian Heimes6f341092008-04-18 23:13:07 +0000735
736 if (errno == ERANGE) {
737 PyErr_SetString(PyExc_OverflowError,
738 "absolute value too large");
739 return NULL;
740 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000742}
743
744static int
Fred Drake4288c802000-07-09 04:36:04 +0000745complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000746{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000747 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000748}
749
750static int
Fred Drake4288c802000-07-09 04:36:04 +0000751complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000752{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000753 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000754 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000755 if (PyInt_Check(*pw)) {
756 cval.real = (double)PyInt_AsLong(*pw);
757 *pw = PyComplex_FromCComplex(cval);
758 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000759 return 0;
760 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000761 else if (PyLong_Check(*pw)) {
762 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000763 if (cval.real == -1.0 && PyErr_Occurred())
764 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000765 *pw = PyComplex_FromCComplex(cval);
766 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000767 return 0;
768 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000769 else if (PyFloat_Check(*pw)) {
770 cval.real = PyFloat_AsDouble(*pw);
771 *pw = PyComplex_FromCComplex(cval);
772 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000773 return 0;
774 }
Guido van Rossum63805962001-09-19 01:13:10 +0000775 else if (PyComplex_Check(*pw)) {
776 Py_INCREF(*pv);
777 Py_INCREF(*pw);
778 return 0;
779 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000780 return 1; /* Can't do it */
781}
782
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000783static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000784complex_richcompare(PyObject *v, PyObject *w, int op)
785{
786 int c;
787 Py_complex i, j;
788 PyObject *res;
789
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000790 c = PyNumber_CoerceEx(&v, &w);
791 if (c < 0)
792 return NULL;
793 if (c > 0) {
794 Py_INCREF(Py_NotImplemented);
795 return Py_NotImplemented;
796 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000797 /* Make sure both arguments are complex. */
798 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000799 Py_DECREF(v);
800 Py_DECREF(w);
801 Py_INCREF(Py_NotImplemented);
802 return Py_NotImplemented;
803 }
804
805 i = ((PyComplexObject *)v)->cval;
806 j = ((PyComplexObject *)w)->cval;
807 Py_DECREF(v);
808 Py_DECREF(w);
809
Guido van Rossum22056422001-09-24 17:52:04 +0000810 if (op != Py_EQ && op != Py_NE) {
811 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000812 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000813 return NULL;
814 }
815
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000816 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
817 res = Py_True;
818 else
819 res = Py_False;
820
821 Py_INCREF(res);
822 return res;
823}
824
825static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000826complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000827{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000828 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000829 "can't convert complex to int");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000830 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000831}
832
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000834complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000835{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000836 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000837 "can't convert complex to long");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000838 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000839}
840
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000841static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000842complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000843{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000845 "can't convert complex to float");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000846 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000847}
848
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000850complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000851{
Guido van Rossum926518b1996-08-19 19:30:45 +0000852 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000854 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000856}
857
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000858PyDoc_STRVAR(complex_conjugate_doc,
859"complex.conjugate() -> complex\n"
860"\n"
861"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
862
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000863static PyObject *
864complex_getnewargs(PyComplexObject *v)
865{
Alexandre Vassalotti80af6da2008-06-04 20:41:44 +0000866 Py_complex c = v->cval;
867 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000868}
869
Eric Smith9139cc62009-04-30 00:58:58 +0000870PyDoc_STRVAR(complex__format__doc,
871"complex.__format__() -> str\n"
872"\n"
873"Converts to a string according to format_spec.");
874
875static PyObject *
876complex__format__(PyObject* self, PyObject* args)
877{
878 PyObject *format_spec;
879
880 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
881 return NULL;
882 if (PyBytes_Check(format_spec))
883 return _PyComplex_FormatAdvanced(self,
884 PyBytes_AS_STRING(format_spec),
885 PyBytes_GET_SIZE(format_spec));
886 if (PyUnicode_Check(format_spec)) {
887 /* Convert format_spec to a str */
888 PyObject *result;
889 PyObject *str_spec = PyObject_Str(format_spec);
890
891 if (str_spec == NULL)
892 return NULL;
893
894 result = _PyComplex_FormatAdvanced(self,
895 PyBytes_AS_STRING(str_spec),
896 PyBytes_GET_SIZE(str_spec));
897
898 Py_DECREF(str_spec);
899 return result;
900 }
901 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
902 return NULL;
903}
904
Christian Heimes6f341092008-04-18 23:13:07 +0000905#if 0
906static PyObject *
907complex_is_finite(PyObject *self)
908{
909 Py_complex c;
910 c = ((PyComplexObject *)self)->cval;
911 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
912 Py_IS_FINITE(c.imag)));
913}
914
915PyDoc_STRVAR(complex_is_finite_doc,
916"complex.is_finite() -> bool\n"
917"\n"
918"Returns True if the real and the imaginary part is finite.");
919#endif
920
Guido van Rossumf9fca921996-01-12 00:47:05 +0000921static PyMethodDef complex_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000922 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
923 complex_conjugate_doc},
Christian Heimes6f341092008-04-18 23:13:07 +0000924#if 0
925 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
926 complex_is_finite_doc},
927#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000928 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Eric Smith9139cc62009-04-30 00:58:58 +0000929 {"__format__", (PyCFunction)complex__format__,
930 METH_VARARGS, complex__format__doc},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000931 {NULL, NULL} /* sentinel */
932};
933
Guido van Rossum6f799372001-09-20 20:46:19 +0000934static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000935 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000936 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000937 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000938 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000939 {0},
940};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000941
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000942static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000943complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000944{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000945 const char *s, *start;
946 char *end;
947 double x=0.0, y=0.0, z;
Mark Dickinson95bc9802009-04-24 12:46:53 +0000948 int got_bracket=0;
Guido van Rossum70e36882001-10-25 18:07:22 +0000949#ifdef Py_USING_UNICODE
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000950 char *s_buffer = NULL;
Guido van Rossum70e36882001-10-25 18:07:22 +0000951#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000952 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000953
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000954 if (PyString_Check(v)) {
955 s = PyString_AS_STRING(v);
956 len = PyString_GET_SIZE(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000958#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000959 else if (PyUnicode_Check(v)) {
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000960 s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v)+1);
961 if (s_buffer == NULL)
962 return PyErr_NoMemory();
Tim Peters6d6c1a32001-08-02 04:15:00 +0000963 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
964 PyUnicode_GET_SIZE(v),
965 s_buffer,
966 NULL))
Mark Dickinsonc04c7c52009-10-26 22:28:14 +0000967 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000968 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000969 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000970 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000971#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000972 else if (PyObject_AsCharBuffer(v, &s, &len)) {
973 PyErr_SetString(PyExc_TypeError,
974 "complex() arg is not a string");
975 return NULL;
976 }
977
978 /* position on first nonblank */
979 start = s;
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000980 while (Py_ISSPACE(*s))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000981 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +0000982 if (*s == '(') {
Collin Wintere38051d2007-03-09 20:33:07 +0000983 /* Skip over possible bracket from repr(). */
984 got_bracket = 1;
985 s++;
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000986 while (Py_ISSPACE(*s))
Collin Wintere38051d2007-03-09 20:33:07 +0000987 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000988 }
989
Mark Dickinson95bc9802009-04-24 12:46:53 +0000990 /* a valid complex string usually takes one of the three forms:
Tim Peters6d6c1a32001-08-02 04:15:00 +0000991
Mark Dickinson95bc9802009-04-24 12:46:53 +0000992 <float> - real part only
993 <float>j - imaginary part only
994 <float><signed-float>j - real and imaginary parts
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995
Mark Dickinson95bc9802009-04-24 12:46:53 +0000996 where <float> represents any numeric string that's accepted by the
997 float constructor (including 'nan', 'inf', 'infinity', etc.), and
998 <signed-float> is any string of the form <float> whose first
999 character is '+' or '-'.
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000
Mark Dickinson95bc9802009-04-24 12:46:53 +00001001 For backwards compatibility, the extra forms
1002
1003 <float><sign>j
1004 <sign>j
1005 j
1006
1007 are also accepted, though support for these forms may be removed from
1008 a future version of Python.
1009 */
1010
1011 /* first look for forms starting with <float> */
Mark Dickinsonc04c7c52009-10-26 22:28:14 +00001012 z = PyOS_string_to_double(s, &end, NULL);
1013 if (z == -1.0 && PyErr_Occurred()) {
1014 if (PyErr_ExceptionMatches(PyExc_ValueError))
1015 PyErr_Clear();
1016 else
1017 goto error;
1018 }
Mark Dickinson95bc9802009-04-24 12:46:53 +00001019 if (end != s) {
1020 /* all 4 forms starting with <float> land here */
1021 s = end;
1022 if (*s == '+' || *s == '-') {
1023 /* <float><signed-float>j | <float><sign>j */
1024 x = z;
Mark Dickinsonc04c7c52009-10-26 22:28:14 +00001025 y = PyOS_string_to_double(s, &end, NULL);
1026 if (y == -1.0 && PyErr_Occurred()) {
1027 if (PyErr_ExceptionMatches(PyExc_ValueError))
1028 PyErr_Clear();
1029 else
1030 goto error;
1031 }
Mark Dickinson95bc9802009-04-24 12:46:53 +00001032 if (end != s)
1033 /* <float><signed-float>j */
1034 s = end;
1035 else {
1036 /* <float><sign>j */
1037 y = *s == '+' ? 1.0 : -1.0;
Collin Wintere38051d2007-03-09 20:33:07 +00001038 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001039 }
1040 if (!(*s == 'j' || *s == 'J'))
1041 goto parse_error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001042 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001043 }
1044 else if (*s == 'j' || *s == 'J') {
1045 /* <float>j */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001046 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001047 y = z;
1048 }
1049 else
1050 /* <float> */
1051 x = z;
1052 }
1053 else {
1054 /* not starting with <float>; must be <sign>j or j */
1055 if (*s == '+' || *s == '-') {
1056 /* <sign>j */
1057 y = *s == '+' ? 1.0 : -1.0;
1058 s++;
1059 }
1060 else
1061 /* j */
1062 y = 1.0;
1063 if (!(*s == 'j' || *s == 'J'))
1064 goto parse_error;
1065 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001066 }
1067
Mark Dickinson95bc9802009-04-24 12:46:53 +00001068 /* trailing whitespace and closing bracket */
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001069 while (Py_ISSPACE(*s))
Mark Dickinson95bc9802009-04-24 12:46:53 +00001070 s++;
1071 if (got_bracket) {
1072 /* if there was an opening parenthesis, then the corresponding
1073 closing parenthesis should be right here */
1074 if (*s != ')')
1075 goto parse_error;
1076 s++;
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001077 while (Py_ISSPACE(*s))
Mark Dickinson95bc9802009-04-24 12:46:53 +00001078 s++;
1079 }
1080
1081 /* we should now be at the end of the string */
1082 if (s-start != len)
1083 goto parse_error;
1084
Mark Dickinsonc04c7c52009-10-26 22:28:14 +00001085
1086#ifdef Py_USING_UNICODE
1087 if (s_buffer)
1088 PyMem_FREE(s_buffer);
1089#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +00001090 return complex_subtype_from_doubles(type, x, y);
Mark Dickinson95bc9802009-04-24 12:46:53 +00001091
1092 parse_error:
1093 PyErr_SetString(PyExc_ValueError,
1094 "complex() arg is a malformed string");
Mark Dickinsonc04c7c52009-10-26 22:28:14 +00001095 error:
1096#ifdef Py_USING_UNICODE
1097 if (s_buffer)
1098 PyMem_FREE(s_buffer);
1099#endif
Mark Dickinson95bc9802009-04-24 12:46:53 +00001100 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +00001101}
1102
Tim Peters6d6c1a32001-08-02 04:15:00 +00001103static PyObject *
1104complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1105{
Benjamin Peterson36943662010-01-04 01:00:47 +00001106 PyObject *r, *i, *tmp;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001107 PyNumberMethods *nbr, *nbi = NULL;
1108 Py_complex cr, ci;
1109 int own_r = 0;
Guido van Rossum715ec182007-11-27 22:38:36 +00001110 int cr_is_complex = 0;
1111 int ci_is_complex = 0;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001112 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001113
1114 r = Py_False;
1115 i = NULL;
1116 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
1117 &r, &i))
1118 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001119
Georg Brandl8f032cb2007-03-13 07:57:51 +00001120 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +00001121 if (PyComplex_CheckExact(r) && i == NULL &&
1122 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001123 /* Note that we can't know whether it's safe to return
1124 a complex *subclass* instance as-is, hence the restriction
Georg Brandl8f032cb2007-03-13 07:57:51 +00001125 to exact complexes here. If either the input or the
1126 output is a complex subclass, it will be handled below
1127 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001128 Py_INCREF(r);
1129 return r;
1130 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001131 if (PyString_Check(r) || PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +00001132 if (i != NULL) {
1133 PyErr_SetString(PyExc_TypeError,
1134 "complex() can't take second arg"
1135 " if first is a string");
1136 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +00001137 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001138 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +00001139 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001140 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
Fred Drake526c7a02001-12-13 19:52:22 +00001141 PyErr_SetString(PyExc_TypeError,
1142 "complex() second arg can't be a string");
1143 return NULL;
1144 }
Tim Peters2400fa42001-09-12 19:12:49 +00001145
Benjamin Peterson36943662010-01-04 01:00:47 +00001146 tmp = try_complex_special_method(r);
1147 if (tmp) {
1148 r = tmp;
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001149 own_r = 1;
1150 }
Benjamin Peterson36943662010-01-04 01:00:47 +00001151 else if (PyErr_Occurred()) {
1152 return NULL;
1153 }
1154
Tim Peters2400fa42001-09-12 19:12:49 +00001155 nbr = r->ob_type->tp_as_number;
1156 if (i != NULL)
1157 nbi = i->ob_type->tp_as_number;
1158 if (nbr == NULL || nbr->nb_float == NULL ||
1159 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001160 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001161 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +00001162 if (own_r) {
1163 Py_DECREF(r);
1164 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001165 return NULL;
1166 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001167
1168 /* If we get this far, then the "real" and "imag" parts should
1169 both be treated as numbers, and the constructor should return a
1170 complex number equal to (real + imag*1j).
1171
1172 Note that we do NOT assume the input to already be in canonical
1173 form; the "real" and "imag" parts might themselves be complex
1174 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001175 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +00001176 /* Note that if r is of a complex subtype, we're only
1177 retaining its real & imag parts here, and the return
1178 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001179 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001180 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181 if (own_r) {
1182 Py_DECREF(r);
1183 }
1184 }
1185 else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001186 /* The "real" part really is entirely real, and contributes
1187 nothing in the imaginary direction.
1188 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001189 tmp = PyNumber_Float(r);
1190 if (own_r) {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001191 /* r was a newly created complex number, rather
1192 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001193 Py_DECREF(r);
1194 }
1195 if (tmp == NULL)
1196 return NULL;
1197 if (!PyFloat_Check(tmp)) {
1198 PyErr_SetString(PyExc_TypeError,
1199 "float(r) didn't return a float");
1200 Py_DECREF(tmp);
1201 return NULL;
1202 }
1203 cr.real = PyFloat_AsDouble(tmp);
Georg Brandl96f21842008-01-19 10:18:07 +00001204 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001206 }
1207 if (i == NULL) {
1208 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001209 }
Guido van Rossum715ec182007-11-27 22:38:36 +00001210 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001211 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001212 ci_is_complex = 1;
1213 } else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001214 /* The "imag" part really is entirely imaginary, and
1215 contributes nothing in the real direction.
1216 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001217 tmp = (*nbi->nb_float)(i);
1218 if (tmp == NULL)
1219 return NULL;
1220 ci.real = PyFloat_AsDouble(tmp);
1221 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001222 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001223 /* If the input was in canonical form, then the "real" and "imag"
Guido van Rossum715ec182007-11-27 22:38:36 +00001224 parts are real numbers, so that ci.imag and cr.imag are zero.
Georg Brandl8f032cb2007-03-13 07:57:51 +00001225 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001226
1227 if (ci_is_complex) {
1228 cr.real -= ci.imag;
1229 }
1230 if (cr_is_complex) {
1231 ci.real += cr.imag;
1232 }
1233 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001234}
1235
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001236PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001237"complex(real[, imag]) -> complex number\n"
1238"\n"
1239"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001240"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001241
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001242static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001243 (binaryfunc)complex_add, /* nb_add */
1244 (binaryfunc)complex_sub, /* nb_subtract */
1245 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +00001246 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001247 (binaryfunc)complex_remainder, /* nb_remainder */
1248 (binaryfunc)complex_divmod, /* nb_divmod */
1249 (ternaryfunc)complex_pow, /* nb_power */
1250 (unaryfunc)complex_neg, /* nb_negative */
1251 (unaryfunc)complex_pos, /* nb_positive */
1252 (unaryfunc)complex_abs, /* nb_absolute */
1253 (inquiry)complex_nonzero, /* nb_nonzero */
1254 0, /* nb_invert */
1255 0, /* nb_lshift */
1256 0, /* nb_rshift */
1257 0, /* nb_and */
1258 0, /* nb_xor */
1259 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +00001260 complex_coerce, /* nb_coerce */
1261 complex_int, /* nb_int */
1262 complex_long, /* nb_long */
1263 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001264 0, /* nb_oct */
1265 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001266 0, /* nb_inplace_add */
1267 0, /* nb_inplace_subtract */
1268 0, /* nb_inplace_multiply*/
1269 0, /* nb_inplace_divide */
1270 0, /* nb_inplace_remainder */
1271 0, /* nb_inplace_power */
1272 0, /* nb_inplace_lshift */
1273 0, /* nb_inplace_rshift */
1274 0, /* nb_inplace_and */
1275 0, /* nb_inplace_xor */
1276 0, /* nb_inplace_or */
1277 (binaryfunc)complex_int_div, /* nb_floor_divide */
1278 (binaryfunc)complex_div, /* nb_true_divide */
1279 0, /* nb_inplace_floor_divide */
1280 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001281};
1282
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001283PyTypeObject PyComplex_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001284 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001285 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001286 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001287 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001288 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001289 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001290 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001291 0, /* tp_setattr */
1292 0, /* tp_compare */
1293 (reprfunc)complex_repr, /* tp_repr */
1294 &complex_as_number, /* tp_as_number */
1295 0, /* tp_as_sequence */
1296 0, /* tp_as_mapping */
1297 (hashfunc)complex_hash, /* tp_hash */
1298 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001299 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001300 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001301 0, /* tp_setattro */
1302 0, /* tp_as_buffer */
Mark Dickinson82b34c52010-02-21 12:57:35 +00001303 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |
1304 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001305 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001306 0, /* tp_traverse */
1307 0, /* tp_clear */
1308 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001309 0, /* tp_weaklistoffset */
1310 0, /* tp_iter */
1311 0, /* tp_iternext */
1312 complex_methods, /* tp_methods */
1313 complex_members, /* tp_members */
1314 0, /* tp_getset */
1315 0, /* tp_base */
1316 0, /* tp_dict */
1317 0, /* tp_descr_get */
1318 0, /* tp_descr_set */
1319 0, /* tp_dictoffset */
1320 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001321 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001322 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001323 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001324};
1325
1326#endif