blob: 90b970eea9eafe4f77642b846d446e975de39c0b [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
Tim Peters70695122001-03-11 08:37:29 +000017/* Precisions used by repr() and str(), respectively.
18
19 The repr() precision (17 significant decimal digits) is the minimal number
20 that is guaranteed to have enough precision so that if the number is read
21 back in the exact same binary value is recreated. This is true for IEEE
22 floating point by design, and also happens to work for all other modern
23 hardware.
24
25 The str() precision is chosen so that in most cases, the rounding noise
26 created by various operations is suppressed, while giving plenty of
27 precision for practical use.
28*/
29
30#define PREC_REPR 17
31#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
33/* elementary operations on complex numbers */
34
Guido van Rossum9e720e31996-07-21 02:31:35 +000035static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000036
Tim Peters0f336042001-03-18 08:21:57 +000037Py_complex
38c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000039{
Guido van Rossum9e720e31996-07-21 02:31:35 +000040 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000041 r.real = a.real + b.real;
42 r.imag = a.imag + b.imag;
43 return r;
44}
45
Tim Peters0f336042001-03-18 08:21:57 +000046Py_complex
47c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000048{
Guido van Rossum9e720e31996-07-21 02:31:35 +000049 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000050 r.real = a.real - b.real;
51 r.imag = a.imag - b.imag;
52 return r;
53}
54
Tim Peters0f336042001-03-18 08:21:57 +000055Py_complex
56c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000057{
Guido van Rossum9e720e31996-07-21 02:31:35 +000058 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000059 r.real = -a.real;
60 r.imag = -a.imag;
61 return r;
62}
63
Tim Peters0f336042001-03-18 08:21:57 +000064Py_complex
65c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000066{
Guido van Rossum9e720e31996-07-21 02:31:35 +000067 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000068 r.real = a.real*b.real - a.imag*b.imag;
69 r.imag = a.real*b.imag + a.imag*b.real;
70 return r;
71}
72
Tim Peters0f336042001-03-18 08:21:57 +000073Py_complex
74c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000075{
Tim Peters0f336042001-03-18 08:21:57 +000076 /******************************************************************
77 This was the original algorithm. It's grossly prone to spurious
78 overflow and underflow errors. It also merrily divides by 0 despite
79 checking for that(!). The code still serves a doc purpose here, as
80 the algorithm following is a simple by-cases transformation of this
81 one:
82
Guido van Rossum9e720e31996-07-21 02:31:35 +000083 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000084 double d = b.real*b.real + b.imag*b.imag;
85 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000086 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000087 r.real = (a.real*b.real + a.imag*b.imag)/d;
88 r.imag = (a.imag*b.real - a.real*b.imag)/d;
89 return r;
Tim Peters0f336042001-03-18 08:21:57 +000090 ******************************************************************/
91
92 /* This algorithm is better, and is pretty obvious: first divide the
93 * numerators and denominator by whichever of {b.real, b.imag} has
94 * larger magnitude. The earliest reference I found was to CACM
95 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
96 * University). As usual, though, we're still ignoring all IEEE
97 * endcases.
98 */
99 Py_complex r; /* the result */
100 const double abs_breal = b.real < 0 ? -b.real : b.real;
101 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
102
103 if (abs_breal >= abs_bimag) {
104 /* divide tops and bottom by b.real */
105 if (abs_breal == 0.0) {
106 errno = EDOM;
107 r.real = r.imag = 0.0;
108 }
109 else {
110 const double ratio = b.imag / b.real;
111 const double denom = b.real + b.imag * ratio;
112 r.real = (a.real + a.imag * ratio) / denom;
113 r.imag = (a.imag - a.real * ratio) / denom;
114 }
115 }
116 else {
117 /* divide tops and bottom by b.imag */
118 const double ratio = b.real / b.imag;
119 const double denom = b.real * ratio + b.imag;
120 assert(b.imag != 0.0);
121 r.real = (a.real * ratio + a.imag) / denom;
122 r.imag = (a.imag * ratio - a.real) / denom;
123 }
124 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125}
126
Tim Peters0f336042001-03-18 08:21:57 +0000127Py_complex
128c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000129{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000130 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000131 double vabs,len,at,phase;
132 if (b.real == 0. && b.imag == 0.) {
133 r.real = 1.;
134 r.imag = 0.;
135 }
136 else if (a.real == 0. && a.imag == 0.) {
137 if (b.imag != 0. || b.real < 0.)
Tim Petersbab22be2002-03-22 02:48:46 +0000138 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000139 r.real = 0.;
140 r.imag = 0.;
141 }
142 else {
143 vabs = hypot(a.real,a.imag);
144 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000145 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000146 phase = at*b.real;
147 if (b.imag != 0.0) {
148 len /= exp(at*b.imag);
149 phase += b.imag*log(vabs);
150 }
151 r.real = len*cos(phase);
152 r.imag = len*sin(phase);
153 }
154 return r;
155}
156
Tim Peters0f336042001-03-18 08:21:57 +0000157static Py_complex
158c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000159{
Guido van Rossum926518b1996-08-19 19:30:45 +0000160 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000161 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000162 r = c_1;
163 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000164 while (mask > 0 && n >= mask) {
165 if (n & mask)
166 r = c_prod(r,p);
167 mask <<= 1;
168 p = c_prod(p,p);
169 }
170 return r;
171}
172
Tim Peters0f336042001-03-18 08:21:57 +0000173static Py_complex
174c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000175{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000176 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000177
178 if (n > 100 || n < -100) {
179 cn.real = (double) n;
180 cn.imag = 0.;
181 return c_pow(x,cn);
182 }
183 else if (n > 0)
184 return c_powu(x,n);
185 else
186 return c_quot(c_1,c_powu(x,-n));
187
188}
189
Tim Peters6d6c1a32001-08-02 04:15:00 +0000190static PyObject *
191complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
192{
193 PyObject *op;
194
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000195 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000196 if (op != NULL)
197 ((PyComplexObject *)op)->cval = cval;
198 return op;
199}
200
Guido van Rossumf9fca921996-01-12 00:47:05 +0000201PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000202PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000203{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000204 register PyComplexObject *op;
205
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000206 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000207 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000208 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000210 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000211 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000213}
214
Tim Peters6d6c1a32001-08-02 04:15:00 +0000215static PyObject *
216complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
217{
218 Py_complex c;
219 c.real = real;
220 c.imag = imag;
221 return complex_subtype_from_c_complex(type, c);
222}
223
Guido van Rossumf9fca921996-01-12 00:47:05 +0000224PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000225PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000226{
227 Py_complex c;
228 c.real = real;
229 c.imag = imag;
230 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000231}
232
233double
Fred Drake4288c802000-07-09 04:36:04 +0000234PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000235{
236 if (PyComplex_Check(op)) {
237 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000238 }
239 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000240 return PyFloat_AsDouble(op);
241 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000242}
243
244double
Fred Drake4288c802000-07-09 04:36:04 +0000245PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000246{
247 if (PyComplex_Check(op)) {
248 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000249 }
250 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000251 return 0.0;
252 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000253}
254
Guido van Rossum9e720e31996-07-21 02:31:35 +0000255Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000256PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000257{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000258 Py_complex cv;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000259 PyObject *newop = NULL;
260 static PyObject *complex_str = NULL;
261
262 assert(op);
263 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000264 if (PyComplex_Check(op)) {
265 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000266 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000267 /* If not, use op's __complex__ method, if it exists */
268
269 /* return -1 on failure */
270 cv.real = -1.;
271 cv.imag = 0.;
Christian Heimesfe82e772008-01-28 02:38:20 +0000272
273 if (complex_str == NULL) {
274 if (!(complex_str = PyUnicode_FromString("__complex__")))
275 return cv;
276 }
277
Guido van Rossumd8faa362007-04-27 19:54:29 +0000278 {
279 PyObject *complexfunc;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000280 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
281 /* complexfunc is a borrowed reference */
282 if (complexfunc) {
283 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
284 if (!newop)
285 return cv;
286 }
287 }
288
289 if (newop) {
290 if (!PyComplex_Check(newop)) {
291 PyErr_SetString(PyExc_TypeError,
292 "__complex__ should return a complex object");
293 Py_DECREF(newop);
294 return cv;
295 }
296 cv = ((PyComplexObject *)newop)->cval;
297 Py_DECREF(newop);
298 return cv;
299 }
300 /* If neither of the above works, interpret op as a float giving the
301 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000302 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000303 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000304 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000305 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000306 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000307}
308
Guido van Rossumf9fca921996-01-12 00:47:05 +0000309static void
Fred Drake4288c802000-07-09 04:36:04 +0000310complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000311{
Guido van Rossum9475a232001-10-05 20:51:39 +0000312 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000313}
314
315
Guido van Rossum363078a1996-05-24 20:45:01 +0000316static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000317complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000318{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000319 char format[32];
320 if (v->cval.real == 0.) {
Christian Heimesa156e092008-02-16 07:38:31 +0000321 if (!Py_IS_FINITE(v->cval.imag)) {
322 if (Py_IS_NAN(v->cval.imag))
323 strncpy(buf, "nan*j", 6);
324 /* else if (copysign(1, v->cval.imag) == 1) */
325 else if (v->cval.imag > 0)
326 strncpy(buf, "inf*j", 6);
327 else
328 strncpy(buf, "-inf*j", 7);
329 }
330 else {
331 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
332 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
333 strncat(buf, "j", 1);
334 }
Martin v. Löwis737ea822004-06-08 18:52:54 +0000335 } else {
336 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000337 /* Format imaginary part with sign, real part without */
Christian Heimesa156e092008-02-16 07:38:31 +0000338 if (!Py_IS_FINITE(v->cval.real)) {
339 if (Py_IS_NAN(v->cval.real))
340 strncpy(re, "nan", 4);
341 /* else if (copysign(1, v->cval.real) == 1) */
342 else if (v->cval.real > 0)
343 strncpy(re, "inf", 4);
344 else
345 strncpy(re, "-inf", 5);
346 }
347 else {
348 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
349 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
350 }
351 if (!Py_IS_FINITE(v->cval.imag)) {
352 if (Py_IS_NAN(v->cval.imag))
353 strncpy(im, "+nan*", 6);
354 /* else if (copysign(1, v->cval.imag) == 1) */
355 else if (v->cval.imag > 0)
356 strncpy(im, "+inf*", 6);
357 else
358 strncpy(im, "-inf*", 6);
359 }
360 else {
361 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
362 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
363 }
Georg Brandlc404ff22005-09-16 06:42:26 +0000364 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000365 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366}
367
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000369complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000370{
371 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000372 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000373 return PyUnicode_FromString(buf);
Tim Peters70695122001-03-11 08:37:29 +0000374}
375
376static PyObject *
377complex_str(PyComplexObject *v)
378{
379 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000380 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Walter Dörwald7696ed72007-05-31 15:51:35 +0000381 return PyUnicode_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000382}
383
Guido van Rossumf9fca921996-01-12 00:47:05 +0000384static long
Fred Drake4288c802000-07-09 04:36:04 +0000385complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000386{
Tim Peters39dce292000-08-15 03:34:48 +0000387 long hashreal, hashimag, combined;
388 hashreal = _Py_HashDouble(v->cval.real);
389 if (hashreal == -1)
390 return -1;
391 hashimag = _Py_HashDouble(v->cval.imag);
392 if (hashimag == -1)
393 return -1;
394 /* Note: if the imaginary part is 0, hashimag is 0 now,
395 * so the following returns hashreal unchanged. This is
396 * important because numbers of different types that
397 * compare equal must have the same hash value, so that
398 * hash(x + 0*j) must equal hash(x).
399 */
400 combined = hashreal + 1000003 * hashimag;
401 if (combined == -1)
402 combined = -2;
403 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000404}
405
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000406/* This macro may return! */
407#define TO_COMPLEX(obj, c) \
408 if (PyComplex_Check(obj)) \
409 c = ((PyComplexObject *)(obj))->cval; \
410 else if (to_complex(&(obj), &(c)) < 0) \
411 return (obj)
412
413static int
414to_complex(PyObject **pobj, Py_complex *pc)
415{
Christian Heimes587c2bf2008-01-19 16:21:02 +0000416 PyObject *obj = *pobj;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000417
Christian Heimes587c2bf2008-01-19 16:21:02 +0000418 pc->real = pc->imag = 0.0;
419 if (PyLong_Check(obj)) {
420 pc->real = PyLong_AsDouble(obj);
421 if (pc->real == -1.0 && PyErr_Occurred()) {
422 *pobj = NULL;
423 return -1;
424 }
425 return 0;
426 }
427 if (PyFloat_Check(obj)) {
428 pc->real = PyFloat_AsDouble(obj);
429 return 0;
430 }
431 Py_INCREF(Py_NotImplemented);
432 *pobj = Py_NotImplemented;
433 return -1;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000434}
435
436
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000438complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000439{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000440 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000441 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000442 TO_COMPLEX(v, a);
443 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000444 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000445 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000446 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000448}
449
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000451complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000452{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000453 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000454 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000455 TO_COMPLEX(v, a);
456 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000457 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000458 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000459 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000461}
462
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000464complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000465{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000466 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000467 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000468 TO_COMPLEX(v, a);
469 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000470 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000471 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000472 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000474}
475
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000476static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000477complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000478{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000479 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000480 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000481 TO_COMPLEX(v, a);
482 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000483 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000484 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000485 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000486 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000487 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000489 return NULL;
490 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000492}
493
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000495complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000496{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000497 PyErr_SetString(PyExc_TypeError,
498 "can't mod complex numbers.");
499 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000500}
501
Guido van Rossumee09fc11996-09-11 13:55:55 +0000502
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000504complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000505{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000506 PyErr_SetString(PyExc_TypeError,
507 "can't take floor or mod of complex number.");
508 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000509}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000512complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000513{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000514 Py_complex p;
515 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000516 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000517 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000518 TO_COMPLEX(v, a);
519 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000520
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000521 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000523 return NULL;
524 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000525 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000526 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000527 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000528 int_exponent = (long)exponent.real;
529 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000530 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000531 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000532 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000533
Guido van Rossum45b83911997-03-14 04:32:50 +0000534 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000535 Py_ADJUST_ERANGE2(p.real, p.imag);
536 if (errno == EDOM) {
537 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539 return NULL;
540 }
Tim Petersbab22be2002-03-22 02:48:46 +0000541 else if (errno == ERANGE) {
542 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000543 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000544 return NULL;
545 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000547}
548
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000550complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000551{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000552 PyErr_SetString(PyExc_TypeError,
553 "can't take floor of complex number.");
Guido van Rossum4668b002001-08-08 05:00:18 +0000554 return NULL;
555}
556
557static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000558complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000559{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000560 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000561 neg.real = -v->cval.real;
562 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000564}
565
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000567complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000568{
Tim Peters2400fa42001-09-12 19:12:49 +0000569 if (PyComplex_CheckExact(v)) {
570 Py_INCREF(v);
571 return (PyObject *)v;
572 }
573 else
574 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000575}
576
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000578complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000579{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000580 double result;
581 PyFPE_START_PROTECT("complex_abs", return 0)
582 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000583 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000585}
586
587static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000588complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000589{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000590 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000591}
592
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000594complex_richcompare(PyObject *v, PyObject *w, int op)
595{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000596 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000597 Py_complex i, j;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000598 TO_COMPLEX(v, i);
599 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000600
Guido van Rossum22056422001-09-24 17:52:04 +0000601 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000602 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000603 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000604 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000605 return NULL;
606 }
607
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000608 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
609 res = Py_True;
610 else
611 res = Py_False;
612
613 Py_INCREF(res);
614 return res;
615}
616
617static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000618complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000619{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000621 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000622 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000623}
624
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000626complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000627{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000629 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000630 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000631}
632
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000634complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000635{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000637 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000638 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000639}
640
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000642complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000643{
Guido van Rossum926518b1996-08-19 19:30:45 +0000644 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000645 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000646 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000648}
649
Guido van Rossum46334cd2007-08-01 17:43:15 +0000650PyDoc_STRVAR(complex_conjugate_doc,
651"complex.conjugate() -> complex\n"
652"\n"
653"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
654
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000655static PyObject *
656complex_getnewargs(PyComplexObject *v)
657{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000658 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000659}
660
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000662 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
663 complex_conjugate_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000664 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000665 {NULL, NULL} /* sentinel */
666};
667
Guido van Rossum6f799372001-09-20 20:46:19 +0000668static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000669 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000670 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000671 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000672 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 {0},
674};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000675
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000677complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000678{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000679 const char *s, *start;
680 char *end;
681 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000682 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000683 int digit_or_dot;
684 int sw_error=0;
685 int sign;
686 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000687 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000688 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000689
Neal Norwitzed2b7392007-08-26 04:51:10 +0000690 if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000691 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000692 PyErr_SetString(PyExc_ValueError,
693 "complex() literal too large to convert");
694 return NULL;
695 }
696 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
697 PyUnicode_GET_SIZE(v),
698 s_buffer,
699 NULL))
700 return NULL;
701 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000702 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000703 }
704 else if (PyObject_AsCharBuffer(v, &s, &len)) {
705 PyErr_SetString(PyExc_TypeError,
706 "complex() arg is not a string");
707 return NULL;
708 }
709
710 /* position on first nonblank */
711 start = s;
712 while (*s && isspace(Py_CHARMASK(*s)))
713 s++;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000714 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000715 PyErr_SetString(PyExc_ValueError,
716 "complex() arg is an empty string");
717 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000718 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000719 if (s[0] == '(') {
720 /* Skip over possible bracket from repr(). */
721 got_bracket = 1;
722 s++;
723 while (*s && isspace(Py_CHARMASK(*s)))
724 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000725 }
726
727 z = -1.0;
728 sign = 1;
729 do {
730
731 switch (*s) {
732
733 case '\0':
734 if (s-start != len) {
735 PyErr_SetString(
736 PyExc_ValueError,
737 "complex() arg contains a null byte");
738 return NULL;
739 }
740 if(!done) sw_error=1;
741 break;
742
Guido van Rossumd8faa362007-04-27 19:54:29 +0000743 case ')':
744 if (!got_bracket || !(got_re || got_im)) {
745 sw_error=1;
746 break;
747 }
748 got_bracket=0;
749 done=1;
750 s++;
751 while (*s && isspace(Py_CHARMASK(*s)))
752 s++;
753 if (*s) sw_error=1;
754 break;
755
Tim Peters6d6c1a32001-08-02 04:15:00 +0000756 case '-':
757 sign = -1;
758 /* Fallthrough */
759 case '+':
760 if (done) sw_error=1;
761 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000762 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000763 isspace(Py_CHARMASK(*s)) ) sw_error=1;
764 break;
765
766 case 'J':
767 case 'j':
768 if (got_im || done) {
769 sw_error = 1;
770 break;
771 }
772 if (z<0.0) {
773 y=sign;
774 }
775 else{
776 y=sign*z;
777 }
778 got_im=1;
779 s++;
780 if (*s!='+' && *s!='-' )
781 done=1;
782 break;
783
784 default:
785 if (isspace(Py_CHARMASK(*s))) {
786 while (*s && isspace(Py_CHARMASK(*s)))
787 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000788 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789 sw_error=1;
790 else
791 done = 1;
792 break;
793 }
794 digit_or_dot =
795 (*s=='.' || isdigit(Py_CHARMASK(*s)));
796 if (done||!digit_or_dot) {
797 sw_error=1;
798 break;
799 }
800 errno = 0;
801 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000802 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 PyFPE_END_PROTECT(z)
804 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000805 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000806 "float() out of range: %.150s", s);
807 PyErr_SetString(
808 PyExc_ValueError,
809 buffer);
810 return NULL;
811 }
812 s=end;
813 if (*s=='J' || *s=='j') {
814
815 break;
816 }
817 if (got_re) {
818 sw_error=1;
819 break;
820 }
821
822 /* accept a real part */
823 x=sign*z;
824 got_re=1;
825 if (got_im) done=1;
826 z = -1.0;
827 sign = 1;
828 break;
829
830 } /* end of switch */
831
Tim Peters077f2712002-04-14 22:04:03 +0000832 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000833
Guido van Rossumd8faa362007-04-27 19:54:29 +0000834 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000835 PyErr_SetString(PyExc_ValueError,
836 "complex() arg is a malformed string");
837 return NULL;
838 }
839
840 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000841}
842
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843static PyObject *
844complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
845{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000846 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 PyNumberMethods *nbr, *nbi = NULL;
848 Py_complex cr, ci;
849 int own_r = 0;
Christian Heimes69a79632007-11-28 10:04:30 +0000850 int cr_is_complex = 0;
851 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000852 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000853 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854
855 r = Py_False;
856 i = NULL;
857 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
858 &r, &i))
859 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000860
Guido van Rossumd8faa362007-04-27 19:54:29 +0000861 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000862 if (PyComplex_CheckExact(r) && i == NULL &&
863 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000864 /* Note that we can't know whether it's safe to return
865 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000866 to exact complexes here. If either the input or the
867 output is a complex subclass, it will be handled below
868 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000869 Py_INCREF(r);
870 return r;
871 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000872 if (PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000873 if (i != NULL) {
874 PyErr_SetString(PyExc_TypeError,
875 "complex() can't take second arg"
876 " if first is a string");
877 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000878 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000880 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000881 if (i != NULL && PyUnicode_Check(i)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000882 PyErr_SetString(PyExc_TypeError,
883 "complex() second arg can't be a string");
884 return NULL;
885 }
Tim Peters2400fa42001-09-12 19:12:49 +0000886
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000887 /* XXX Hack to support classes with __complex__ method */
888 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000889 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000890 if (complexstr == NULL)
891 return NULL;
892 }
893 f = PyObject_GetAttr(r, complexstr);
894 if (f == NULL)
895 PyErr_Clear();
896 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000897 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000898 if (args == NULL)
899 return NULL;
900 r = PyEval_CallObject(f, args);
901 Py_DECREF(args);
902 Py_DECREF(f);
903 if (r == NULL)
904 return NULL;
905 own_r = 1;
906 }
Tim Peters2400fa42001-09-12 19:12:49 +0000907 nbr = r->ob_type->tp_as_number;
908 if (i != NULL)
909 nbi = i->ob_type->tp_as_number;
910 if (nbr == NULL || nbr->nb_float == NULL ||
911 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000912 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000913 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000914 if (own_r) {
915 Py_DECREF(r);
916 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000917 return NULL;
918 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000919
920 /* If we get this far, then the "real" and "imag" parts should
921 both be treated as numbers, and the constructor should return a
922 complex number equal to (real + imag*1j).
923
924 Note that we do NOT assume the input to already be in canonical
925 form; the "real" and "imag" parts might themselves be complex
926 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000927 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000928 /* Note that if r is of a complex subtype, we're only
929 retaining its real & imag parts here, and the return
930 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931 cr = ((PyComplexObject*)r)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +0000932 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000933 if (own_r) {
934 Py_DECREF(r);
935 }
936 }
937 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000938 /* The "real" part really is entirely real, and contributes
939 nothing in the imaginary direction.
940 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000941 tmp = PyNumber_Float(r);
942 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000943 /* r was a newly created complex number, rather
944 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000945 Py_DECREF(r);
946 }
947 if (tmp == NULL)
948 return NULL;
949 if (!PyFloat_Check(tmp)) {
950 PyErr_SetString(PyExc_TypeError,
951 "float(r) didn't return a float");
952 Py_DECREF(tmp);
953 return NULL;
954 }
955 cr.real = PyFloat_AsDouble(tmp);
Christian Heimes587c2bf2008-01-19 16:21:02 +0000956 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000958 }
959 if (i == NULL) {
960 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000961 }
Christian Heimes69a79632007-11-28 10:04:30 +0000962 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000963 ci = ((PyComplexObject*)i)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +0000964 ci_is_complex = 1;
965 } else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000966 /* The "imag" part really is entirely imaginary, and
967 contributes nothing in the real direction.
968 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000969 tmp = (*nbi->nb_float)(i);
970 if (tmp == NULL)
971 return NULL;
972 ci.real = PyFloat_AsDouble(tmp);
973 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000975 /* If the input was in canonical form, then the "real" and "imag"
Christian Heimes69a79632007-11-28 10:04:30 +0000976 parts are real numbers, so that ci.imag and cr.imag are zero.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000977 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +0000978
979 if (ci_is_complex) {
980 cr.real -= ci.imag;
981 }
982 if (cr_is_complex) {
983 ci.real += cr.imag;
984 }
985 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000986}
987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000988PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000989"complex(real[, imag]) -> complex number\n"
990"\n"
991"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000992"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000993
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000994static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000995 (binaryfunc)complex_add, /* nb_add */
996 (binaryfunc)complex_sub, /* nb_subtract */
997 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000998 (binaryfunc)complex_remainder, /* nb_remainder */
999 (binaryfunc)complex_divmod, /* nb_divmod */
1000 (ternaryfunc)complex_pow, /* nb_power */
1001 (unaryfunc)complex_neg, /* nb_negative */
1002 (unaryfunc)complex_pos, /* nb_positive */
1003 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00001004 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001005 0, /* nb_invert */
1006 0, /* nb_lshift */
1007 0, /* nb_rshift */
1008 0, /* nb_and */
1009 0, /* nb_xor */
1010 0, /* nb_or */
Neil Schemenauer16c70752007-09-21 20:19:23 +00001011 0, /* nb_reserved */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012 complex_int, /* nb_int */
1013 complex_long, /* nb_long */
1014 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001015 0, /* nb_oct */
1016 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001017 0, /* nb_inplace_add */
1018 0, /* nb_inplace_subtract */
1019 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001020 0, /* nb_inplace_remainder */
1021 0, /* nb_inplace_power */
1022 0, /* nb_inplace_lshift */
1023 0, /* nb_inplace_rshift */
1024 0, /* nb_inplace_and */
1025 0, /* nb_inplace_xor */
1026 0, /* nb_inplace_or */
1027 (binaryfunc)complex_int_div, /* nb_floor_divide */
1028 (binaryfunc)complex_div, /* nb_true_divide */
1029 0, /* nb_inplace_floor_divide */
1030 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001031};
1032
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001034 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001035 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001036 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001037 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001038 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00001039 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001040 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001041 0, /* tp_setattr */
1042 0, /* tp_compare */
1043 (reprfunc)complex_repr, /* tp_repr */
1044 &complex_as_number, /* tp_as_number */
1045 0, /* tp_as_sequence */
1046 0, /* tp_as_mapping */
1047 (hashfunc)complex_hash, /* tp_hash */
1048 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001049 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001050 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001051 0, /* tp_setattro */
1052 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001053 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1054 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001055 0, /* tp_traverse */
1056 0, /* tp_clear */
1057 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001058 0, /* tp_weaklistoffset */
1059 0, /* tp_iter */
1060 0, /* tp_iternext */
1061 complex_methods, /* tp_methods */
1062 complex_members, /* tp_members */
1063 0, /* tp_getset */
1064 0, /* tp_base */
1065 0, /* tp_dict */
1066 0, /* tp_descr_get */
1067 0, /* tp_descr_set */
1068 0, /* tp_dictoffset */
1069 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001070 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001072 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001073};
1074
1075#endif