blob: 75283a0236f8245b493e49343c447a1331ca3e87 [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_long(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 long; use long(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 *
Fred Drake4288c802000-07-09 04:36:04 +0000672complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000673{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000675 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000676 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000677}
678
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000680complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000681{
Guido van Rossum926518b1996-08-19 19:30:45 +0000682 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000683 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000684 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000685 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000686}
687
Guido van Rossum46334cd2007-08-01 17:43:15 +0000688PyDoc_STRVAR(complex_conjugate_doc,
689"complex.conjugate() -> complex\n"
690"\n"
691"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
692
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000693static PyObject *
694complex_getnewargs(PyComplexObject *v)
695{
Georg Brandl0c77a822008-06-10 16:37:50 +0000696 Py_complex c = v->cval;
697 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000698}
699
Christian Heimes53876d92008-04-19 00:31:39 +0000700#if 0
701static PyObject *
702complex_is_finite(PyObject *self)
703{
704 Py_complex c;
705 c = ((PyComplexObject *)self)->cval;
706 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
707 Py_IS_FINITE(c.imag)));
708}
709
710PyDoc_STRVAR(complex_is_finite_doc,
711"complex.is_finite() -> bool\n"
712"\n"
713"Returns True if the real and the imaginary part is finite.");
714#endif
715
Guido van Rossumf9fca921996-01-12 00:47:05 +0000716static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000717 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
718 complex_conjugate_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000719#if 0
720 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
721 complex_is_finite_doc},
722#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000723 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000724 {NULL, NULL} /* sentinel */
725};
726
Guido van Rossum6f799372001-09-20 20:46:19 +0000727static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000728 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000729 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000730 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000731 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000732 {0},
733};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000734
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000736complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000737{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000738 const char *s, *start;
739 char *end;
740 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000741 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000742 int digit_or_dot;
743 int sw_error=0;
744 int sign;
745 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000746 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000747 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000748
Neal Norwitzed2b7392007-08-26 04:51:10 +0000749 if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000750 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000751 PyErr_SetString(PyExc_ValueError,
752 "complex() literal too large to convert");
753 return NULL;
754 }
755 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
756 PyUnicode_GET_SIZE(v),
757 s_buffer,
758 NULL))
759 return NULL;
760 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000761 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000762 }
763 else if (PyObject_AsCharBuffer(v, &s, &len)) {
764 PyErr_SetString(PyExc_TypeError,
765 "complex() arg is not a string");
766 return NULL;
767 }
768
769 /* position on first nonblank */
770 start = s;
771 while (*s && isspace(Py_CHARMASK(*s)))
772 s++;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000773 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000774 PyErr_SetString(PyExc_ValueError,
775 "complex() arg is an empty string");
776 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000777 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000778 if (s[0] == '(') {
779 /* Skip over possible bracket from repr(). */
780 got_bracket = 1;
781 s++;
782 while (*s && isspace(Py_CHARMASK(*s)))
783 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000784 }
785
786 z = -1.0;
787 sign = 1;
788 do {
789
790 switch (*s) {
791
792 case '\0':
793 if (s-start != len) {
794 PyErr_SetString(
795 PyExc_ValueError,
796 "complex() arg contains a null byte");
797 return NULL;
798 }
799 if(!done) sw_error=1;
800 break;
801
Guido van Rossumd8faa362007-04-27 19:54:29 +0000802 case ')':
803 if (!got_bracket || !(got_re || got_im)) {
804 sw_error=1;
805 break;
806 }
807 got_bracket=0;
808 done=1;
809 s++;
810 while (*s && isspace(Py_CHARMASK(*s)))
811 s++;
812 if (*s) sw_error=1;
813 break;
814
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815 case '-':
816 sign = -1;
817 /* Fallthrough */
818 case '+':
819 if (done) sw_error=1;
820 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000821 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000822 isspace(Py_CHARMASK(*s)) ) sw_error=1;
823 break;
824
825 case 'J':
826 case 'j':
827 if (got_im || done) {
828 sw_error = 1;
829 break;
830 }
831 if (z<0.0) {
832 y=sign;
833 }
834 else{
835 y=sign*z;
836 }
837 got_im=1;
838 s++;
839 if (*s!='+' && *s!='-' )
840 done=1;
841 break;
842
843 default:
844 if (isspace(Py_CHARMASK(*s))) {
845 while (*s && isspace(Py_CHARMASK(*s)))
846 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000847 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848 sw_error=1;
849 else
850 done = 1;
851 break;
852 }
853 digit_or_dot =
854 (*s=='.' || isdigit(Py_CHARMASK(*s)));
855 if (done||!digit_or_dot) {
856 sw_error=1;
857 break;
858 }
859 errno = 0;
860 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000861 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862 PyFPE_END_PROTECT(z)
863 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000864 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000865 "float() out of range: %.150s", s);
866 PyErr_SetString(
867 PyExc_ValueError,
868 buffer);
869 return NULL;
870 }
871 s=end;
872 if (*s=='J' || *s=='j') {
873
874 break;
875 }
876 if (got_re) {
877 sw_error=1;
878 break;
879 }
880
881 /* accept a real part */
882 x=sign*z;
883 got_re=1;
884 if (got_im) done=1;
885 z = -1.0;
886 sign = 1;
887 break;
888
889 } /* end of switch */
890
Tim Peters077f2712002-04-14 22:04:03 +0000891 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000892
Guido van Rossumd8faa362007-04-27 19:54:29 +0000893 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000894 PyErr_SetString(PyExc_ValueError,
895 "complex() arg is a malformed string");
896 return NULL;
897 }
898
899 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000900}
901
Tim Peters6d6c1a32001-08-02 04:15:00 +0000902static PyObject *
903complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
904{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000905 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000906 PyNumberMethods *nbr, *nbi = NULL;
907 Py_complex cr, ci;
908 int own_r = 0;
Christian Heimes69a79632007-11-28 10:04:30 +0000909 int cr_is_complex = 0;
910 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000911 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000912 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000913
914 r = Py_False;
915 i = NULL;
916 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
917 &r, &i))
918 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000919
Guido van Rossumd8faa362007-04-27 19:54:29 +0000920 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000921 if (PyComplex_CheckExact(r) && i == NULL &&
922 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000923 /* Note that we can't know whether it's safe to return
924 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000925 to exact complexes here. If either the input or the
926 output is a complex subclass, it will be handled below
927 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000928 Py_INCREF(r);
929 return r;
930 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000931 if (PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000932 if (i != NULL) {
933 PyErr_SetString(PyExc_TypeError,
934 "complex() can't take second arg"
935 " if first is a string");
936 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000937 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000938 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000939 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000940 if (i != NULL && PyUnicode_Check(i)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000941 PyErr_SetString(PyExc_TypeError,
942 "complex() second arg can't be a string");
943 return NULL;
944 }
Tim Peters2400fa42001-09-12 19:12:49 +0000945
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000946 /* XXX Hack to support classes with __complex__ method */
947 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000948 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000949 if (complexstr == NULL)
950 return NULL;
951 }
952 f = PyObject_GetAttr(r, complexstr);
953 if (f == NULL)
954 PyErr_Clear();
955 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000956 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000957 if (args == NULL)
958 return NULL;
959 r = PyEval_CallObject(f, args);
960 Py_DECREF(args);
961 Py_DECREF(f);
962 if (r == NULL)
963 return NULL;
964 own_r = 1;
965 }
Tim Peters2400fa42001-09-12 19:12:49 +0000966 nbr = r->ob_type->tp_as_number;
967 if (i != NULL)
968 nbi = i->ob_type->tp_as_number;
969 if (nbr == NULL || nbr->nb_float == NULL ||
970 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000971 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000972 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000973 if (own_r) {
974 Py_DECREF(r);
975 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976 return NULL;
977 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000978
979 /* If we get this far, then the "real" and "imag" parts should
980 both be treated as numbers, and the constructor should return a
981 complex number equal to (real + imag*1j).
982
983 Note that we do NOT assume the input to already be in canonical
984 form; the "real" and "imag" parts might themselves be complex
985 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000986 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000987 /* Note that if r is of a complex subtype, we're only
988 retaining its real & imag parts here, and the return
989 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000990 cr = ((PyComplexObject*)r)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +0000991 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000992 if (own_r) {
993 Py_DECREF(r);
994 }
995 }
996 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000997 /* The "real" part really is entirely real, and contributes
998 nothing in the imaginary direction.
999 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000 tmp = PyNumber_Float(r);
1001 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001002 /* r was a newly created complex number, rather
1003 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001004 Py_DECREF(r);
1005 }
1006 if (tmp == NULL)
1007 return NULL;
1008 if (!PyFloat_Check(tmp)) {
1009 PyErr_SetString(PyExc_TypeError,
1010 "float(r) didn't return a float");
1011 Py_DECREF(tmp);
1012 return NULL;
1013 }
1014 cr.real = PyFloat_AsDouble(tmp);
Christian Heimes587c2bf2008-01-19 16:21:02 +00001015 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 }
1018 if (i == NULL) {
1019 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020 }
Christian Heimes69a79632007-11-28 10:04:30 +00001021 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001022 ci = ((PyComplexObject*)i)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +00001023 ci_is_complex = 1;
1024 } else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001025 /* The "imag" part really is entirely imaginary, and
1026 contributes nothing in the real direction.
1027 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001028 tmp = (*nbi->nb_float)(i);
1029 if (tmp == NULL)
1030 return NULL;
1031 ci.real = PyFloat_AsDouble(tmp);
1032 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001033 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001034 /* If the input was in canonical form, then the "real" and "imag"
Christian Heimes69a79632007-11-28 10:04:30 +00001035 parts are real numbers, so that ci.imag and cr.imag are zero.
Guido van Rossumd8faa362007-04-27 19:54:29 +00001036 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001037
1038 if (ci_is_complex) {
1039 cr.real -= ci.imag;
1040 }
1041 if (cr_is_complex) {
1042 ci.real += cr.imag;
1043 }
1044 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001045}
1046
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001047PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001048"complex(real[, imag]) -> complex number\n"
1049"\n"
1050"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001051"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001054 (binaryfunc)complex_add, /* nb_add */
1055 (binaryfunc)complex_sub, /* nb_subtract */
1056 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001057 (binaryfunc)complex_remainder, /* nb_remainder */
1058 (binaryfunc)complex_divmod, /* nb_divmod */
1059 (ternaryfunc)complex_pow, /* nb_power */
1060 (unaryfunc)complex_neg, /* nb_negative */
1061 (unaryfunc)complex_pos, /* nb_positive */
1062 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00001063 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001064 0, /* nb_invert */
1065 0, /* nb_lshift */
1066 0, /* nb_rshift */
1067 0, /* nb_and */
1068 0, /* nb_xor */
1069 0, /* nb_or */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 complex_int, /* nb_int */
1071 complex_long, /* nb_long */
1072 complex_float, /* nb_float */
Guido van Rossum4668b002001-08-08 05:00:18 +00001073 0, /* nb_inplace_add */
1074 0, /* nb_inplace_subtract */
1075 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001076 0, /* nb_inplace_remainder */
1077 0, /* nb_inplace_power */
1078 0, /* nb_inplace_lshift */
1079 0, /* nb_inplace_rshift */
1080 0, /* nb_inplace_and */
1081 0, /* nb_inplace_xor */
1082 0, /* nb_inplace_or */
1083 (binaryfunc)complex_int_div, /* nb_floor_divide */
1084 (binaryfunc)complex_div, /* nb_true_divide */
1085 0, /* nb_inplace_floor_divide */
1086 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001087};
1088
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001089PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001090 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001091 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001093 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001094 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00001095 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001096 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001097 0, /* tp_setattr */
1098 0, /* tp_compare */
1099 (reprfunc)complex_repr, /* tp_repr */
1100 &complex_as_number, /* tp_as_number */
1101 0, /* tp_as_sequence */
1102 0, /* tp_as_mapping */
1103 (hashfunc)complex_hash, /* tp_hash */
1104 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001105 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001106 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001107 0, /* tp_setattro */
1108 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001109 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1110 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001111 0, /* tp_traverse */
1112 0, /* tp_clear */
1113 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001114 0, /* tp_weaklistoffset */
1115 0, /* tp_iter */
1116 0, /* tp_iternext */
1117 complex_methods, /* tp_methods */
1118 complex_members, /* tp_members */
1119 0, /* tp_getset */
1120 0, /* tp_base */
1121 0, /* tp_dict */
1122 0, /* tp_descr_get */
1123 0, /* tp_descr_set */
1124 0, /* tp_dictoffset */
1125 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001126 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001127 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001128 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001129};
1130
1131#endif