blob: 721db8f514ec8c250f6175af482a41ee96e99d64 [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
Christian Heimesbbe741d2008-03-28 10:53:29 +000011#ifdef HAVE_IEEEFP_H
12#include <ieeefp.h>
13#endif
14
Guido van Rossum65ce6de2002-06-13 17:07:07 +000015#ifndef WITHOUT_COMPLEX
16
Guido van Rossumf9fca921996-01-12 00:47:05 +000017/* elementary operations on complex numbers */
18
Guido van Rossum9e720e31996-07-21 02:31:35 +000019static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000020
Tim Peters0f336042001-03-18 08:21:57 +000021Py_complex
22c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000023{
Guido van Rossum9e720e31996-07-21 02:31:35 +000024 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000025 r.real = a.real + b.real;
26 r.imag = a.imag + b.imag;
27 return r;
28}
29
Tim Peters0f336042001-03-18 08:21:57 +000030Py_complex
31c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000032{
Guido van Rossum9e720e31996-07-21 02:31:35 +000033 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000034 r.real = a.real - b.real;
35 r.imag = a.imag - b.imag;
36 return r;
37}
38
Tim Peters0f336042001-03-18 08:21:57 +000039Py_complex
40c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000041{
Guido van Rossum9e720e31996-07-21 02:31:35 +000042 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000043 r.real = -a.real;
44 r.imag = -a.imag;
45 return r;
46}
47
Tim Peters0f336042001-03-18 08:21:57 +000048Py_complex
49c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000050{
Guido van Rossum9e720e31996-07-21 02:31:35 +000051 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000052 r.real = a.real*b.real - a.imag*b.imag;
53 r.imag = a.real*b.imag + a.imag*b.real;
54 return r;
55}
56
Tim Peters0f336042001-03-18 08:21:57 +000057Py_complex
58c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000059{
Tim Peters0f336042001-03-18 08:21:57 +000060 /******************************************************************
61 This was the original algorithm. It's grossly prone to spurious
62 overflow and underflow errors. It also merrily divides by 0 despite
63 checking for that(!). The code still serves a doc purpose here, as
64 the algorithm following is a simple by-cases transformation of this
65 one:
66
Guido van Rossum9e720e31996-07-21 02:31:35 +000067 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000068 double d = b.real*b.real + b.imag*b.imag;
69 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000070 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000071 r.real = (a.real*b.real + a.imag*b.imag)/d;
72 r.imag = (a.imag*b.real - a.real*b.imag)/d;
73 return r;
Tim Peters0f336042001-03-18 08:21:57 +000074 ******************************************************************/
75
76 /* This algorithm is better, and is pretty obvious: first divide the
77 * numerators and denominator by whichever of {b.real, b.imag} has
78 * larger magnitude. The earliest reference I found was to CACM
79 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
80 * University). As usual, though, we're still ignoring all IEEE
81 * endcases.
82 */
83 Py_complex r; /* the result */
84 const double abs_breal = b.real < 0 ? -b.real : b.real;
85 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
86
87 if (abs_breal >= abs_bimag) {
88 /* divide tops and bottom by b.real */
89 if (abs_breal == 0.0) {
90 errno = EDOM;
91 r.real = r.imag = 0.0;
92 }
93 else {
94 const double ratio = b.imag / b.real;
95 const double denom = b.real + b.imag * ratio;
96 r.real = (a.real + a.imag * ratio) / denom;
97 r.imag = (a.imag - a.real * ratio) / denom;
98 }
99 }
100 else {
101 /* divide tops and bottom by b.imag */
102 const double ratio = b.real / b.imag;
103 const double denom = b.real * ratio + b.imag;
104 assert(b.imag != 0.0);
105 r.real = (a.real * ratio + a.imag) / denom;
106 r.imag = (a.imag * ratio - a.real) / denom;
107 }
108 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000109}
110
Tim Peters0f336042001-03-18 08:21:57 +0000111Py_complex
112c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000113{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000114 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000115 double vabs,len,at,phase;
116 if (b.real == 0. && b.imag == 0.) {
117 r.real = 1.;
118 r.imag = 0.;
119 }
120 else if (a.real == 0. && a.imag == 0.) {
121 if (b.imag != 0. || b.real < 0.)
Tim Petersbab22be2002-03-22 02:48:46 +0000122 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000123 r.real = 0.;
124 r.imag = 0.;
125 }
126 else {
127 vabs = hypot(a.real,a.imag);
128 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000129 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000130 phase = at*b.real;
131 if (b.imag != 0.0) {
132 len /= exp(at*b.imag);
133 phase += b.imag*log(vabs);
134 }
135 r.real = len*cos(phase);
136 r.imag = len*sin(phase);
137 }
138 return r;
139}
140
Tim Peters0f336042001-03-18 08:21:57 +0000141static Py_complex
142c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000143{
Guido van Rossum926518b1996-08-19 19:30:45 +0000144 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000145 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000146 r = c_1;
147 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000148 while (mask > 0 && n >= mask) {
149 if (n & mask)
150 r = c_prod(r,p);
151 mask <<= 1;
152 p = c_prod(p,p);
153 }
154 return r;
155}
156
Tim Peters0f336042001-03-18 08:21:57 +0000157static Py_complex
158c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000159{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000160 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000161
162 if (n > 100 || n < -100) {
163 cn.real = (double) n;
164 cn.imag = 0.;
165 return c_pow(x,cn);
166 }
167 else if (n > 0)
168 return c_powu(x,n);
169 else
170 return c_quot(c_1,c_powu(x,-n));
171
172}
173
Christian Heimes53876d92008-04-19 00:31:39 +0000174double
175c_abs(Py_complex z)
176{
177 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
178 double result;
179
180 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
181 /* C99 rules: if either the real or the imaginary part is an
182 infinity, return infinity, even if the other part is a
183 NaN. */
184 if (Py_IS_INFINITY(z.real)) {
185 result = fabs(z.real);
186 errno = 0;
187 return result;
188 }
189 if (Py_IS_INFINITY(z.imag)) {
190 result = fabs(z.imag);
191 errno = 0;
192 return result;
193 }
194 /* either the real or imaginary part is a NaN,
195 and neither is infinite. Result should be NaN. */
196 return Py_NAN;
197 }
198 result = hypot(z.real, z.imag);
199 if (!Py_IS_FINITE(result))
200 errno = ERANGE;
201 else
202 errno = 0;
203 return result;
204}
205
Tim Peters6d6c1a32001-08-02 04:15:00 +0000206static PyObject *
207complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
208{
209 PyObject *op;
210
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000211 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000212 if (op != NULL)
213 ((PyComplexObject *)op)->cval = cval;
214 return op;
215}
216
Guido van Rossumf9fca921996-01-12 00:47:05 +0000217PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000218PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000219{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000220 register PyComplexObject *op;
221
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000222 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000223 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000224 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000226 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000227 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000229}
230
Tim Peters6d6c1a32001-08-02 04:15:00 +0000231static PyObject *
232complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
233{
234 Py_complex c;
235 c.real = real;
236 c.imag = imag;
237 return complex_subtype_from_c_complex(type, c);
238}
239
Guido van Rossumf9fca921996-01-12 00:47:05 +0000240PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000241PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000242{
243 Py_complex c;
244 c.real = real;
245 c.imag = imag;
246 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000247}
248
249double
Fred Drake4288c802000-07-09 04:36:04 +0000250PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000251{
252 if (PyComplex_Check(op)) {
253 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000254 }
255 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000256 return PyFloat_AsDouble(op);
257 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000258}
259
260double
Fred Drake4288c802000-07-09 04:36:04 +0000261PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000262{
263 if (PyComplex_Check(op)) {
264 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000265 }
266 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000267 return 0.0;
268 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000269}
270
Guido van Rossum9e720e31996-07-21 02:31:35 +0000271Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000272PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000273{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000274 Py_complex cv;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275 PyObject *newop = NULL;
276 static PyObject *complex_str = NULL;
277
278 assert(op);
279 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000280 if (PyComplex_Check(op)) {
281 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000282 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000283 /* If not, use op's __complex__ method, if it exists */
284
285 /* return -1 on failure */
286 cv.real = -1.;
287 cv.imag = 0.;
Christian Heimesfe82e772008-01-28 02:38:20 +0000288
289 if (complex_str == NULL) {
290 if (!(complex_str = PyUnicode_FromString("__complex__")))
291 return cv;
292 }
293
Guido van Rossumd8faa362007-04-27 19:54:29 +0000294 {
295 PyObject *complexfunc;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000296 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
297 /* complexfunc is a borrowed reference */
298 if (complexfunc) {
299 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
300 if (!newop)
301 return cv;
302 }
303 }
304
305 if (newop) {
306 if (!PyComplex_Check(newop)) {
307 PyErr_SetString(PyExc_TypeError,
308 "__complex__ should return a complex object");
309 Py_DECREF(newop);
310 return cv;
311 }
312 cv = ((PyComplexObject *)newop)->cval;
313 Py_DECREF(newop);
314 return cv;
315 }
316 /* If neither of the above works, interpret op as a float giving the
317 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000318 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000319 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000320 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000321 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000322 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000323}
324
Guido van Rossumf9fca921996-01-12 00:47:05 +0000325static void
Fred Drake4288c802000-07-09 04:36:04 +0000326complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000327{
Guido van Rossum9475a232001-10-05 20:51:39 +0000328 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000329}
330
331
Eric Smith0923d1d2009-04-16 20:16:10 +0000332static PyObject *
333complex_format(PyComplexObject *v, char format_code)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000334{
Eric Smith0923d1d2009-04-16 20:16:10 +0000335 PyObject *result = NULL;
336 Py_ssize_t len;
337
338 /* If these are non-NULL, they'll need to be freed. */
339 char *pre = NULL;
340 char *pim = NULL;
341 char *buf = NULL;
342
343 /* These do not need to be freed. They're either aliases for pim
344 and pre, or pointers to constants. */
345 char *re = NULL;
346 char *im = NULL;
347 char *lead = "";
348 char *tail = "";
349
350
351 if (v->cval.real == 0.) {
352 re = "";
353 if (!Py_IS_FINITE(v->cval.imag)) {
354 if (Py_IS_NAN(v->cval.imag))
355 im = "nan*";
356 else if (copysign(1, v->cval.imag) == 1)
357 im = "inf*";
358 else
359 im = "-inf*";
360 }
361 else {
362 pim = PyOS_double_to_string(v->cval.imag, format_code,
363 0, 0, NULL);
364 if (!pim) {
365 PyErr_NoMemory();
366 goto done;
367 }
368 im = pim;
369 }
370 } else {
371 /* Format imaginary part with sign, real part without */
372 if (!Py_IS_FINITE(v->cval.real)) {
373 if (Py_IS_NAN(v->cval.real))
374 re = "nan";
375 /* else if (copysign(1, v->cval.real) == 1) */
376 else if (v->cval.real > 0)
377 re = "inf";
378 else
379 re = "-inf";
380 }
381 else {
382 pre = PyOS_double_to_string(v->cval.real, format_code,
383 0, 0, NULL);
384 if (!pre) {
385 PyErr_NoMemory();
386 goto done;
387 }
388 re = pre;
389 }
390
391 if (!Py_IS_FINITE(v->cval.imag)) {
392 if (Py_IS_NAN(v->cval.imag))
393 im = "+nan*";
394 /* else if (copysign(1, v->cval.imag) == 1) */
395 else if (v->cval.imag > 0)
396 im = "+inf*";
397 else
398 im = "-inf*";
399 }
400 else {
401 pim = PyOS_double_to_string(v->cval.imag, format_code,
402 0, Py_DTSF_SIGN, NULL);
403 if (!pim) {
404 PyErr_NoMemory();
405 goto done;
406 }
407 im = pim;
408 }
409 lead = "(";
410 tail = ")";
411 }
412 /* Alloc the final buffer. Add one for the "j" in the format string, and
413 one for the trailing zero. */
414 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
415 buf = PyMem_Malloc(len);
416 if (!buf) {
417 PyErr_NoMemory();
418 goto done;
419 }
420 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
421 result = PyUnicode_FromString(buf);
422done:
423 PyMem_Free(pim);
424 PyMem_Free(pre);
425 PyMem_Free(buf);
426
427 return result;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000428}
429
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000431complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000432{
Eric Smith0923d1d2009-04-16 20:16:10 +0000433 return complex_format(v, 'r');
Tim Peters70695122001-03-11 08:37:29 +0000434}
435
436static PyObject *
437complex_str(PyComplexObject *v)
438{
Eric Smith0923d1d2009-04-16 20:16:10 +0000439 return complex_format(v, 's');
Guido van Rossumf9fca921996-01-12 00:47:05 +0000440}
441
Guido van Rossumf9fca921996-01-12 00:47:05 +0000442static long
Fred Drake4288c802000-07-09 04:36:04 +0000443complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000444{
Tim Peters39dce292000-08-15 03:34:48 +0000445 long hashreal, hashimag, combined;
446 hashreal = _Py_HashDouble(v->cval.real);
447 if (hashreal == -1)
448 return -1;
449 hashimag = _Py_HashDouble(v->cval.imag);
450 if (hashimag == -1)
451 return -1;
452 /* Note: if the imaginary part is 0, hashimag is 0 now,
453 * so the following returns hashreal unchanged. This is
454 * important because numbers of different types that
455 * compare equal must have the same hash value, so that
456 * hash(x + 0*j) must equal hash(x).
457 */
458 combined = hashreal + 1000003 * hashimag;
459 if (combined == -1)
460 combined = -2;
461 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000462}
463
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000464/* This macro may return! */
465#define TO_COMPLEX(obj, c) \
466 if (PyComplex_Check(obj)) \
467 c = ((PyComplexObject *)(obj))->cval; \
468 else if (to_complex(&(obj), &(c)) < 0) \
469 return (obj)
470
471static int
472to_complex(PyObject **pobj, Py_complex *pc)
473{
Christian Heimes587c2bf2008-01-19 16:21:02 +0000474 PyObject *obj = *pobj;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000475
Christian Heimes587c2bf2008-01-19 16:21:02 +0000476 pc->real = pc->imag = 0.0;
477 if (PyLong_Check(obj)) {
478 pc->real = PyLong_AsDouble(obj);
479 if (pc->real == -1.0 && PyErr_Occurred()) {
480 *pobj = NULL;
481 return -1;
482 }
483 return 0;
484 }
485 if (PyFloat_Check(obj)) {
486 pc->real = PyFloat_AsDouble(obj);
487 return 0;
488 }
489 Py_INCREF(Py_NotImplemented);
490 *pobj = Py_NotImplemented;
491 return -1;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000492}
493
494
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000496complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000497{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000498 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000499 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000500 TO_COMPLEX(v, a);
501 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000502 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000503 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000504 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000506}
507
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000509complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000510{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000511 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000512 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000513 TO_COMPLEX(v, a);
514 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000515 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000516 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000517 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000519}
520
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000522complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000523{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000524 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000525 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000526 TO_COMPLEX(v, a);
527 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000528 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000529 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000530 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000532}
533
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000535complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000536{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000537 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000538 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000539 TO_COMPLEX(v, a);
540 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000541 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000542 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000543 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000544 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000545 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000547 return NULL;
548 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000550}
551
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000553complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000554{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000555 PyErr_SetString(PyExc_TypeError,
556 "can't mod complex numbers.");
557 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000558}
559
Guido van Rossumee09fc11996-09-11 13:55:55 +0000560
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000562complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000563{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000564 PyErr_SetString(PyExc_TypeError,
565 "can't take floor or mod of complex number.");
566 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000567}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000568
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000570complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000571{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000572 Py_complex p;
573 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000574 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000575 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000576 TO_COMPLEX(v, a);
577 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000578
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000579 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000581 return NULL;
582 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000583 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000584 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000585 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000586 int_exponent = (long)exponent.real;
587 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000588 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000589 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000590 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000591
Guido van Rossum45b83911997-03-14 04:32:50 +0000592 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000593 Py_ADJUST_ERANGE2(p.real, p.imag);
594 if (errno == EDOM) {
595 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000597 return NULL;
598 }
Tim Petersbab22be2002-03-22 02:48:46 +0000599 else if (errno == ERANGE) {
600 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000601 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000602 return NULL;
603 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000605}
606
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000608complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000609{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000610 PyErr_SetString(PyExc_TypeError,
611 "can't take floor of complex number.");
Guido van Rossum4668b002001-08-08 05:00:18 +0000612 return NULL;
613}
614
615static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000616complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000617{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000618 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000619 neg.real = -v->cval.real;
620 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000622}
623
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000625complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000626{
Tim Peters2400fa42001-09-12 19:12:49 +0000627 if (PyComplex_CheckExact(v)) {
628 Py_INCREF(v);
629 return (PyObject *)v;
630 }
631 else
632 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000633}
634
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000636complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000638 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000639
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000640 PyFPE_START_PROTECT("complex_abs", return 0)
Christian Heimes53876d92008-04-19 00:31:39 +0000641 result = c_abs(v->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000642 PyFPE_END_PROTECT(result)
Christian Heimes53876d92008-04-19 00:31:39 +0000643
644 if (errno == ERANGE) {
645 PyErr_SetString(PyExc_OverflowError,
646 "absolute value too large");
647 return NULL;
648 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000650}
651
652static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000653complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000654{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000655 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000656}
657
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000659complex_richcompare(PyObject *v, PyObject *w, int op)
660{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000661 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000662 Py_complex i, j;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000663 TO_COMPLEX(v, i);
664 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000665
Guido van Rossum22056422001-09-24 17:52:04 +0000666 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000667 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000668 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000669 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000670 return NULL;
671 }
672
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000673 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
674 res = Py_True;
675 else
676 res = Py_False;
677
678 Py_INCREF(res);
679 return res;
680}
681
682static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000683complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000684{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000686 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000687 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000688}
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000691complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000692{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000694 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000695 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000696}
697
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000698static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000699complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000700{
Guido van Rossum926518b1996-08-19 19:30:45 +0000701 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000702 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000703 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000705}
706
Guido van Rossum46334cd2007-08-01 17:43:15 +0000707PyDoc_STRVAR(complex_conjugate_doc,
708"complex.conjugate() -> complex\n"
709"\n"
710"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
711
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000712static PyObject *
713complex_getnewargs(PyComplexObject *v)
714{
Georg Brandl0c77a822008-06-10 16:37:50 +0000715 Py_complex c = v->cval;
716 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000717}
718
Christian Heimes53876d92008-04-19 00:31:39 +0000719#if 0
720static PyObject *
721complex_is_finite(PyObject *self)
722{
723 Py_complex c;
724 c = ((PyComplexObject *)self)->cval;
725 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
726 Py_IS_FINITE(c.imag)));
727}
728
729PyDoc_STRVAR(complex_is_finite_doc,
730"complex.is_finite() -> bool\n"
731"\n"
732"Returns True if the real and the imaginary part is finite.");
733#endif
734
Guido van Rossumf9fca921996-01-12 00:47:05 +0000735static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000736 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
737 complex_conjugate_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000738#if 0
739 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
740 complex_is_finite_doc},
741#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000742 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000743 {NULL, NULL} /* sentinel */
744};
745
Guido van Rossum6f799372001-09-20 20:46:19 +0000746static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000747 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000748 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000749 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000750 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000751 {0},
752};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000753
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000755complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000756{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000757 const char *s, *start;
758 char *end;
759 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000760 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000761 int digit_or_dot;
762 int sw_error=0;
763 int sign;
764 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000765 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000766 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000767
Neal Norwitzed2b7392007-08-26 04:51:10 +0000768 if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000769 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000770 PyErr_SetString(PyExc_ValueError,
771 "complex() literal too large to convert");
772 return NULL;
773 }
774 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
775 PyUnicode_GET_SIZE(v),
776 s_buffer,
777 NULL))
778 return NULL;
779 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000780 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000781 }
782 else if (PyObject_AsCharBuffer(v, &s, &len)) {
783 PyErr_SetString(PyExc_TypeError,
784 "complex() arg is not a string");
785 return NULL;
786 }
787
788 /* position on first nonblank */
789 start = s;
790 while (*s && isspace(Py_CHARMASK(*s)))
791 s++;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000792 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793 PyErr_SetString(PyExc_ValueError,
794 "complex() arg is an empty string");
795 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000796 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000797 if (s[0] == '(') {
798 /* Skip over possible bracket from repr(). */
799 got_bracket = 1;
800 s++;
801 while (*s && isspace(Py_CHARMASK(*s)))
802 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 }
804
805 z = -1.0;
806 sign = 1;
807 do {
808
809 switch (*s) {
810
811 case '\0':
812 if (s-start != len) {
813 PyErr_SetString(
814 PyExc_ValueError,
815 "complex() arg contains a null byte");
816 return NULL;
817 }
818 if(!done) sw_error=1;
819 break;
820
Guido van Rossumd8faa362007-04-27 19:54:29 +0000821 case ')':
822 if (!got_bracket || !(got_re || got_im)) {
823 sw_error=1;
824 break;
825 }
826 got_bracket=0;
827 done=1;
828 s++;
829 while (*s && isspace(Py_CHARMASK(*s)))
830 s++;
831 if (*s) sw_error=1;
832 break;
833
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 case '-':
835 sign = -1;
836 /* Fallthrough */
837 case '+':
838 if (done) sw_error=1;
839 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000840 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 isspace(Py_CHARMASK(*s)) ) sw_error=1;
842 break;
843
844 case 'J':
845 case 'j':
846 if (got_im || done) {
847 sw_error = 1;
848 break;
849 }
850 if (z<0.0) {
851 y=sign;
852 }
853 else{
854 y=sign*z;
855 }
856 got_im=1;
857 s++;
858 if (*s!='+' && *s!='-' )
859 done=1;
860 break;
861
862 default:
863 if (isspace(Py_CHARMASK(*s))) {
864 while (*s && isspace(Py_CHARMASK(*s)))
865 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000866 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867 sw_error=1;
868 else
869 done = 1;
870 break;
871 }
872 digit_or_dot =
873 (*s=='.' || isdigit(Py_CHARMASK(*s)));
874 if (done||!digit_or_dot) {
875 sw_error=1;
876 break;
877 }
878 errno = 0;
879 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000880 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000881 PyFPE_END_PROTECT(z)
882 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000883 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000884 "float() out of range: %.150s", s);
885 PyErr_SetString(
886 PyExc_ValueError,
887 buffer);
888 return NULL;
889 }
890 s=end;
891 if (*s=='J' || *s=='j') {
892
893 break;
894 }
895 if (got_re) {
896 sw_error=1;
897 break;
898 }
899
900 /* accept a real part */
901 x=sign*z;
902 got_re=1;
903 if (got_im) done=1;
904 z = -1.0;
905 sign = 1;
906 break;
907
908 } /* end of switch */
909
Tim Peters077f2712002-04-14 22:04:03 +0000910 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000911
Guido van Rossumd8faa362007-04-27 19:54:29 +0000912 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000913 PyErr_SetString(PyExc_ValueError,
914 "complex() arg is a malformed string");
915 return NULL;
916 }
917
918 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000919}
920
Tim Peters6d6c1a32001-08-02 04:15:00 +0000921static PyObject *
922complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
923{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000924 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000925 PyNumberMethods *nbr, *nbi = NULL;
926 Py_complex cr, ci;
927 int own_r = 0;
Christian Heimes69a79632007-11-28 10:04:30 +0000928 int cr_is_complex = 0;
929 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000930 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000931 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000932
933 r = Py_False;
934 i = NULL;
935 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
936 &r, &i))
937 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000938
Guido van Rossumd8faa362007-04-27 19:54:29 +0000939 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000940 if (PyComplex_CheckExact(r) && i == NULL &&
941 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000942 /* Note that we can't know whether it's safe to return
943 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000944 to exact complexes here. If either the input or the
945 output is a complex subclass, it will be handled below
946 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000947 Py_INCREF(r);
948 return r;
949 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000950 if (PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000951 if (i != NULL) {
952 PyErr_SetString(PyExc_TypeError,
953 "complex() can't take second arg"
954 " if first is a string");
955 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000956 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000958 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000959 if (i != NULL && PyUnicode_Check(i)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000960 PyErr_SetString(PyExc_TypeError,
961 "complex() second arg can't be a string");
962 return NULL;
963 }
Tim Peters2400fa42001-09-12 19:12:49 +0000964
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000965 /* XXX Hack to support classes with __complex__ method */
966 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000967 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000968 if (complexstr == NULL)
969 return NULL;
970 }
971 f = PyObject_GetAttr(r, complexstr);
972 if (f == NULL)
973 PyErr_Clear();
974 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000975 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000976 if (args == NULL)
977 return NULL;
978 r = PyEval_CallObject(f, args);
979 Py_DECREF(args);
980 Py_DECREF(f);
981 if (r == NULL)
982 return NULL;
983 own_r = 1;
984 }
Tim Peters2400fa42001-09-12 19:12:49 +0000985 nbr = r->ob_type->tp_as_number;
986 if (i != NULL)
987 nbi = i->ob_type->tp_as_number;
988 if (nbr == NULL || nbr->nb_float == NULL ||
989 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000990 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000991 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000992 if (own_r) {
993 Py_DECREF(r);
994 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995 return NULL;
996 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000997
998 /* If we get this far, then the "real" and "imag" parts should
999 both be treated as numbers, and the constructor should return a
1000 complex number equal to (real + imag*1j).
1001
1002 Note that we do NOT assume the input to already be in canonical
1003 form; the "real" and "imag" parts might themselves be complex
1004 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001005 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +00001006 /* Note that if r is of a complex subtype, we're only
1007 retaining its real & imag parts here, and the return
1008 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009 cr = ((PyComplexObject*)r)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +00001010 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001011 if (own_r) {
1012 Py_DECREF(r);
1013 }
1014 }
1015 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001016 /* The "real" part really is entirely real, and contributes
1017 nothing in the imaginary direction.
1018 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001019 tmp = PyNumber_Float(r);
1020 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001021 /* r was a newly created complex number, rather
1022 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001023 Py_DECREF(r);
1024 }
1025 if (tmp == NULL)
1026 return NULL;
1027 if (!PyFloat_Check(tmp)) {
1028 PyErr_SetString(PyExc_TypeError,
1029 "float(r) didn't return a float");
1030 Py_DECREF(tmp);
1031 return NULL;
1032 }
1033 cr.real = PyFloat_AsDouble(tmp);
Christian Heimes587c2bf2008-01-19 16:21:02 +00001034 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001035 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036 }
1037 if (i == NULL) {
1038 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039 }
Christian Heimes69a79632007-11-28 10:04:30 +00001040 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001041 ci = ((PyComplexObject*)i)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +00001042 ci_is_complex = 1;
1043 } else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001044 /* The "imag" part really is entirely imaginary, and
1045 contributes nothing in the real direction.
1046 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001047 tmp = (*nbi->nb_float)(i);
1048 if (tmp == NULL)
1049 return NULL;
1050 ci.real = PyFloat_AsDouble(tmp);
1051 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001052 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001053 /* If the input was in canonical form, then the "real" and "imag"
Christian Heimes69a79632007-11-28 10:04:30 +00001054 parts are real numbers, so that ci.imag and cr.imag are zero.
Guido van Rossumd8faa362007-04-27 19:54:29 +00001055 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001056
1057 if (ci_is_complex) {
1058 cr.real -= ci.imag;
1059 }
1060 if (cr_is_complex) {
1061 ci.real += cr.imag;
1062 }
1063 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064}
1065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001066PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001067"complex(real[, imag]) -> complex number\n"
1068"\n"
1069"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001070"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001073 (binaryfunc)complex_add, /* nb_add */
1074 (binaryfunc)complex_sub, /* nb_subtract */
1075 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001076 (binaryfunc)complex_remainder, /* nb_remainder */
1077 (binaryfunc)complex_divmod, /* nb_divmod */
1078 (ternaryfunc)complex_pow, /* nb_power */
1079 (unaryfunc)complex_neg, /* nb_negative */
1080 (unaryfunc)complex_pos, /* nb_positive */
1081 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00001082 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001083 0, /* nb_invert */
1084 0, /* nb_lshift */
1085 0, /* nb_rshift */
1086 0, /* nb_and */
1087 0, /* nb_xor */
1088 0, /* nb_or */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001089 complex_int, /* nb_int */
Mark Dickinson8055afd2009-01-17 10:04:45 +00001090 0, /* nb_reserved */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001091 complex_float, /* nb_float */
Guido van Rossum4668b002001-08-08 05:00:18 +00001092 0, /* nb_inplace_add */
1093 0, /* nb_inplace_subtract */
1094 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001095 0, /* nb_inplace_remainder */
1096 0, /* nb_inplace_power */
1097 0, /* nb_inplace_lshift */
1098 0, /* nb_inplace_rshift */
1099 0, /* nb_inplace_and */
1100 0, /* nb_inplace_xor */
1101 0, /* nb_inplace_or */
1102 (binaryfunc)complex_int_div, /* nb_floor_divide */
1103 (binaryfunc)complex_div, /* nb_true_divide */
1104 0, /* nb_inplace_floor_divide */
1105 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001106};
1107
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001108PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001109 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001110 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001111 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001112 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001113 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00001114 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001115 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001116 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00001117 0, /* tp_reserved */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001118 (reprfunc)complex_repr, /* tp_repr */
1119 &complex_as_number, /* tp_as_number */
1120 0, /* tp_as_sequence */
1121 0, /* tp_as_mapping */
1122 (hashfunc)complex_hash, /* tp_hash */
1123 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001124 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001125 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001126 0, /* tp_setattro */
1127 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001128 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1129 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001130 0, /* tp_traverse */
1131 0, /* tp_clear */
1132 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133 0, /* tp_weaklistoffset */
1134 0, /* tp_iter */
1135 0, /* tp_iternext */
1136 complex_methods, /* tp_methods */
1137 complex_members, /* tp_members */
1138 0, /* tp_getset */
1139 0, /* tp_base */
1140 0, /* tp_dict */
1141 0, /* tp_descr_get */
1142 0, /* tp_descr_set */
1143 0, /* tp_dictoffset */
1144 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001145 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001146 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001147 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001148};
1149
1150#endif