blob: 207ecdd07fe967103c38cdcd0aa75bc9a9cafac9 [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
Christian Heimes53876d92008-04-19 00:31:39 +0000190double
191c_abs(Py_complex z)
192{
193 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
194 double result;
195
196 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
197 /* C99 rules: if either the real or the imaginary part is an
198 infinity, return infinity, even if the other part is a
199 NaN. */
200 if (Py_IS_INFINITY(z.real)) {
201 result = fabs(z.real);
202 errno = 0;
203 return result;
204 }
205 if (Py_IS_INFINITY(z.imag)) {
206 result = fabs(z.imag);
207 errno = 0;
208 return result;
209 }
210 /* either the real or imaginary part is a NaN,
211 and neither is infinite. Result should be NaN. */
212 return Py_NAN;
213 }
214 result = hypot(z.real, z.imag);
215 if (!Py_IS_FINITE(result))
216 errno = ERANGE;
217 else
218 errno = 0;
219 return result;
220}
221
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222static PyObject *
223complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
224{
225 PyObject *op;
226
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000227 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000228 if (op != NULL)
229 ((PyComplexObject *)op)->cval = cval;
230 return op;
231}
232
Guido van Rossumf9fca921996-01-12 00:47:05 +0000233PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000234PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000235{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000236 register PyComplexObject *op;
237
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000238 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000239 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000240 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000242 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000243 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000245}
246
Tim Peters6d6c1a32001-08-02 04:15:00 +0000247static PyObject *
248complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
249{
250 Py_complex c;
251 c.real = real;
252 c.imag = imag;
253 return complex_subtype_from_c_complex(type, c);
254}
255
Guido van Rossumf9fca921996-01-12 00:47:05 +0000256PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000257PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000258{
259 Py_complex c;
260 c.real = real;
261 c.imag = imag;
262 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000263}
264
265double
Fred Drake4288c802000-07-09 04:36:04 +0000266PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000267{
268 if (PyComplex_Check(op)) {
269 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000270 }
271 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000272 return PyFloat_AsDouble(op);
273 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274}
275
276double
Fred Drake4288c802000-07-09 04:36:04 +0000277PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000278{
279 if (PyComplex_Check(op)) {
280 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000281 }
282 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000283 return 0.0;
284 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000285}
286
Guido van Rossum9e720e31996-07-21 02:31:35 +0000287Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000288PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000289{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000290 Py_complex cv;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000291 PyObject *newop = NULL;
292 static PyObject *complex_str = NULL;
293
294 assert(op);
295 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000296 if (PyComplex_Check(op)) {
297 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000298 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000299 /* If not, use op's __complex__ method, if it exists */
300
301 /* return -1 on failure */
302 cv.real = -1.;
303 cv.imag = 0.;
Christian Heimesfe82e772008-01-28 02:38:20 +0000304
305 if (complex_str == NULL) {
306 if (!(complex_str = PyUnicode_FromString("__complex__")))
307 return cv;
308 }
309
Guido van Rossumd8faa362007-04-27 19:54:29 +0000310 {
311 PyObject *complexfunc;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000312 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
313 /* complexfunc is a borrowed reference */
314 if (complexfunc) {
315 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
316 if (!newop)
317 return cv;
318 }
319 }
320
321 if (newop) {
322 if (!PyComplex_Check(newop)) {
323 PyErr_SetString(PyExc_TypeError,
324 "__complex__ should return a complex object");
325 Py_DECREF(newop);
326 return cv;
327 }
328 cv = ((PyComplexObject *)newop)->cval;
329 Py_DECREF(newop);
330 return cv;
331 }
332 /* If neither of the above works, interpret op as a float giving the
333 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000334 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000335 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000336 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000337 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000338 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000339}
340
Guido van Rossumf9fca921996-01-12 00:47:05 +0000341static void
Fred Drake4288c802000-07-09 04:36:04 +0000342complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000343{
Guido van Rossum9475a232001-10-05 20:51:39 +0000344 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000345}
346
347
Guido van Rossum363078a1996-05-24 20:45:01 +0000348static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000349complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000350{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000351 char format[32];
352 if (v->cval.real == 0.) {
Christian Heimesa156e092008-02-16 07:38:31 +0000353 if (!Py_IS_FINITE(v->cval.imag)) {
354 if (Py_IS_NAN(v->cval.imag))
355 strncpy(buf, "nan*j", 6);
Christian Heimes53876d92008-04-19 00:31:39 +0000356 else if (copysign(1, v->cval.imag) == 1)
Christian Heimesa156e092008-02-16 07:38:31 +0000357 strncpy(buf, "inf*j", 6);
358 else
359 strncpy(buf, "-inf*j", 7);
360 }
361 else {
362 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
363 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
364 strncat(buf, "j", 1);
365 }
Martin v. Löwis737ea822004-06-08 18:52:54 +0000366 } else {
367 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000368 /* Format imaginary part with sign, real part without */
Christian Heimesa156e092008-02-16 07:38:31 +0000369 if (!Py_IS_FINITE(v->cval.real)) {
370 if (Py_IS_NAN(v->cval.real))
371 strncpy(re, "nan", 4);
372 /* else if (copysign(1, v->cval.real) == 1) */
373 else if (v->cval.real > 0)
374 strncpy(re, "inf", 4);
375 else
376 strncpy(re, "-inf", 5);
377 }
378 else {
379 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
380 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
381 }
382 if (!Py_IS_FINITE(v->cval.imag)) {
383 if (Py_IS_NAN(v->cval.imag))
384 strncpy(im, "+nan*", 6);
385 /* else if (copysign(1, v->cval.imag) == 1) */
386 else if (v->cval.imag > 0)
387 strncpy(im, "+inf*", 6);
388 else
389 strncpy(im, "-inf*", 6);
390 }
391 else {
392 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
393 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
394 }
Georg Brandlc404ff22005-09-16 06:42:26 +0000395 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000396 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000397}
398
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000400complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000401{
402 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000403 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000404 return PyUnicode_FromString(buf);
Tim Peters70695122001-03-11 08:37:29 +0000405}
406
407static PyObject *
408complex_str(PyComplexObject *v)
409{
410 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000411 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Walter Dörwald7696ed72007-05-31 15:51:35 +0000412 return PyUnicode_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000413}
414
Guido van Rossumf9fca921996-01-12 00:47:05 +0000415static long
Fred Drake4288c802000-07-09 04:36:04 +0000416complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000417{
Tim Peters39dce292000-08-15 03:34:48 +0000418 long hashreal, hashimag, combined;
419 hashreal = _Py_HashDouble(v->cval.real);
420 if (hashreal == -1)
421 return -1;
422 hashimag = _Py_HashDouble(v->cval.imag);
423 if (hashimag == -1)
424 return -1;
425 /* Note: if the imaginary part is 0, hashimag is 0 now,
426 * so the following returns hashreal unchanged. This is
427 * important because numbers of different types that
428 * compare equal must have the same hash value, so that
429 * hash(x + 0*j) must equal hash(x).
430 */
431 combined = hashreal + 1000003 * hashimag;
432 if (combined == -1)
433 combined = -2;
434 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000435}
436
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000437/* This macro may return! */
438#define TO_COMPLEX(obj, c) \
439 if (PyComplex_Check(obj)) \
440 c = ((PyComplexObject *)(obj))->cval; \
441 else if (to_complex(&(obj), &(c)) < 0) \
442 return (obj)
443
444static int
445to_complex(PyObject **pobj, Py_complex *pc)
446{
Christian Heimes587c2bf2008-01-19 16:21:02 +0000447 PyObject *obj = *pobj;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000448
Christian Heimes587c2bf2008-01-19 16:21:02 +0000449 pc->real = pc->imag = 0.0;
450 if (PyLong_Check(obj)) {
451 pc->real = PyLong_AsDouble(obj);
452 if (pc->real == -1.0 && PyErr_Occurred()) {
453 *pobj = NULL;
454 return -1;
455 }
456 return 0;
457 }
458 if (PyFloat_Check(obj)) {
459 pc->real = PyFloat_AsDouble(obj);
460 return 0;
461 }
462 Py_INCREF(Py_NotImplemented);
463 *pobj = Py_NotImplemented;
464 return -1;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000465}
466
467
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000469complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000470{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000471 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000472 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000473 TO_COMPLEX(v, a);
474 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000475 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000476 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000477 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000479}
480
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000482complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000483{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000484 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000485 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000486 TO_COMPLEX(v, a);
487 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000488 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000489 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000490 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 return PyComplex_FromCComplex(result);
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_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000496{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000497 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000498 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000499 TO_COMPLEX(v, a);
500 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000501 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000502 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000503 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000505}
506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000508complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000510 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000511 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000512 TO_COMPLEX(v, a);
513 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000514 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000515 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000516 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000517 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000518 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000520 return NULL;
521 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000523}
524
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000526complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000527{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000528 PyErr_SetString(PyExc_TypeError,
529 "can't mod complex numbers.");
530 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000531}
532
Guido van Rossumee09fc11996-09-11 13:55:55 +0000533
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000535complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000536{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000537 PyErr_SetString(PyExc_TypeError,
538 "can't take floor or mod of complex number.");
539 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000540}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000541
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000543complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000544{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000545 Py_complex p;
546 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000547 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000548 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000549 TO_COMPLEX(v, a);
550 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000551
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000552 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000554 return NULL;
555 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000556 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000557 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000558 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000559 int_exponent = (long)exponent.real;
560 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000561 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000562 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000563 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000564
Guido van Rossum45b83911997-03-14 04:32:50 +0000565 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000566 Py_ADJUST_ERANGE2(p.real, p.imag);
567 if (errno == EDOM) {
568 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000570 return NULL;
571 }
Tim Petersbab22be2002-03-22 02:48:46 +0000572 else if (errno == ERANGE) {
573 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000574 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000575 return NULL;
576 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000578}
579
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000581complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000582{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000583 PyErr_SetString(PyExc_TypeError,
584 "can't take floor of complex number.");
Guido van Rossum4668b002001-08-08 05:00:18 +0000585 return NULL;
586}
587
588static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000589complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000590{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000591 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000592 neg.real = -v->cval.real;
593 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000594 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000595}
596
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000598complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000599{
Tim Peters2400fa42001-09-12 19:12:49 +0000600 if (PyComplex_CheckExact(v)) {
601 Py_INCREF(v);
602 return (PyObject *)v;
603 }
604 else
605 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000606}
607
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000609complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000610{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000611 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000612
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000613 PyFPE_START_PROTECT("complex_abs", return 0)
Christian Heimes53876d92008-04-19 00:31:39 +0000614 result = c_abs(v->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000615 PyFPE_END_PROTECT(result)
Christian Heimes53876d92008-04-19 00:31:39 +0000616
617 if (errno == ERANGE) {
618 PyErr_SetString(PyExc_OverflowError,
619 "absolute value too large");
620 return NULL;
621 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000623}
624
625static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000626complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000627{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000628 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000629}
630
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000631static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000632complex_richcompare(PyObject *v, PyObject *w, int op)
633{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000634 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000635 Py_complex i, j;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000636 TO_COMPLEX(v, i);
637 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000638
Guido van Rossum22056422001-09-24 17:52:04 +0000639 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000640 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000641 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000642 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000643 return NULL;
644 }
645
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000646 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
647 res = Py_True;
648 else
649 res = Py_False;
650
651 Py_INCREF(res);
652 return res;
653}
654
655static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000656complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000657{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000658 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000659 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000660 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661}
662
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000664complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000665{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000667 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000668 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000669}
670
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000671static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000672complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000673{
Guido van Rossum926518b1996-08-19 19:30:45 +0000674 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000676 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000678}
679
Guido van Rossum46334cd2007-08-01 17:43:15 +0000680PyDoc_STRVAR(complex_conjugate_doc,
681"complex.conjugate() -> complex\n"
682"\n"
683"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
684
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000685static PyObject *
686complex_getnewargs(PyComplexObject *v)
687{
Georg Brandl0c77a822008-06-10 16:37:50 +0000688 Py_complex c = v->cval;
689 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000690}
691
Christian Heimes53876d92008-04-19 00:31:39 +0000692#if 0
693static PyObject *
694complex_is_finite(PyObject *self)
695{
696 Py_complex c;
697 c = ((PyComplexObject *)self)->cval;
698 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
699 Py_IS_FINITE(c.imag)));
700}
701
702PyDoc_STRVAR(complex_is_finite_doc,
703"complex.is_finite() -> bool\n"
704"\n"
705"Returns True if the real and the imaginary part is finite.");
706#endif
707
Guido van Rossumf9fca921996-01-12 00:47:05 +0000708static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000709 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
710 complex_conjugate_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000711#if 0
712 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
713 complex_is_finite_doc},
714#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000715 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000716 {NULL, NULL} /* sentinel */
717};
718
Guido van Rossum6f799372001-09-20 20:46:19 +0000719static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000720 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000721 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000722 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000723 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000724 {0},
725};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000726
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000728complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000729{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000730 const char *s, *start;
731 char *end;
732 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000733 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000734 int digit_or_dot;
735 int sw_error=0;
736 int sign;
737 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000738 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000739 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000740
Neal Norwitzed2b7392007-08-26 04:51:10 +0000741 if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000742 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000743 PyErr_SetString(PyExc_ValueError,
744 "complex() literal too large to convert");
745 return NULL;
746 }
747 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
748 PyUnicode_GET_SIZE(v),
749 s_buffer,
750 NULL))
751 return NULL;
752 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000753 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000754 }
755 else if (PyObject_AsCharBuffer(v, &s, &len)) {
756 PyErr_SetString(PyExc_TypeError,
757 "complex() arg is not a string");
758 return NULL;
759 }
760
761 /* position on first nonblank */
762 start = s;
763 while (*s && isspace(Py_CHARMASK(*s)))
764 s++;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000765 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000766 PyErr_SetString(PyExc_ValueError,
767 "complex() arg is an empty string");
768 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000769 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000770 if (s[0] == '(') {
771 /* Skip over possible bracket from repr(). */
772 got_bracket = 1;
773 s++;
774 while (*s && isspace(Py_CHARMASK(*s)))
775 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000776 }
777
778 z = -1.0;
779 sign = 1;
780 do {
781
782 switch (*s) {
783
784 case '\0':
785 if (s-start != len) {
786 PyErr_SetString(
787 PyExc_ValueError,
788 "complex() arg contains a null byte");
789 return NULL;
790 }
791 if(!done) sw_error=1;
792 break;
793
Guido van Rossumd8faa362007-04-27 19:54:29 +0000794 case ')':
795 if (!got_bracket || !(got_re || got_im)) {
796 sw_error=1;
797 break;
798 }
799 got_bracket=0;
800 done=1;
801 s++;
802 while (*s && isspace(Py_CHARMASK(*s)))
803 s++;
804 if (*s) sw_error=1;
805 break;
806
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 case '-':
808 sign = -1;
809 /* Fallthrough */
810 case '+':
811 if (done) sw_error=1;
812 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000813 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 isspace(Py_CHARMASK(*s)) ) sw_error=1;
815 break;
816
817 case 'J':
818 case 'j':
819 if (got_im || done) {
820 sw_error = 1;
821 break;
822 }
823 if (z<0.0) {
824 y=sign;
825 }
826 else{
827 y=sign*z;
828 }
829 got_im=1;
830 s++;
831 if (*s!='+' && *s!='-' )
832 done=1;
833 break;
834
835 default:
836 if (isspace(Py_CHARMASK(*s))) {
837 while (*s && isspace(Py_CHARMASK(*s)))
838 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000839 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840 sw_error=1;
841 else
842 done = 1;
843 break;
844 }
845 digit_or_dot =
846 (*s=='.' || isdigit(Py_CHARMASK(*s)));
847 if (done||!digit_or_dot) {
848 sw_error=1;
849 break;
850 }
851 errno = 0;
852 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000853 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854 PyFPE_END_PROTECT(z)
855 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000856 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000857 "float() out of range: %.150s", s);
858 PyErr_SetString(
859 PyExc_ValueError,
860 buffer);
861 return NULL;
862 }
863 s=end;
864 if (*s=='J' || *s=='j') {
865
866 break;
867 }
868 if (got_re) {
869 sw_error=1;
870 break;
871 }
872
873 /* accept a real part */
874 x=sign*z;
875 got_re=1;
876 if (got_im) done=1;
877 z = -1.0;
878 sign = 1;
879 break;
880
881 } /* end of switch */
882
Tim Peters077f2712002-04-14 22:04:03 +0000883 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000884
Guido van Rossumd8faa362007-04-27 19:54:29 +0000885 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000886 PyErr_SetString(PyExc_ValueError,
887 "complex() arg is a malformed string");
888 return NULL;
889 }
890
891 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000892}
893
Tim Peters6d6c1a32001-08-02 04:15:00 +0000894static PyObject *
895complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
896{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000897 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000898 PyNumberMethods *nbr, *nbi = NULL;
899 Py_complex cr, ci;
900 int own_r = 0;
Christian Heimes69a79632007-11-28 10:04:30 +0000901 int cr_is_complex = 0;
902 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000903 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000904 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905
906 r = Py_False;
907 i = NULL;
908 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
909 &r, &i))
910 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000911
Guido van Rossumd8faa362007-04-27 19:54:29 +0000912 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000913 if (PyComplex_CheckExact(r) && i == NULL &&
914 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000915 /* Note that we can't know whether it's safe to return
916 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000917 to exact complexes here. If either the input or the
918 output is a complex subclass, it will be handled below
919 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000920 Py_INCREF(r);
921 return r;
922 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000923 if (PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000924 if (i != NULL) {
925 PyErr_SetString(PyExc_TypeError,
926 "complex() can't take second arg"
927 " if first is a string");
928 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000929 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000930 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000931 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000932 if (i != NULL && PyUnicode_Check(i)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000933 PyErr_SetString(PyExc_TypeError,
934 "complex() second arg can't be a string");
935 return NULL;
936 }
Tim Peters2400fa42001-09-12 19:12:49 +0000937
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000938 /* XXX Hack to support classes with __complex__ method */
939 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000940 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000941 if (complexstr == NULL)
942 return NULL;
943 }
944 f = PyObject_GetAttr(r, complexstr);
945 if (f == NULL)
946 PyErr_Clear();
947 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000948 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000949 if (args == NULL)
950 return NULL;
951 r = PyEval_CallObject(f, args);
952 Py_DECREF(args);
953 Py_DECREF(f);
954 if (r == NULL)
955 return NULL;
956 own_r = 1;
957 }
Tim Peters2400fa42001-09-12 19:12:49 +0000958 nbr = r->ob_type->tp_as_number;
959 if (i != NULL)
960 nbi = i->ob_type->tp_as_number;
961 if (nbr == NULL || nbr->nb_float == NULL ||
962 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000963 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000964 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000965 if (own_r) {
966 Py_DECREF(r);
967 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000968 return NULL;
969 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000970
971 /* If we get this far, then the "real" and "imag" parts should
972 both be treated as numbers, and the constructor should return a
973 complex number equal to (real + imag*1j).
974
975 Note that we do NOT assume the input to already be in canonical
976 form; the "real" and "imag" parts might themselves be complex
977 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000978 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000979 /* Note that if r is of a complex subtype, we're only
980 retaining its real & imag parts here, and the return
981 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000982 cr = ((PyComplexObject*)r)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +0000983 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 if (own_r) {
985 Py_DECREF(r);
986 }
987 }
988 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000989 /* The "real" part really is entirely real, and contributes
990 nothing in the imaginary direction.
991 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000992 tmp = PyNumber_Float(r);
993 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000994 /* r was a newly created complex number, rather
995 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000996 Py_DECREF(r);
997 }
998 if (tmp == NULL)
999 return NULL;
1000 if (!PyFloat_Check(tmp)) {
1001 PyErr_SetString(PyExc_TypeError,
1002 "float(r) didn't return a float");
1003 Py_DECREF(tmp);
1004 return NULL;
1005 }
1006 cr.real = PyFloat_AsDouble(tmp);
Christian Heimes587c2bf2008-01-19 16:21:02 +00001007 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009 }
1010 if (i == NULL) {
1011 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012 }
Christian Heimes69a79632007-11-28 10:04:30 +00001013 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001014 ci = ((PyComplexObject*)i)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +00001015 ci_is_complex = 1;
1016 } else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001017 /* The "imag" part really is entirely imaginary, and
1018 contributes nothing in the real direction.
1019 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020 tmp = (*nbi->nb_float)(i);
1021 if (tmp == NULL)
1022 return NULL;
1023 ci.real = PyFloat_AsDouble(tmp);
1024 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001025 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001026 /* If the input was in canonical form, then the "real" and "imag"
Christian Heimes69a79632007-11-28 10:04:30 +00001027 parts are real numbers, so that ci.imag and cr.imag are zero.
Guido van Rossumd8faa362007-04-27 19:54:29 +00001028 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001029
1030 if (ci_is_complex) {
1031 cr.real -= ci.imag;
1032 }
1033 if (cr_is_complex) {
1034 ci.real += cr.imag;
1035 }
1036 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001037}
1038
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001039PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001040"complex(real[, imag]) -> complex number\n"
1041"\n"
1042"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001043"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001044
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001045static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001046 (binaryfunc)complex_add, /* nb_add */
1047 (binaryfunc)complex_sub, /* nb_subtract */
1048 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001049 (binaryfunc)complex_remainder, /* nb_remainder */
1050 (binaryfunc)complex_divmod, /* nb_divmod */
1051 (ternaryfunc)complex_pow, /* nb_power */
1052 (unaryfunc)complex_neg, /* nb_negative */
1053 (unaryfunc)complex_pos, /* nb_positive */
1054 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00001055 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001056 0, /* nb_invert */
1057 0, /* nb_lshift */
1058 0, /* nb_rshift */
1059 0, /* nb_and */
1060 0, /* nb_xor */
1061 0, /* nb_or */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001062 complex_int, /* nb_int */
Mark Dickinson8055afd2009-01-17 10:04:45 +00001063 0, /* nb_reserved */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 complex_float, /* nb_float */
Guido van Rossum4668b002001-08-08 05:00:18 +00001065 0, /* nb_inplace_add */
1066 0, /* nb_inplace_subtract */
1067 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001068 0, /* nb_inplace_remainder */
1069 0, /* nb_inplace_power */
1070 0, /* nb_inplace_lshift */
1071 0, /* nb_inplace_rshift */
1072 0, /* nb_inplace_and */
1073 0, /* nb_inplace_xor */
1074 0, /* nb_inplace_or */
1075 (binaryfunc)complex_int_div, /* nb_floor_divide */
1076 (binaryfunc)complex_div, /* nb_true_divide */
1077 0, /* nb_inplace_floor_divide */
1078 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001079};
1080
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001082 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001083 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001084 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001085 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001086 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00001087 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001088 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001089 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00001090 0, /* tp_reserved */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001091 (reprfunc)complex_repr, /* tp_repr */
1092 &complex_as_number, /* tp_as_number */
1093 0, /* tp_as_sequence */
1094 0, /* tp_as_mapping */
1095 (hashfunc)complex_hash, /* tp_hash */
1096 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001097 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001098 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001099 0, /* tp_setattro */
1100 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001101 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1102 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001103 0, /* tp_traverse */
1104 0, /* tp_clear */
1105 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001106 0, /* tp_weaklistoffset */
1107 0, /* tp_iter */
1108 0, /* tp_iternext */
1109 complex_methods, /* tp_methods */
1110 complex_members, /* tp_members */
1111 0, /* tp_getset */
1112 0, /* tp_base */
1113 0, /* tp_dict */
1114 0, /* tp_descr_get */
1115 0, /* tp_descr_set */
1116 0, /* tp_dictoffset */
1117 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001118 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001119 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001120 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001121};
1122
1123#endif