blob: 7594c886ece4b3cbcd4f8d0ad193518895162905 [file] [log] [blame]
Guido van Rossum96783941997-05-20 18:21:34 +00001
Guido van Rossumf9fca921996-01-12 00:47:05 +00002/* Complex object implementation */
3
4/* Borrows heavily from floatobject.c */
5
Guido van Rossum96783941997-05-20 18:21:34 +00006/* Submitted by Jim Hugunin */
7
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00009#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000010
Guido van Rossumf9fca921996-01-12 00:47:05 +000011/* elementary operations on complex numbers */
12
Guido van Rossum9e720e31996-07-21 02:31:35 +000013static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000014
Tim Peters0f336042001-03-18 08:21:57 +000015Py_complex
16c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018 Py_complex r;
19 r.real = a.real + b.real;
20 r.imag = a.imag + b.imag;
21 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000022}
23
Tim Peters0f336042001-03-18 08:21:57 +000024Py_complex
25c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 Py_complex r;
28 r.real = a.real - b.real;
29 r.imag = a.imag - b.imag;
30 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000031}
32
Tim Peters0f336042001-03-18 08:21:57 +000033Py_complex
34c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000036 Py_complex r;
37 r.real = -a.real;
38 r.imag = -a.imag;
39 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000040}
41
Tim Peters0f336042001-03-18 08:21:57 +000042Py_complex
43c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 Py_complex r;
46 r.real = a.real*b.real - a.imag*b.imag;
47 r.imag = a.real*b.imag + a.imag*b.real;
48 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000049}
50
Tim Peters0f336042001-03-18 08:21:57 +000051Py_complex
52c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 /******************************************************************
55 This was the original algorithm. It's grossly prone to spurious
56 overflow and underflow errors. It also merrily divides by 0 despite
57 checking for that(!). The code still serves a doc purpose here, as
58 the algorithm following is a simple by-cases transformation of this
59 one:
Tim Peters0f336042001-03-18 08:21:57 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 Py_complex r;
62 double d = b.real*b.real + b.imag*b.imag;
63 if (d == 0.)
64 errno = EDOM;
65 r.real = (a.real*b.real + a.imag*b.imag)/d;
66 r.imag = (a.imag*b.real - a.real*b.imag)/d;
67 return r;
68 ******************************************************************/
Tim Peters0f336042001-03-18 08:21:57 +000069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 /* This algorithm is better, and is pretty obvious: first divide the
71 * numerators and denominator by whichever of {b.real, b.imag} has
72 * larger magnitude. The earliest reference I found was to CACM
73 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
74 * University). As usual, though, we're still ignoring all IEEE
75 * endcases.
76 */
77 Py_complex r; /* the result */
78 const double abs_breal = b.real < 0 ? -b.real : b.real;
79 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
Tim Peters0f336042001-03-18 08:21:57 +000080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 if (abs_breal >= abs_bimag) {
82 /* divide tops and bottom by b.real */
83 if (abs_breal == 0.0) {
84 errno = EDOM;
85 r.real = r.imag = 0.0;
86 }
87 else {
88 const double ratio = b.imag / b.real;
89 const double denom = b.real + b.imag * ratio;
90 r.real = (a.real + a.imag * ratio) / denom;
91 r.imag = (a.imag - a.real * ratio) / denom;
92 }
93 }
94 else {
95 /* divide tops and bottom by b.imag */
96 const double ratio = b.real / b.imag;
97 const double denom = b.real * ratio + b.imag;
98 assert(b.imag != 0.0);
99 r.real = (a.real * ratio + a.imag) / denom;
100 r.imag = (a.imag * ratio - a.real) / denom;
101 }
102 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000103}
104
Tim Peters0f336042001-03-18 08:21:57 +0000105Py_complex
106c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 Py_complex r;
109 double vabs,len,at,phase;
110 if (b.real == 0. && b.imag == 0.) {
111 r.real = 1.;
112 r.imag = 0.;
113 }
114 else if (a.real == 0. && a.imag == 0.) {
115 if (b.imag != 0. || b.real < 0.)
116 errno = EDOM;
117 r.real = 0.;
118 r.imag = 0.;
119 }
120 else {
121 vabs = hypot(a.real,a.imag);
122 len = pow(vabs,b.real);
123 at = atan2(a.imag, a.real);
124 phase = at*b.real;
125 if (b.imag != 0.0) {
126 len /= exp(at*b.imag);
127 phase += b.imag*log(vabs);
128 }
129 r.real = len*cos(phase);
130 r.imag = len*sin(phase);
131 }
132 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000133}
134
Tim Peters0f336042001-03-18 08:21:57 +0000135static Py_complex
136c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 Py_complex r, p;
139 long mask = 1;
140 r = c_1;
141 p = x;
142 while (mask > 0 && n >= mask) {
143 if (n & mask)
144 r = c_prod(r,p);
145 mask <<= 1;
146 p = c_prod(p,p);
147 }
148 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000149}
150
Tim Peters0f336042001-03-18 08:21:57 +0000151static Py_complex
152c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 if (n > 100 || n < -100) {
157 cn.real = (double) n;
158 cn.imag = 0.;
159 return c_pow(x,cn);
160 }
161 else if (n > 0)
162 return c_powu(x,n);
163 else
164 return c_quot(c_1,c_powu(x,-n));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000165
166}
167
Christian Heimes53876d92008-04-19 00:31:39 +0000168double
169c_abs(Py_complex z)
170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
172 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
175 /* C99 rules: if either the real or the imaginary part is an
176 infinity, return infinity, even if the other part is a
177 NaN. */
178 if (Py_IS_INFINITY(z.real)) {
179 result = fabs(z.real);
180 errno = 0;
181 return result;
182 }
183 if (Py_IS_INFINITY(z.imag)) {
184 result = fabs(z.imag);
185 errno = 0;
186 return result;
187 }
188 /* either the real or imaginary part is a NaN,
189 and neither is infinite. Result should be NaN. */
190 return Py_NAN;
191 }
192 result = hypot(z.real, z.imag);
193 if (!Py_IS_FINITE(result))
194 errno = ERANGE;
195 else
196 errno = 0;
197 return result;
Christian Heimes53876d92008-04-19 00:31:39 +0000198}
199
Tim Peters6d6c1a32001-08-02 04:15:00 +0000200static PyObject *
201complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 PyObject *op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 op = type->tp_alloc(type, 0);
206 if (op != NULL)
207 ((PyComplexObject *)op)->cval = cval;
208 return op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000209}
210
Guido van Rossumf9fca921996-01-12 00:47:05 +0000211PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000212PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 register PyComplexObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 /* Inline PyObject_New */
217 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
218 if (op == NULL)
219 return PyErr_NoMemory();
220 PyObject_INIT(op, &PyComplex_Type);
221 op->cval = cval;
222 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000223}
224
Tim Peters6d6c1a32001-08-02 04:15:00 +0000225static PyObject *
226complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 Py_complex c;
229 c.real = real;
230 c.imag = imag;
231 return complex_subtype_from_c_complex(type, c);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000232}
233
Guido van Rossumf9fca921996-01-12 00:47:05 +0000234PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000235PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 Py_complex c;
238 c.real = real;
239 c.imag = imag;
240 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000241}
242
243double
Fred Drake4288c802000-07-09 04:36:04 +0000244PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 if (PyComplex_Check(op)) {
247 return ((PyComplexObject *)op)->cval.real;
248 }
249 else {
250 return PyFloat_AsDouble(op);
251 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000252}
253
254double
Fred Drake4288c802000-07-09 04:36:04 +0000255PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 if (PyComplex_Check(op)) {
258 return ((PyComplexObject *)op)->cval.imag;
259 }
260 else {
261 return 0.0;
262 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000263}
264
Benjamin Petersonaea44282010-01-04 01:10:28 +0000265static PyObject *
266try_complex_special_method(PyObject *op) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 PyObject *f;
268 static PyObject *complexstr;
Benjamin Petersonaea44282010-01-04 01:10:28 +0000269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 f = _PyObject_LookupSpecial(op, "__complex__", &complexstr);
271 if (f) {
272 PyObject *res = PyObject_CallFunctionObjArgs(f, NULL);
273 Py_DECREF(f);
274 return res;
275 }
276 return NULL;
Benjamin Petersonaea44282010-01-04 01:10:28 +0000277}
278
Guido van Rossum9e720e31996-07-21 02:31:35 +0000279Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000280PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 Py_complex cv;
283 PyObject *newop = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 assert(op);
286 /* If op is already of type PyComplex_Type, return its value */
287 if (PyComplex_Check(op)) {
288 return ((PyComplexObject *)op)->cval;
289 }
290 /* If not, use op's __complex__ method, if it exists */
Guido van Rossumd8faa362007-04-27 19:54:29 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 /* return -1 on failure */
293 cv.real = -1.;
294 cv.imag = 0.;
295
296 newop = try_complex_special_method(op);
297
298 if (newop) {
299 if (!PyComplex_Check(newop)) {
300 PyErr_SetString(PyExc_TypeError,
301 "__complex__ should return a complex object");
302 Py_DECREF(newop);
303 return cv;
304 }
305 cv = ((PyComplexObject *)newop)->cval;
306 Py_DECREF(newop);
307 return cv;
308 }
309 else if (PyErr_Occurred()) {
310 return cv;
311 }
312 /* If neither of the above works, interpret op as a float giving the
313 real part of the result, and fill in the imaginary part as 0. */
314 else {
315 /* PyFloat_AsDouble will return -1 on failure */
316 cv.real = PyFloat_AsDouble(op);
317 return cv;
318 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000319}
320
Guido van Rossumf9fca921996-01-12 00:47:05 +0000321static void
Fred Drake4288c802000-07-09 04:36:04 +0000322complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000325}
326
327
Eric Smith0923d1d2009-04-16 20:16:10 +0000328static PyObject *
Eric Smith63376222009-05-05 14:04:18 +0000329complex_format(PyComplexObject *v, int precision, char format_code)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 PyObject *result = NULL;
332 Py_ssize_t len;
Eric Smith0923d1d2009-04-16 20:16:10 +0000333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 /* If these are non-NULL, they'll need to be freed. */
335 char *pre = NULL;
336 char *im = NULL;
337 char *buf = NULL;
Eric Smith0923d1d2009-04-16 20:16:10 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 /* These do not need to be freed. re is either an alias
340 for pre or a pointer to a constant. lead and tail
341 are pointers to constants. */
342 char *re = NULL;
343 char *lead = "";
344 char *tail = "";
Eric Smith0923d1d2009-04-16 20:16:10 +0000345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
347 re = "";
348 im = PyOS_double_to_string(v->cval.imag, format_code,
349 precision, 0, NULL);
350 if (!im) {
351 PyErr_NoMemory();
352 goto done;
353 }
354 } else {
355 /* Format imaginary part with sign, real part without */
356 pre = PyOS_double_to_string(v->cval.real, format_code,
357 precision, 0, NULL);
358 if (!pre) {
359 PyErr_NoMemory();
360 goto done;
361 }
362 re = pre;
Eric Smith0923d1d2009-04-16 20:16:10 +0000363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 im = PyOS_double_to_string(v->cval.imag, format_code,
365 precision, Py_DTSF_SIGN, NULL);
366 if (!im) {
367 PyErr_NoMemory();
368 goto done;
369 }
370 lead = "(";
371 tail = ")";
372 }
373 /* Alloc the final buffer. Add one for the "j" in the format string,
374 and one for the trailing zero. */
375 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
376 buf = PyMem_Malloc(len);
377 if (!buf) {
378 PyErr_NoMemory();
379 goto done;
380 }
381 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
382 result = PyUnicode_FromString(buf);
Mark Dickinsonad476da2009-04-23 19:14:16 +0000383 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 PyMem_Free(im);
385 PyMem_Free(pre);
386 PyMem_Free(buf);
Eric Smith0923d1d2009-04-16 20:16:10 +0000387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 return result;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000389}
390
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000392complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000393{
Eric Smith63376222009-05-05 14:04:18 +0000394 return complex_format(v, 0, 'r');
Tim Peters70695122001-03-11 08:37:29 +0000395}
396
397static PyObject *
398complex_str(PyComplexObject *v)
399{
Eric Smith63376222009-05-05 14:04:18 +0000400 return complex_format(v, PyFloat_STR_PRECISION, 'g');
Guido van Rossumf9fca921996-01-12 00:47:05 +0000401}
402
Guido van Rossumf9fca921996-01-12 00:47:05 +0000403static long
Fred Drake4288c802000-07-09 04:36:04 +0000404complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000405{
Mark Dickinsondc787d22010-05-23 13:33:13 +0000406 unsigned long hashreal, hashimag, combined;
407 hashreal = (unsigned long)_Py_HashDouble(v->cval.real);
408 if (hashreal == (unsigned long)-1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 return -1;
Mark Dickinsondc787d22010-05-23 13:33:13 +0000410 hashimag = (unsigned long)_Py_HashDouble(v->cval.imag);
411 if (hashimag == (unsigned long)-1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 return -1;
413 /* Note: if the imaginary part is 0, hashimag is 0 now,
414 * so the following returns hashreal unchanged. This is
415 * important because numbers of different types that
416 * compare equal must have the same hash value, so that
417 * hash(x + 0*j) must equal hash(x).
418 */
Mark Dickinsondc787d22010-05-23 13:33:13 +0000419 combined = hashreal + _PyHASH_IMAG * hashimag;
420 if (combined == (unsigned long)-1)
421 combined = (unsigned long)-2;
422 return (long)combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000423}
424
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000425/* This macro may return! */
426#define TO_COMPLEX(obj, c) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 if (PyComplex_Check(obj)) \
428 c = ((PyComplexObject *)(obj))->cval; \
429 else if (to_complex(&(obj), &(c)) < 0) \
430 return (obj)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000431
432static int
433to_complex(PyObject **pobj, Py_complex *pc)
434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 PyObject *obj = *pobj;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 pc->real = pc->imag = 0.0;
438 if (PyLong_Check(obj)) {
439 pc->real = PyLong_AsDouble(obj);
440 if (pc->real == -1.0 && PyErr_Occurred()) {
441 *pobj = NULL;
442 return -1;
443 }
444 return 0;
445 }
446 if (PyFloat_Check(obj)) {
447 pc->real = PyFloat_AsDouble(obj);
448 return 0;
449 }
450 Py_INCREF(Py_NotImplemented);
451 *pobj = Py_NotImplemented;
452 return -1;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000453}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000455
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000457complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 Py_complex result;
460 Py_complex a, b;
461 TO_COMPLEX(v, a);
462 TO_COMPLEX(w, b);
463 PyFPE_START_PROTECT("complex_add", return 0)
464 result = c_sum(a, b);
465 PyFPE_END_PROTECT(result)
466 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000467}
468
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000470complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 Py_complex result;
473 Py_complex a, b;
474 TO_COMPLEX(v, a);
475 TO_COMPLEX(w, b);
476 PyFPE_START_PROTECT("complex_sub", return 0)
477 result = c_diff(a, b);
478 PyFPE_END_PROTECT(result)
479 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000480}
481
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000483complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 Py_complex result;
486 Py_complex a, b;
487 TO_COMPLEX(v, a);
488 TO_COMPLEX(w, b);
489 PyFPE_START_PROTECT("complex_mul", return 0)
490 result = c_prod(a, b);
491 PyFPE_END_PROTECT(result)
492 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000493}
494
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000496complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 Py_complex quot;
499 Py_complex a, b;
500 TO_COMPLEX(v, a);
501 TO_COMPLEX(w, b);
502 PyFPE_START_PROTECT("complex_div", return 0)
503 errno = 0;
504 quot = c_quot(a, b);
505 PyFPE_END_PROTECT(quot)
506 if (errno == EDOM) {
507 PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero");
508 return NULL;
509 }
510 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000511}
512
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000514complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 PyErr_SetString(PyExc_TypeError,
517 "can't mod complex numbers.");
518 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000519}
520
Guido van Rossumee09fc11996-09-11 13:55:55 +0000521
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000523complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 PyErr_SetString(PyExc_TypeError,
526 "can't take floor or mod of complex number.");
527 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000528}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000529
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000531complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 Py_complex p;
534 Py_complex exponent;
535 long int_exponent;
536 Py_complex a, b;
537 TO_COMPLEX(v, a);
538 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (z != Py_None) {
541 PyErr_SetString(PyExc_ValueError, "complex modulo");
542 return NULL;
543 }
544 PyFPE_START_PROTECT("complex_pow", return 0)
545 errno = 0;
546 exponent = b;
547 int_exponent = (long)exponent.real;
548 if (exponent.imag == 0. && exponent.real == int_exponent)
549 p = c_powi(a, int_exponent);
550 else
551 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 PyFPE_END_PROTECT(p)
554 Py_ADJUST_ERANGE2(p.real, p.imag);
555 if (errno == EDOM) {
556 PyErr_SetString(PyExc_ZeroDivisionError,
557 "0.0 to a negative or complex power");
558 return NULL;
559 }
560 else if (errno == ERANGE) {
561 PyErr_SetString(PyExc_OverflowError,
562 "complex exponentiation");
563 return NULL;
564 }
565 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000566}
567
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000568static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000569complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 PyErr_SetString(PyExc_TypeError,
572 "can't take floor of complex number.");
573 return NULL;
Guido van Rossum4668b002001-08-08 05:00:18 +0000574}
575
576static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000577complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 Py_complex neg;
580 neg.real = -v->cval.real;
581 neg.imag = -v->cval.imag;
582 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000583}
584
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000585static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000586complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 if (PyComplex_CheckExact(v)) {
589 Py_INCREF(v);
590 return (PyObject *)v;
591 }
592 else
593 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000594}
595
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000596static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000597complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000598{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 PyFPE_START_PROTECT("complex_abs", return 0)
602 result = c_abs(v->cval);
603 PyFPE_END_PROTECT(result)
Christian Heimes53876d92008-04-19 00:31:39 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 if (errno == ERANGE) {
606 PyErr_SetString(PyExc_OverflowError,
607 "absolute value too large");
608 return NULL;
609 }
610 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000611}
612
613static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000614complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000617}
618
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000620complex_richcompare(PyObject *v, PyObject *w, int op)
621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 PyObject *res;
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000623 Py_complex i;
624 int equal;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 if (op != Py_EQ && op != Py_NE) {
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000627 goto Unimplemented;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 }
Guido van Rossum22056422001-09-24 17:52:04 +0000629
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000630 assert(PyComplex_Check(v));
631 TO_COMPLEX(v, i);
632
633 if (PyLong_Check(w)) {
634 /* Check for 0.0 imaginary part first to avoid the rich
635 * comparison when possible.
636 */
637 if (i.imag == 0.0) {
638 PyObject *j, *sub_res;
639 j = PyFloat_FromDouble(i.real);
640 if (j == NULL)
641 return NULL;
642
643 sub_res = PyObject_RichCompare(j, w, op);
644 Py_DECREF(j);
645 return sub_res;
646 }
647 else {
648 equal = 0;
649 }
650 }
651 else if (PyFloat_Check(w)) {
652 equal = (i.real == PyFloat_AsDouble(w) && i.imag == 0.0);
653 }
654 else if (PyComplex_Check(w)) {
655 Py_complex j;
656
657 TO_COMPLEX(w, j);
658 equal = (i.real == j.real && i.imag == j.imag);
659 }
660 else {
661 goto Unimplemented;
662 }
663
664 if (equal == (op == Py_EQ))
665 res = Py_True;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 else
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000667 res = Py_False;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 Py_INCREF(res);
670 return res;
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000671
672Unimplemented:
673 Py_INCREF(Py_NotImplemented);
674 return Py_NotImplemented;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000675}
676
677static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000678complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000679{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 PyErr_SetString(PyExc_TypeError,
681 "can't convert complex to int");
682 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000683}
684
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000686complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 PyErr_SetString(PyExc_TypeError,
689 "can't convert complex to float");
690 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000691}
692
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000694complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 Py_complex c;
697 c = ((PyComplexObject *)self)->cval;
698 c.imag = -c.imag;
699 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000700}
701
Guido van Rossum46334cd2007-08-01 17:43:15 +0000702PyDoc_STRVAR(complex_conjugate_doc,
703"complex.conjugate() -> complex\n"
704"\n"
705"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
706
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000707static PyObject *
708complex_getnewargs(PyComplexObject *v)
709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 Py_complex c = v->cval;
711 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000712}
713
Eric Smith58a42242009-04-30 01:00:33 +0000714PyDoc_STRVAR(complex__format__doc,
715"complex.__format__() -> str\n"
716"\n"
717"Converts to a string according to format_spec.");
718
719static PyObject *
720complex__format__(PyObject* self, PyObject* args)
721{
722 PyObject *format_spec;
723
724 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return NULL;
Eric Smith58a42242009-04-30 01:00:33 +0000726 return _PyComplex_FormatAdvanced(self,
727 PyUnicode_AS_UNICODE(format_spec),
728 PyUnicode_GET_SIZE(format_spec));
729}
730
Christian Heimes53876d92008-04-19 00:31:39 +0000731#if 0
732static PyObject *
733complex_is_finite(PyObject *self)
734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 Py_complex c;
736 c = ((PyComplexObject *)self)->cval;
737 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
738 Py_IS_FINITE(c.imag)));
Christian Heimes53876d92008-04-19 00:31:39 +0000739}
740
741PyDoc_STRVAR(complex_is_finite_doc,
742"complex.is_finite() -> bool\n"
743"\n"
744"Returns True if the real and the imaginary part is finite.");
745#endif
746
Guido van Rossumf9fca921996-01-12 00:47:05 +0000747static PyMethodDef complex_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
749 complex_conjugate_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000750#if 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
752 complex_is_finite_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
755 {"__format__", (PyCFunction)complex__format__,
756 METH_VARARGS, complex__format__doc},
757 {NULL, NULL} /* sentinel */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000758};
759
Guido van Rossum6f799372001-09-20 20:46:19 +0000760static PyMemberDef complex_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
762 "the real part of a complex number"},
763 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
764 "the imaginary part of a complex number"},
765 {0},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000766};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000767
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000768static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000769complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 const char *s, *start;
772 char *end;
773 double x=0.0, y=0.0, z;
774 int got_bracket=0;
775 char *s_buffer = NULL;
776 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 if (PyUnicode_Check(v)) {
779 s_buffer = (char *)PyMem_MALLOC(PyUnicode_GET_SIZE(v) + 1);
780 if (s_buffer == NULL)
781 return PyErr_NoMemory();
782 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
783 PyUnicode_GET_SIZE(v),
784 s_buffer,
785 NULL))
786 goto error;
787 s = s_buffer;
788 len = strlen(s);
789 }
790 else if (PyObject_AsCharBuffer(v, &s, &len)) {
791 PyErr_SetString(PyExc_TypeError,
792 "complex() arg is not a string");
793 return NULL;
794 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 /* position on first nonblank */
797 start = s;
798 while (Py_ISSPACE(*s))
799 s++;
800 if (*s == '(') {
801 /* Skip over possible bracket from repr(). */
802 got_bracket = 1;
803 s++;
804 while (Py_ISSPACE(*s))
805 s++;
806 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 /* a valid complex string usually takes one of the three forms:
Mark Dickinson6649fa42009-04-24 13:25:20 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 <float> - real part only
811 <float>j - imaginary part only
812 <float><signed-float>j - real and imaginary parts
Mark Dickinson6649fa42009-04-24 13:25:20 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 where <float> represents any numeric string that's accepted by the
815 float constructor (including 'nan', 'inf', 'infinity', etc.), and
816 <signed-float> is any string of the form <float> whose first
817 character is '+' or '-'.
Mark Dickinson6649fa42009-04-24 13:25:20 +0000818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 For backwards compatibility, the extra forms
Mark Dickinson6649fa42009-04-24 13:25:20 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 <float><sign>j
822 <sign>j
823 j
Mark Dickinson6649fa42009-04-24 13:25:20 +0000824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 are also accepted, though support for these forms may be removed from
826 a future version of Python.
827 */
Mark Dickinson6649fa42009-04-24 13:25:20 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 /* first look for forms starting with <float> */
830 z = PyOS_string_to_double(s, &end, NULL);
831 if (z == -1.0 && PyErr_Occurred()) {
832 if (PyErr_ExceptionMatches(PyExc_ValueError))
833 PyErr_Clear();
834 else
835 goto error;
836 }
837 if (end != s) {
838 /* all 4 forms starting with <float> land here */
839 s = end;
840 if (*s == '+' || *s == '-') {
841 /* <float><signed-float>j | <float><sign>j */
842 x = z;
843 y = PyOS_string_to_double(s, &end, NULL);
844 if (y == -1.0 && PyErr_Occurred()) {
845 if (PyErr_ExceptionMatches(PyExc_ValueError))
846 PyErr_Clear();
847 else
848 goto error;
849 }
850 if (end != s)
851 /* <float><signed-float>j */
852 s = end;
853 else {
854 /* <float><sign>j */
855 y = *s == '+' ? 1.0 : -1.0;
856 s++;
857 }
858 if (!(*s == 'j' || *s == 'J'))
859 goto parse_error;
860 s++;
861 }
862 else if (*s == 'j' || *s == 'J') {
863 /* <float>j */
864 s++;
865 y = z;
866 }
867 else
868 /* <float> */
869 x = z;
870 }
871 else {
872 /* not starting with <float>; must be <sign>j or j */
873 if (*s == '+' || *s == '-') {
874 /* <sign>j */
875 y = *s == '+' ? 1.0 : -1.0;
876 s++;
877 }
878 else
879 /* j */
880 y = 1.0;
881 if (!(*s == 'j' || *s == 'J'))
882 goto parse_error;
883 s++;
884 }
Mark Dickinsonad476da2009-04-23 19:14:16 +0000885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 /* trailing whitespace and closing bracket */
887 while (Py_ISSPACE(*s))
888 s++;
889 if (got_bracket) {
890 /* if there was an opening parenthesis, then the corresponding
891 closing parenthesis should be right here */
892 if (*s != ')')
893 goto parse_error;
894 s++;
895 while (Py_ISSPACE(*s))
896 s++;
897 }
Mark Dickinson6649fa42009-04-24 13:25:20 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 /* we should now be at the end of the string */
900 if (s-start != len)
901 goto parse_error;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 if (s_buffer)
904 PyMem_FREE(s_buffer);
905 return complex_subtype_from_doubles(type, x, y);
Mark Dickinsonad476da2009-04-23 19:14:16 +0000906
Mark Dickinson6649fa42009-04-24 13:25:20 +0000907 parse_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 PyErr_SetString(PyExc_ValueError,
909 "complex() arg is a malformed string");
Mark Dickinson1daebdf2009-10-26 22:05:06 +0000910 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 if (s_buffer)
912 PyMem_FREE(s_buffer);
913 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000914}
915
Tim Peters6d6c1a32001-08-02 04:15:00 +0000916static PyObject *
917complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 PyObject *r, *i, *tmp;
920 PyNumberMethods *nbr, *nbi = NULL;
921 Py_complex cr, ci;
922 int own_r = 0;
923 int cr_is_complex = 0;
924 int ci_is_complex = 0;
925 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 r = Py_False;
928 i = NULL;
929 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
930 &r, &i))
931 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 /* Special-case for a single argument when type(arg) is complex. */
934 if (PyComplex_CheckExact(r) && i == NULL &&
935 type == &PyComplex_Type) {
936 /* Note that we can't know whether it's safe to return
937 a complex *subclass* instance as-is, hence the restriction
938 to exact complexes here. If either the input or the
939 output is a complex subclass, it will be handled below
940 as a non-orthogonal vector. */
941 Py_INCREF(r);
942 return r;
943 }
944 if (PyUnicode_Check(r)) {
945 if (i != NULL) {
946 PyErr_SetString(PyExc_TypeError,
947 "complex() can't take second arg"
948 " if first is a string");
949 return NULL;
950 }
951 return complex_subtype_from_string(type, r);
952 }
953 if (i != NULL && PyUnicode_Check(i)) {
954 PyErr_SetString(PyExc_TypeError,
955 "complex() second arg can't be a string");
956 return NULL;
957 }
Tim Peters2400fa42001-09-12 19:12:49 +0000958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 tmp = try_complex_special_method(r);
960 if (tmp) {
961 r = tmp;
962 own_r = 1;
963 }
964 else if (PyErr_Occurred()) {
965 return NULL;
966 }
Benjamin Petersonaea44282010-01-04 01:10:28 +0000967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 nbr = r->ob_type->tp_as_number;
969 if (i != NULL)
970 nbi = i->ob_type->tp_as_number;
971 if (nbr == NULL || nbr->nb_float == NULL ||
972 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
973 PyErr_SetString(PyExc_TypeError,
974 "complex() argument must be a string or a number");
975 if (own_r) {
976 Py_DECREF(r);
977 }
978 return NULL;
979 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 /* If we get this far, then the "real" and "imag" parts should
982 both be treated as numbers, and the constructor should return a
983 complex number equal to (real + imag*1j).
Guido van Rossumd8faa362007-04-27 19:54:29 +0000984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 Note that we do NOT assume the input to already be in canonical
986 form; the "real" and "imag" parts might themselves be complex
987 numbers, which slightly complicates the code below. */
988 if (PyComplex_Check(r)) {
989 /* Note that if r is of a complex subtype, we're only
990 retaining its real & imag parts here, and the return
991 value is (properly) of the builtin complex type. */
992 cr = ((PyComplexObject*)r)->cval;
993 cr_is_complex = 1;
994 if (own_r) {
995 Py_DECREF(r);
996 }
997 }
998 else {
999 /* The "real" part really is entirely real, and contributes
1000 nothing in the imaginary direction.
1001 Just treat it as a double. */
1002 tmp = PyNumber_Float(r);
1003 if (own_r) {
1004 /* r was a newly created complex number, rather
1005 than the original "real" argument. */
1006 Py_DECREF(r);
1007 }
1008 if (tmp == NULL)
1009 return NULL;
1010 if (!PyFloat_Check(tmp)) {
1011 PyErr_SetString(PyExc_TypeError,
1012 "float(r) didn't return a float");
1013 Py_DECREF(tmp);
1014 return NULL;
1015 }
1016 cr.real = PyFloat_AsDouble(tmp);
1017 cr.imag = 0.0; /* Shut up compiler warning */
1018 Py_DECREF(tmp);
1019 }
1020 if (i == NULL) {
1021 ci.real = 0.0;
1022 }
1023 else if (PyComplex_Check(i)) {
1024 ci = ((PyComplexObject*)i)->cval;
1025 ci_is_complex = 1;
1026 } else {
1027 /* The "imag" part really is entirely imaginary, and
1028 contributes nothing in the real direction.
1029 Just treat it as a double. */
1030 tmp = (*nbi->nb_float)(i);
1031 if (tmp == NULL)
1032 return NULL;
1033 ci.real = PyFloat_AsDouble(tmp);
1034 Py_DECREF(tmp);
1035 }
1036 /* If the input was in canonical form, then the "real" and "imag"
1037 parts are real numbers, so that ci.imag and cr.imag are zero.
1038 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 if (ci_is_complex) {
1041 cr.real -= ci.imag;
1042 }
1043 if (cr_is_complex) {
1044 ci.real += cr.imag;
1045 }
1046 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001047}
1048
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001049PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001050"complex(real[, imag]) -> complex number\n"
1051"\n"
1052"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001053"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001054
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055static PyNumberMethods complex_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 (binaryfunc)complex_add, /* nb_add */
1057 (binaryfunc)complex_sub, /* nb_subtract */
1058 (binaryfunc)complex_mul, /* nb_multiply */
1059 (binaryfunc)complex_remainder, /* nb_remainder */
1060 (binaryfunc)complex_divmod, /* nb_divmod */
1061 (ternaryfunc)complex_pow, /* nb_power */
1062 (unaryfunc)complex_neg, /* nb_negative */
1063 (unaryfunc)complex_pos, /* nb_positive */
1064 (unaryfunc)complex_abs, /* nb_absolute */
1065 (inquiry)complex_bool, /* nb_bool */
1066 0, /* nb_invert */
1067 0, /* nb_lshift */
1068 0, /* nb_rshift */
1069 0, /* nb_and */
1070 0, /* nb_xor */
1071 0, /* nb_or */
1072 complex_int, /* nb_int */
1073 0, /* nb_reserved */
1074 complex_float, /* nb_float */
1075 0, /* nb_inplace_add */
1076 0, /* nb_inplace_subtract */
1077 0, /* nb_inplace_multiply*/
1078 0, /* nb_inplace_remainder */
1079 0, /* nb_inplace_power */
1080 0, /* nb_inplace_lshift */
1081 0, /* nb_inplace_rshift */
1082 0, /* nb_inplace_and */
1083 0, /* nb_inplace_xor */
1084 0, /* nb_inplace_or */
1085 (binaryfunc)complex_int_div, /* nb_floor_divide */
1086 (binaryfunc)complex_div, /* nb_true_divide */
1087 0, /* nb_inplace_floor_divide */
1088 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001089};
1090
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091PyTypeObject PyComplex_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1093 "complex",
1094 sizeof(PyComplexObject),
1095 0,
1096 complex_dealloc, /* tp_dealloc */
1097 0, /* tp_print */
1098 0, /* tp_getattr */
1099 0, /* tp_setattr */
1100 0, /* tp_reserved */
1101 (reprfunc)complex_repr, /* tp_repr */
1102 &complex_as_number, /* tp_as_number */
1103 0, /* tp_as_sequence */
1104 0, /* tp_as_mapping */
1105 (hashfunc)complex_hash, /* tp_hash */
1106 0, /* tp_call */
1107 (reprfunc)complex_str, /* tp_str */
1108 PyObject_GenericGetAttr, /* tp_getattro */
1109 0, /* tp_setattro */
1110 0, /* tp_as_buffer */
1111 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1112 complex_doc, /* tp_doc */
1113 0, /* tp_traverse */
1114 0, /* tp_clear */
1115 complex_richcompare, /* tp_richcompare */
1116 0, /* tp_weaklistoffset */
1117 0, /* tp_iter */
1118 0, /* tp_iternext */
1119 complex_methods, /* tp_methods */
1120 complex_members, /* tp_members */
1121 0, /* tp_getset */
1122 0, /* tp_base */
1123 0, /* tp_dict */
1124 0, /* tp_descr_get */
1125 0, /* tp_descr_set */
1126 0, /* tp_dictoffset */
1127 0, /* tp_init */
1128 PyType_GenericAlloc, /* tp_alloc */
1129 complex_new, /* tp_new */
1130 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001131};