blob: 300398e406653d25203a931cb08f72270bdbc996 [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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000024 Py_complex r;
25 r.real = a.real + b.real;
26 r.imag = a.imag + b.imag;
27 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000028}
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000033 Py_complex r;
34 r.real = a.real - b.real;
35 r.imag = a.imag - b.imag;
36 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000037}
38
Tim Peters0f336042001-03-18 08:21:57 +000039Py_complex
40c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000041{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000042 Py_complex r;
43 r.real = -a.real;
44 r.imag = -a.imag;
45 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000046}
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000051 Py_complex r;
52 r.real = a.real*b.real - a.imag*b.imag;
53 r.imag = a.real*b.imag + a.imag*b.real;
54 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000055}
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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:
Tim Peters0f336042001-03-18 08:21:57 +000066
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000067 Py_complex r;
68 double d = b.real*b.real + b.imag*b.imag;
69 if (d == 0.)
70 errno = EDOM;
71 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;
74 ******************************************************************/
Tim Peters0f336042001-03-18 08:21:57 +000075
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000076 /* 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;
Tim Peters0f336042001-03-18 08:21:57 +000086
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000087 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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000114 Py_complex r;
115 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.)
122 errno = EDOM;
123 r.real = 0.;
124 r.imag = 0.;
125 }
126 else {
127 vabs = hypot(a.real,a.imag);
128 len = pow(vabs,b.real);
129 at = atan2(a.imag, a.real);
130 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;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000139}
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000144 Py_complex r, p;
145 long mask = 1;
146 r = c_1;
147 p = x;
148 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;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155}
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000160 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000161
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000162 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));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000171
172}
173
Christian Heimes53876d92008-04-19 00:31:39 +0000174double
175c_abs(Py_complex z)
176{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000177 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
178 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000179
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000180 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;
Christian Heimes53876d92008-04-19 00:31:39 +0000204}
205
Tim Peters6d6c1a32001-08-02 04:15:00 +0000206static PyObject *
207complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
208{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000209 PyObject *op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000210
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000211 op = type->tp_alloc(type, 0);
212 if (op != NULL)
213 ((PyComplexObject *)op)->cval = cval;
214 return op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000215}
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000220 register PyComplexObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000221
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000222 /* Inline PyObject_New */
223 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
224 if (op == NULL)
225 return PyErr_NoMemory();
226 PyObject_INIT(op, &PyComplex_Type);
227 op->cval = cval;
228 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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000234 Py_complex c;
235 c.real = real;
236 c.imag = imag;
237 return complex_subtype_from_c_complex(type, c);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000238}
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000243 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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000252 if (PyComplex_Check(op)) {
253 return ((PyComplexObject *)op)->cval.real;
254 }
255 else {
256 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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000263 if (PyComplex_Check(op)) {
264 return ((PyComplexObject *)op)->cval.imag;
265 }
266 else {
267 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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000274 Py_complex cv;
275 PyObject *newop = NULL;
276 static PyObject *complex_str = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000278 assert(op);
279 /* If op is already of type PyComplex_Type, return its value */
280 if (PyComplex_Check(op)) {
281 return ((PyComplexObject *)op)->cval;
282 }
283 /* If not, use op's __complex__ method, if it exists */
Christian Heimesfe82e772008-01-28 02:38:20 +0000284
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000285 /* return -1 on failure */
286 cv.real = -1.;
287 cv.imag = 0.;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000288
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000289 if (complex_str == NULL) {
290 if (!(complex_str = PyUnicode_FromString("__complex__")))
291 return cv;
292 }
293
294 {
295 PyObject *complexfunc;
296 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. */
318 else {
319 /* PyFloat_AsDouble will return -1 on failure */
320 cv.real = PyFloat_AsDouble(op);
321 return cv;
322 }
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +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 *
Eric Smith63376222009-05-05 14:04:18 +0000333complex_format(PyComplexObject *v, int precision, char format_code)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000334{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000335 PyObject *result = NULL;
336 Py_ssize_t len;
Eric Smith0923d1d2009-04-16 20:16:10 +0000337
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000338 /* If these are non-NULL, they'll need to be freed. */
339 char *pre = NULL;
340 char *im = NULL;
341 char *buf = NULL;
Eric Smith0923d1d2009-04-16 20:16:10 +0000342
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000343 /* These do not need to be freed. re is either an alias
344 for pre or a pointer to a constant. lead and tail
345 are pointers to constants. */
346 char *re = NULL;
347 char *lead = "";
348 char *tail = "";
Eric Smith0923d1d2009-04-16 20:16:10 +0000349
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000350 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
351 re = "";
352 im = PyOS_double_to_string(v->cval.imag, format_code,
353 precision, 0, NULL);
354 if (!im) {
355 PyErr_NoMemory();
356 goto done;
357 }
358 } else {
359 /* Format imaginary part with sign, real part without */
360 pre = PyOS_double_to_string(v->cval.real, format_code,
361 precision, 0, NULL);
362 if (!pre) {
363 PyErr_NoMemory();
364 goto done;
365 }
366 re = pre;
Eric Smith0923d1d2009-04-16 20:16:10 +0000367
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000368 im = PyOS_double_to_string(v->cval.imag, format_code,
369 precision, Py_DTSF_SIGN, NULL);
370 if (!im) {
371 PyErr_NoMemory();
372 goto done;
373 }
374 lead = "(";
375 tail = ")";
376 }
377 /* Alloc the final buffer. Add one for the "j" in the format string,
378 and one for the trailing zero. */
379 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
380 buf = PyMem_Malloc(len);
381 if (!buf) {
382 PyErr_NoMemory();
383 goto done;
384 }
385 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
386 result = PyUnicode_FromString(buf);
Mark Dickinsonad476da2009-04-23 19:14:16 +0000387 done:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000388 PyMem_Free(im);
389 PyMem_Free(pre);
390 PyMem_Free(buf);
Eric Smith0923d1d2009-04-16 20:16:10 +0000391
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000392 return result;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000393}
394
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000396complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000397{
Eric Smith63376222009-05-05 14:04:18 +0000398 return complex_format(v, 0, 'r');
Tim Peters70695122001-03-11 08:37:29 +0000399}
400
401static PyObject *
402complex_str(PyComplexObject *v)
403{
Eric Smith63376222009-05-05 14:04:18 +0000404 return complex_format(v, PyFloat_STR_PRECISION, 'g');
Guido van Rossumf9fca921996-01-12 00:47:05 +0000405}
406
Guido van Rossumf9fca921996-01-12 00:47:05 +0000407static long
Fred Drake4288c802000-07-09 04:36:04 +0000408complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000409{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000410 long hashreal, hashimag, combined;
411 hashreal = _Py_HashDouble(v->cval.real);
412 if (hashreal == -1)
413 return -1;
414 hashimag = _Py_HashDouble(v->cval.imag);
415 if (hashimag == -1)
416 return -1;
417 /* Note: if the imaginary part is 0, hashimag is 0 now,
418 * so the following returns hashreal unchanged. This is
419 * important because numbers of different types that
420 * compare equal must have the same hash value, so that
421 * hash(x + 0*j) must equal hash(x).
422 */
423 combined = hashreal + 1000003 * hashimag;
424 if (combined == -1)
425 combined = -2;
426 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000427}
428
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000429/* This macro may return! */
430#define TO_COMPLEX(obj, c) \
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000431 if (PyComplex_Check(obj)) \
432 c = ((PyComplexObject *)(obj))->cval; \
433 else if (to_complex(&(obj), &(c)) < 0) \
434 return (obj)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000435
436static int
437to_complex(PyObject **pobj, Py_complex *pc)
438{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000439 PyObject *obj = *pobj;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000440
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000441 pc->real = pc->imag = 0.0;
442 if (PyLong_Check(obj)) {
443 pc->real = PyLong_AsDouble(obj);
444 if (pc->real == -1.0 && PyErr_Occurred()) {
445 *pobj = NULL;
446 return -1;
447 }
448 return 0;
449 }
450 if (PyFloat_Check(obj)) {
451 pc->real = PyFloat_AsDouble(obj);
452 return 0;
453 }
454 Py_INCREF(Py_NotImplemented);
455 *pobj = Py_NotImplemented;
456 return -1;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000457}
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000458
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000459
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000461complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000462{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000463 Py_complex result;
464 Py_complex a, b;
465 TO_COMPLEX(v, a);
466 TO_COMPLEX(w, b);
467 PyFPE_START_PROTECT("complex_add", return 0)
468 result = c_sum(a, b);
469 PyFPE_END_PROTECT(result)
470 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000471}
472
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000474complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000475{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000476 Py_complex result;
477 Py_complex a, b;
478 TO_COMPLEX(v, a);
479 TO_COMPLEX(w, b);
480 PyFPE_START_PROTECT("complex_sub", return 0)
481 result = c_diff(a, b);
482 PyFPE_END_PROTECT(result)
483 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000484}
485
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000487complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000488{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000489 Py_complex result;
490 Py_complex a, b;
491 TO_COMPLEX(v, a);
492 TO_COMPLEX(w, b);
493 PyFPE_START_PROTECT("complex_mul", return 0)
494 result = c_prod(a, b);
495 PyFPE_END_PROTECT(result)
496 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000497}
498
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000500complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000501{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000502 Py_complex quot;
503 Py_complex a, b;
504 TO_COMPLEX(v, a);
505 TO_COMPLEX(w, b);
506 PyFPE_START_PROTECT("complex_div", return 0)
507 errno = 0;
508 quot = c_quot(a, b);
509 PyFPE_END_PROTECT(quot)
510 if (errno == EDOM) {
511 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
512 return NULL;
513 }
514 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000515}
516
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000518complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000519{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000520 PyErr_SetString(PyExc_TypeError,
521 "can't mod complex numbers.");
522 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000523}
524
Guido van Rossumee09fc11996-09-11 13:55:55 +0000525
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000527complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000528{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000529 PyErr_SetString(PyExc_TypeError,
530 "can't take floor or mod of complex number.");
531 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000532}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000533
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000535complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000536{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000537 Py_complex p;
538 Py_complex exponent;
539 long int_exponent;
540 Py_complex a, b;
541 TO_COMPLEX(v, a);
542 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000543
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000544 if (z != Py_None) {
545 PyErr_SetString(PyExc_ValueError, "complex modulo");
546 return NULL;
547 }
548 PyFPE_START_PROTECT("complex_pow", return 0)
549 errno = 0;
550 exponent = b;
551 int_exponent = (long)exponent.real;
552 if (exponent.imag == 0. && exponent.real == int_exponent)
553 p = c_powi(a, int_exponent);
554 else
555 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000556
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000557 PyFPE_END_PROTECT(p)
558 Py_ADJUST_ERANGE2(p.real, p.imag);
559 if (errno == EDOM) {
560 PyErr_SetString(PyExc_ZeroDivisionError,
561 "0.0 to a negative or complex power");
562 return NULL;
563 }
564 else if (errno == ERANGE) {
565 PyErr_SetString(PyExc_OverflowError,
566 "complex exponentiation");
567 return NULL;
568 }
569 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000570}
571
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000573complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000574{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000575 PyErr_SetString(PyExc_TypeError,
576 "can't take floor of complex number.");
577 return NULL;
Guido van Rossum4668b002001-08-08 05:00:18 +0000578}
579
580static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000581complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000582{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000583 Py_complex neg;
584 neg.real = -v->cval.real;
585 neg.imag = -v->cval.imag;
586 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000587}
588
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000590complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000591{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000592 if (PyComplex_CheckExact(v)) {
593 Py_INCREF(v);
594 return (PyObject *)v;
595 }
596 else
597 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000598}
599
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000601complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000602{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000603 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000604
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000605 PyFPE_START_PROTECT("complex_abs", return 0)
606 result = c_abs(v->cval);
607 PyFPE_END_PROTECT(result)
Christian Heimes53876d92008-04-19 00:31:39 +0000608
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000609 if (errno == ERANGE) {
610 PyErr_SetString(PyExc_OverflowError,
611 "absolute value too large");
612 return NULL;
613 }
614 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000615}
616
617static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000618complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000619{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000620 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000621}
622
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000624complex_richcompare(PyObject *v, PyObject *w, int op)
625{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000626 PyObject *res;
627 Py_complex i, j;
628 TO_COMPLEX(v, i);
629 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000630
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000631 if (op != Py_EQ && op != Py_NE) {
632 /* XXX Should eventually return NotImplemented */
633 PyErr_SetString(PyExc_TypeError,
634 "no ordering relation is defined for complex numbers");
635 return NULL;
636 }
Guido van Rossum22056422001-09-24 17:52:04 +0000637
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000638 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
639 res = Py_True;
640 else
641 res = Py_False;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000642
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000643 Py_INCREF(res);
644 return res;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000645}
646
647static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000648complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000649{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000650 PyErr_SetString(PyExc_TypeError,
651 "can't convert complex to int");
652 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000653}
654
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000656complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000657{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000658 PyErr_SetString(PyExc_TypeError,
659 "can't convert complex to float");
660 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661}
662
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000664complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000665{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000666 Py_complex c;
667 c = ((PyComplexObject *)self)->cval;
668 c.imag = -c.imag;
669 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000670}
671
Guido van Rossum46334cd2007-08-01 17:43:15 +0000672PyDoc_STRVAR(complex_conjugate_doc,
673"complex.conjugate() -> complex\n"
674"\n"
675"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
676
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000677static PyObject *
678complex_getnewargs(PyComplexObject *v)
679{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000680 Py_complex c = v->cval;
681 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000682}
683
Eric Smith58a42242009-04-30 01:00:33 +0000684PyDoc_STRVAR(complex__format__doc,
685"complex.__format__() -> str\n"
686"\n"
687"Converts to a string according to format_spec.");
688
689static PyObject *
690complex__format__(PyObject* self, PyObject* args)
691{
692 PyObject *format_spec;
693
694 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000695 return NULL;
Eric Smith58a42242009-04-30 01:00:33 +0000696 return _PyComplex_FormatAdvanced(self,
697 PyUnicode_AS_UNICODE(format_spec),
698 PyUnicode_GET_SIZE(format_spec));
699}
700
Christian Heimes53876d92008-04-19 00:31:39 +0000701#if 0
702static PyObject *
703complex_is_finite(PyObject *self)
704{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000705 Py_complex c;
706 c = ((PyComplexObject *)self)->cval;
707 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
708 Py_IS_FINITE(c.imag)));
Christian Heimes53876d92008-04-19 00:31:39 +0000709}
710
711PyDoc_STRVAR(complex_is_finite_doc,
712"complex.is_finite() -> bool\n"
713"\n"
714"Returns True if the real and the imaginary part is finite.");
715#endif
716
Guido van Rossumf9fca921996-01-12 00:47:05 +0000717static PyMethodDef complex_methods[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000718 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
719 complex_conjugate_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000720#if 0
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000721 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
722 complex_is_finite_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000723#endif
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000724 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
725 {"__format__", (PyCFunction)complex__format__,
726 METH_VARARGS, complex__format__doc},
727 {NULL, NULL} /* sentinel */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000728};
729
Guido van Rossum6f799372001-09-20 20:46:19 +0000730static PyMemberDef complex_members[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000731 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
732 "the real part of a complex number"},
733 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
734 "the imaginary part of a complex number"},
735 {0},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000736};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000737
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000739complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000740{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000741 const char *s, *start;
742 char *end;
743 double x=0.0, y=0.0, z;
744 int got_bracket=0;
745 char s_buffer[256];
746 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000747
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000748 if (PyUnicode_Check(v)) {
749 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
750 PyErr_SetString(PyExc_ValueError,
751 "complex() literal too large to convert");
752 return NULL;
753 }
754 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
755 PyUnicode_GET_SIZE(v),
756 s_buffer,
757 NULL))
758 return NULL;
759 s = s_buffer;
760 len = strlen(s);
761 }
762 else if (PyObject_AsCharBuffer(v, &s, &len)) {
763 PyErr_SetString(PyExc_TypeError,
764 "complex() arg is not a string");
765 return NULL;
766 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000767
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000768 /* position on first nonblank */
769 start = s;
770 while (Py_ISSPACE(*s))
771 s++;
772 if (*s == '(') {
773 /* Skip over possible bracket from repr(). */
774 got_bracket = 1;
775 s++;
776 while (Py_ISSPACE(*s))
777 s++;
778 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000779
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000780 /* a valid complex string usually takes one of the three forms:
Mark Dickinson6649fa42009-04-24 13:25:20 +0000781
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000782 <float> - real part only
783 <float>j - imaginary part only
784 <float><signed-float>j - real and imaginary parts
Mark Dickinson6649fa42009-04-24 13:25:20 +0000785
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000786 where <float> represents any numeric string that's accepted by the
787 float constructor (including 'nan', 'inf', 'infinity', etc.), and
788 <signed-float> is any string of the form <float> whose first
789 character is '+' or '-'.
Mark Dickinson6649fa42009-04-24 13:25:20 +0000790
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000791 For backwards compatibility, the extra forms
Mark Dickinson6649fa42009-04-24 13:25:20 +0000792
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000793 <float><sign>j
794 <sign>j
795 j
Mark Dickinson6649fa42009-04-24 13:25:20 +0000796
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000797 are also accepted, though support for these forms may be removed from
798 a future version of Python.
799 */
Mark Dickinson6649fa42009-04-24 13:25:20 +0000800
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000801 /* first look for forms starting with <float> */
802 z = PyOS_string_to_double(s, &end, NULL);
803 if (z == -1.0 && PyErr_Occurred()) {
804 if (PyErr_ExceptionMatches(PyExc_ValueError))
805 PyErr_Clear();
806 else
807 return NULL;
808 }
809 if (end != s) {
810 /* all 4 forms starting with <float> land here */
811 s = end;
812 if (*s == '+' || *s == '-') {
813 /* <float><signed-float>j | <float><sign>j */
814 x = z;
815 y = PyOS_string_to_double(s, &end, NULL);
816 if (y == -1.0 && PyErr_Occurred()) {
817 if (PyErr_ExceptionMatches(PyExc_ValueError))
818 PyErr_Clear();
819 else
820 return NULL;
821 }
822 if (end != s)
823 /* <float><signed-float>j */
824 s = end;
825 else {
826 /* <float><sign>j */
827 y = *s == '+' ? 1.0 : -1.0;
828 s++;
829 }
830 if (!(*s == 'j' || *s == 'J'))
831 goto parse_error;
832 s++;
833 }
834 else if (*s == 'j' || *s == 'J') {
835 /* <float>j */
836 s++;
837 y = z;
838 }
839 else
840 /* <float> */
841 x = z;
842 }
843 else {
844 /* not starting with <float>; must be <sign>j or j */
845 if (*s == '+' || *s == '-') {
846 /* <sign>j */
847 y = *s == '+' ? 1.0 : -1.0;
848 s++;
849 }
850 else
851 /* j */
852 y = 1.0;
853 if (!(*s == 'j' || *s == 'J'))
854 goto parse_error;
855 s++;
856 }
Mark Dickinsonad476da2009-04-23 19:14:16 +0000857
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000858 /* trailing whitespace and closing bracket */
859 while (Py_ISSPACE(*s))
860 s++;
861 if (got_bracket) {
862 /* if there was an opening parenthesis, then the corresponding
863 closing parenthesis should be right here */
864 if (*s != ')')
865 goto parse_error;
866 s++;
867 while (Py_ISSPACE(*s))
868 s++;
869 }
Mark Dickinson6649fa42009-04-24 13:25:20 +0000870
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000871 /* we should now be at the end of the string */
872 if (s-start != len)
873 goto parse_error;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000875 return complex_subtype_from_doubles(type, x, y);
Mark Dickinsonad476da2009-04-23 19:14:16 +0000876
Mark Dickinson6649fa42009-04-24 13:25:20 +0000877 parse_error:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000878 PyErr_SetString(PyExc_ValueError,
879 "complex() arg is a malformed string");
880 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000881}
882
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883static PyObject *
884complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
885{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000886 PyObject *r, *i, *tmp, *f;
887 PyNumberMethods *nbr, *nbi = NULL;
888 Py_complex cr, ci;
889 int own_r = 0;
890 int cr_is_complex = 0;
891 int ci_is_complex = 0;
892 static PyObject *complexstr;
893 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000894
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000895 r = Py_False;
896 i = NULL;
897 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
898 &r, &i))
899 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000900
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000901 /* Special-case for a single argument when type(arg) is complex. */
902 if (PyComplex_CheckExact(r) && i == NULL &&
903 type == &PyComplex_Type) {
904 /* Note that we can't know whether it's safe to return
905 a complex *subclass* instance as-is, hence the restriction
906 to exact complexes here. If either the input or the
907 output is a complex subclass, it will be handled below
908 as a non-orthogonal vector. */
909 Py_INCREF(r);
910 return r;
911 }
912 if (PyUnicode_Check(r)) {
913 if (i != NULL) {
914 PyErr_SetString(PyExc_TypeError,
915 "complex() can't take second arg"
916 " if first is a string");
917 return NULL;
918 }
919 return complex_subtype_from_string(type, r);
920 }
921 if (i != NULL && PyUnicode_Check(i)) {
922 PyErr_SetString(PyExc_TypeError,
923 "complex() second arg can't be a string");
924 return NULL;
925 }
Tim Peters2400fa42001-09-12 19:12:49 +0000926
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000927 /* XXX Hack to support classes with __complex__ method */
928 if (complexstr == NULL) {
929 complexstr = PyUnicode_InternFromString("__complex__");
930 if (complexstr == NULL)
931 return NULL;
932 }
933 f = PyObject_GetAttr(r, complexstr);
934 if (f == NULL)
935 PyErr_Clear();
936 else {
937 PyObject *args = PyTuple_New(0);
938 if (args == NULL)
939 return NULL;
940 r = PyEval_CallObject(f, args);
941 Py_DECREF(args);
942 Py_DECREF(f);
943 if (r == NULL)
944 return NULL;
945 own_r = 1;
946 }
947 nbr = r->ob_type->tp_as_number;
948 if (i != NULL)
949 nbi = i->ob_type->tp_as_number;
950 if (nbr == NULL || nbr->nb_float == NULL ||
951 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
952 PyErr_SetString(PyExc_TypeError,
953 "complex() argument must be a string or a number");
954 if (own_r) {
955 Py_DECREF(r);
956 }
957 return NULL;
958 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000959
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000960 /* If we get this far, then the "real" and "imag" parts should
961 both be treated as numbers, and the constructor should return a
962 complex number equal to (real + imag*1j).
Guido van Rossumd8faa362007-04-27 19:54:29 +0000963
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000964 Note that we do NOT assume the input to already be in canonical
965 form; the "real" and "imag" parts might themselves be complex
966 numbers, which slightly complicates the code below. */
967 if (PyComplex_Check(r)) {
968 /* Note that if r is of a complex subtype, we're only
969 retaining its real & imag parts here, and the return
970 value is (properly) of the builtin complex type. */
971 cr = ((PyComplexObject*)r)->cval;
972 cr_is_complex = 1;
973 if (own_r) {
974 Py_DECREF(r);
975 }
976 }
977 else {
978 /* The "real" part really is entirely real, and contributes
979 nothing in the imaginary direction.
980 Just treat it as a double. */
981 tmp = PyNumber_Float(r);
982 if (own_r) {
983 /* r was a newly created complex number, rather
984 than the original "real" argument. */
985 Py_DECREF(r);
986 }
987 if (tmp == NULL)
988 return NULL;
989 if (!PyFloat_Check(tmp)) {
990 PyErr_SetString(PyExc_TypeError,
991 "float(r) didn't return a float");
992 Py_DECREF(tmp);
993 return NULL;
994 }
995 cr.real = PyFloat_AsDouble(tmp);
996 cr.imag = 0.0; /* Shut up compiler warning */
997 Py_DECREF(tmp);
998 }
999 if (i == NULL) {
1000 ci.real = 0.0;
1001 }
1002 else if (PyComplex_Check(i)) {
1003 ci = ((PyComplexObject*)i)->cval;
1004 ci_is_complex = 1;
1005 } else {
1006 /* The "imag" part really is entirely imaginary, and
1007 contributes nothing in the real direction.
1008 Just treat it as a double. */
1009 tmp = (*nbi->nb_float)(i);
1010 if (tmp == NULL)
1011 return NULL;
1012 ci.real = PyFloat_AsDouble(tmp);
1013 Py_DECREF(tmp);
1014 }
1015 /* If the input was in canonical form, then the "real" and "imag"
1016 parts are real numbers, so that ci.imag and cr.imag are zero.
1017 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001018
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001019 if (ci_is_complex) {
1020 cr.real -= ci.imag;
1021 }
1022 if (cr_is_complex) {
1023 ci.real += cr.imag;
1024 }
1025 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026}
1027
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001028PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001029"complex(real[, imag]) -> complex number\n"
1030"\n"
1031"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001032"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001033
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001034static PyNumberMethods complex_as_number = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001035 (binaryfunc)complex_add, /* nb_add */
1036 (binaryfunc)complex_sub, /* nb_subtract */
1037 (binaryfunc)complex_mul, /* nb_multiply */
1038 (binaryfunc)complex_remainder, /* nb_remainder */
1039 (binaryfunc)complex_divmod, /* nb_divmod */
1040 (ternaryfunc)complex_pow, /* nb_power */
1041 (unaryfunc)complex_neg, /* nb_negative */
1042 (unaryfunc)complex_pos, /* nb_positive */
1043 (unaryfunc)complex_abs, /* nb_absolute */
1044 (inquiry)complex_bool, /* nb_bool */
1045 0, /* nb_invert */
1046 0, /* nb_lshift */
1047 0, /* nb_rshift */
1048 0, /* nb_and */
1049 0, /* nb_xor */
1050 0, /* nb_or */
1051 complex_int, /* nb_int */
1052 0, /* nb_reserved */
1053 complex_float, /* nb_float */
1054 0, /* nb_inplace_add */
1055 0, /* nb_inplace_subtract */
1056 0, /* nb_inplace_multiply*/
1057 0, /* nb_inplace_remainder */
1058 0, /* nb_inplace_power */
1059 0, /* nb_inplace_lshift */
1060 0, /* nb_inplace_rshift */
1061 0, /* nb_inplace_and */
1062 0, /* nb_inplace_xor */
1063 0, /* nb_inplace_or */
1064 (binaryfunc)complex_int_div, /* nb_floor_divide */
1065 (binaryfunc)complex_div, /* nb_true_divide */
1066 0, /* nb_inplace_floor_divide */
1067 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001068};
1069
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001070PyTypeObject PyComplex_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001071 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1072 "complex",
1073 sizeof(PyComplexObject),
1074 0,
1075 complex_dealloc, /* tp_dealloc */
1076 0, /* tp_print */
1077 0, /* tp_getattr */
1078 0, /* tp_setattr */
1079 0, /* tp_reserved */
1080 (reprfunc)complex_repr, /* tp_repr */
1081 &complex_as_number, /* tp_as_number */
1082 0, /* tp_as_sequence */
1083 0, /* tp_as_mapping */
1084 (hashfunc)complex_hash, /* tp_hash */
1085 0, /* tp_call */
1086 (reprfunc)complex_str, /* tp_str */
1087 PyObject_GenericGetAttr, /* tp_getattro */
1088 0, /* tp_setattro */
1089 0, /* tp_as_buffer */
1090 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1091 complex_doc, /* tp_doc */
1092 0, /* tp_traverse */
1093 0, /* tp_clear */
1094 complex_richcompare, /* tp_richcompare */
1095 0, /* tp_weaklistoffset */
1096 0, /* tp_iter */
1097 0, /* tp_iternext */
1098 complex_methods, /* tp_methods */
1099 complex_members, /* tp_members */
1100 0, /* tp_getset */
1101 0, /* tp_base */
1102 0, /* tp_dict */
1103 0, /* tp_descr_get */
1104 0, /* tp_descr_set */
1105 0, /* tp_dictoffset */
1106 0, /* tp_init */
1107 PyType_GenericAlloc, /* tp_alloc */
1108 complex_new, /* tp_new */
1109 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001110};
1111
1112#endif