blob: acd5a4a1a2894fa8e3e1814c3fca7b604b4e15ad [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{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000696 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000697}
698
Christian Heimes53876d92008-04-19 00:31:39 +0000699#if 0
700static PyObject *
701complex_is_finite(PyObject *self)
702{
703 Py_complex c;
704 c = ((PyComplexObject *)self)->cval;
705 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
706 Py_IS_FINITE(c.imag)));
707}
708
709PyDoc_STRVAR(complex_is_finite_doc,
710"complex.is_finite() -> bool\n"
711"\n"
712"Returns True if the real and the imaginary part is finite.");
713#endif
714
Guido van Rossumf9fca921996-01-12 00:47:05 +0000715static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000716 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
717 complex_conjugate_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000718#if 0
719 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
720 complex_is_finite_doc},
721#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000722 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000723 {NULL, NULL} /* sentinel */
724};
725
Guido van Rossum6f799372001-09-20 20:46:19 +0000726static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000727 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000728 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000729 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000730 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000731 {0},
732};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000733
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000735complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000736{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000737 const char *s, *start;
738 char *end;
739 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000740 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000741 int digit_or_dot;
742 int sw_error=0;
743 int sign;
744 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000745 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000746 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000747
Neal Norwitzed2b7392007-08-26 04:51:10 +0000748 if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000749 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000750 PyErr_SetString(PyExc_ValueError,
751 "complex() literal too large to convert");
752 return NULL;
753 }
754 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
755 PyUnicode_GET_SIZE(v),
756 s_buffer,
757 NULL))
758 return NULL;
759 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000760 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000761 }
762 else if (PyObject_AsCharBuffer(v, &s, &len)) {
763 PyErr_SetString(PyExc_TypeError,
764 "complex() arg is not a string");
765 return NULL;
766 }
767
768 /* position on first nonblank */
769 start = s;
770 while (*s && isspace(Py_CHARMASK(*s)))
771 s++;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000772 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000773 PyErr_SetString(PyExc_ValueError,
774 "complex() arg is an empty string");
775 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000776 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000777 if (s[0] == '(') {
778 /* Skip over possible bracket from repr(). */
779 got_bracket = 1;
780 s++;
781 while (*s && isspace(Py_CHARMASK(*s)))
782 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000783 }
784
785 z = -1.0;
786 sign = 1;
787 do {
788
789 switch (*s) {
790
791 case '\0':
792 if (s-start != len) {
793 PyErr_SetString(
794 PyExc_ValueError,
795 "complex() arg contains a null byte");
796 return NULL;
797 }
798 if(!done) sw_error=1;
799 break;
800
Guido van Rossumd8faa362007-04-27 19:54:29 +0000801 case ')':
802 if (!got_bracket || !(got_re || got_im)) {
803 sw_error=1;
804 break;
805 }
806 got_bracket=0;
807 done=1;
808 s++;
809 while (*s && isspace(Py_CHARMASK(*s)))
810 s++;
811 if (*s) sw_error=1;
812 break;
813
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 case '-':
815 sign = -1;
816 /* Fallthrough */
817 case '+':
818 if (done) sw_error=1;
819 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000820 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821 isspace(Py_CHARMASK(*s)) ) sw_error=1;
822 break;
823
824 case 'J':
825 case 'j':
826 if (got_im || done) {
827 sw_error = 1;
828 break;
829 }
830 if (z<0.0) {
831 y=sign;
832 }
833 else{
834 y=sign*z;
835 }
836 got_im=1;
837 s++;
838 if (*s!='+' && *s!='-' )
839 done=1;
840 break;
841
842 default:
843 if (isspace(Py_CHARMASK(*s))) {
844 while (*s && isspace(Py_CHARMASK(*s)))
845 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000846 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 sw_error=1;
848 else
849 done = 1;
850 break;
851 }
852 digit_or_dot =
853 (*s=='.' || isdigit(Py_CHARMASK(*s)));
854 if (done||!digit_or_dot) {
855 sw_error=1;
856 break;
857 }
858 errno = 0;
859 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000860 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000861 PyFPE_END_PROTECT(z)
862 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000863 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864 "float() out of range: %.150s", s);
865 PyErr_SetString(
866 PyExc_ValueError,
867 buffer);
868 return NULL;
869 }
870 s=end;
871 if (*s=='J' || *s=='j') {
872
873 break;
874 }
875 if (got_re) {
876 sw_error=1;
877 break;
878 }
879
880 /* accept a real part */
881 x=sign*z;
882 got_re=1;
883 if (got_im) done=1;
884 z = -1.0;
885 sign = 1;
886 break;
887
888 } /* end of switch */
889
Tim Peters077f2712002-04-14 22:04:03 +0000890 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891
Guido van Rossumd8faa362007-04-27 19:54:29 +0000892 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000893 PyErr_SetString(PyExc_ValueError,
894 "complex() arg is a malformed string");
895 return NULL;
896 }
897
898 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000899}
900
Tim Peters6d6c1a32001-08-02 04:15:00 +0000901static PyObject *
902complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
903{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000904 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905 PyNumberMethods *nbr, *nbi = NULL;
906 Py_complex cr, ci;
907 int own_r = 0;
Christian Heimes69a79632007-11-28 10:04:30 +0000908 int cr_is_complex = 0;
909 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000910 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000911 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000912
913 r = Py_False;
914 i = NULL;
915 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
916 &r, &i))
917 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000918
Guido van Rossumd8faa362007-04-27 19:54:29 +0000919 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000920 if (PyComplex_CheckExact(r) && i == NULL &&
921 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000922 /* Note that we can't know whether it's safe to return
923 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000924 to exact complexes here. If either the input or the
925 output is a complex subclass, it will be handled below
926 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000927 Py_INCREF(r);
928 return r;
929 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000930 if (PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000931 if (i != NULL) {
932 PyErr_SetString(PyExc_TypeError,
933 "complex() can't take second arg"
934 " if first is a string");
935 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000936 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000937 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000938 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000939 if (i != NULL && PyUnicode_Check(i)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000940 PyErr_SetString(PyExc_TypeError,
941 "complex() second arg can't be a string");
942 return NULL;
943 }
Tim Peters2400fa42001-09-12 19:12:49 +0000944
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000945 /* XXX Hack to support classes with __complex__ method */
946 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000947 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000948 if (complexstr == NULL)
949 return NULL;
950 }
951 f = PyObject_GetAttr(r, complexstr);
952 if (f == NULL)
953 PyErr_Clear();
954 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000955 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000956 if (args == NULL)
957 return NULL;
958 r = PyEval_CallObject(f, args);
959 Py_DECREF(args);
960 Py_DECREF(f);
961 if (r == NULL)
962 return NULL;
963 own_r = 1;
964 }
Tim Peters2400fa42001-09-12 19:12:49 +0000965 nbr = r->ob_type->tp_as_number;
966 if (i != NULL)
967 nbi = i->ob_type->tp_as_number;
968 if (nbr == NULL || nbr->nb_float == NULL ||
969 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000970 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000971 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000972 if (own_r) {
973 Py_DECREF(r);
974 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000975 return NULL;
976 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000977
978 /* If we get this far, then the "real" and "imag" parts should
979 both be treated as numbers, and the constructor should return a
980 complex number equal to (real + imag*1j).
981
982 Note that we do NOT assume the input to already be in canonical
983 form; the "real" and "imag" parts might themselves be complex
984 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000985 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000986 /* Note that if r is of a complex subtype, we're only
987 retaining its real & imag parts here, and the return
988 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989 cr = ((PyComplexObject*)r)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +0000990 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000991 if (own_r) {
992 Py_DECREF(r);
993 }
994 }
995 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000996 /* The "real" part really is entirely real, and contributes
997 nothing in the imaginary direction.
998 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000999 tmp = PyNumber_Float(r);
1000 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001001 /* r was a newly created complex number, rather
1002 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 Py_DECREF(r);
1004 }
1005 if (tmp == NULL)
1006 return NULL;
1007 if (!PyFloat_Check(tmp)) {
1008 PyErr_SetString(PyExc_TypeError,
1009 "float(r) didn't return a float");
1010 Py_DECREF(tmp);
1011 return NULL;
1012 }
1013 cr.real = PyFloat_AsDouble(tmp);
Christian Heimes587c2bf2008-01-19 16:21:02 +00001014 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 }
1017 if (i == NULL) {
1018 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001019 }
Christian Heimes69a79632007-11-28 10:04:30 +00001020 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001021 ci = ((PyComplexObject*)i)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +00001022 ci_is_complex = 1;
1023 } else {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001024 /* The "imag" part really is entirely imaginary, and
1025 contributes nothing in the real direction.
1026 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001027 tmp = (*nbi->nb_float)(i);
1028 if (tmp == NULL)
1029 return NULL;
1030 ci.real = PyFloat_AsDouble(tmp);
1031 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001032 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001033 /* If the input was in canonical form, then the "real" and "imag"
Christian Heimes69a79632007-11-28 10:04:30 +00001034 parts are real numbers, so that ci.imag and cr.imag are zero.
Guido van Rossumd8faa362007-04-27 19:54:29 +00001035 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001036
1037 if (ci_is_complex) {
1038 cr.real -= ci.imag;
1039 }
1040 if (cr_is_complex) {
1041 ci.real += cr.imag;
1042 }
1043 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001044}
1045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001046PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001047"complex(real[, imag]) -> complex number\n"
1048"\n"
1049"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001050"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001051
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001052static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001053 (binaryfunc)complex_add, /* nb_add */
1054 (binaryfunc)complex_sub, /* nb_subtract */
1055 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001056 (binaryfunc)complex_remainder, /* nb_remainder */
1057 (binaryfunc)complex_divmod, /* nb_divmod */
1058 (ternaryfunc)complex_pow, /* nb_power */
1059 (unaryfunc)complex_neg, /* nb_negative */
1060 (unaryfunc)complex_pos, /* nb_positive */
1061 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00001062 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001063 0, /* nb_invert */
1064 0, /* nb_lshift */
1065 0, /* nb_rshift */
1066 0, /* nb_and */
1067 0, /* nb_xor */
1068 0, /* nb_or */
Neil Schemenauer16c70752007-09-21 20:19:23 +00001069 0, /* nb_reserved */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 complex_int, /* nb_int */
1071 complex_long, /* nb_long */
1072 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001073 0, /* nb_oct */
1074 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001075 0, /* nb_inplace_add */
1076 0, /* nb_inplace_subtract */
1077 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001078 0, /* nb_inplace_remainder */
1079 0, /* nb_inplace_power */
1080 0, /* nb_inplace_lshift */
1081 0, /* nb_inplace_rshift */
1082 0, /* nb_inplace_and */
1083 0, /* nb_inplace_xor */
1084 0, /* nb_inplace_or */
1085 (binaryfunc)complex_int_div, /* nb_floor_divide */
1086 (binaryfunc)complex_div, /* nb_true_divide */
1087 0, /* nb_inplace_floor_divide */
1088 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001089};
1090
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001091PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001092 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001093 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001094 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001095 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001096 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00001097 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001098 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001099 0, /* tp_setattr */
1100 0, /* tp_compare */
1101 (reprfunc)complex_repr, /* tp_repr */
1102 &complex_as_number, /* tp_as_number */
1103 0, /* tp_as_sequence */
1104 0, /* tp_as_mapping */
1105 (hashfunc)complex_hash, /* tp_hash */
1106 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001107 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001108 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001109 0, /* tp_setattro */
1110 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001111 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1112 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001113 0, /* tp_traverse */
1114 0, /* tp_clear */
1115 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001116 0, /* tp_weaklistoffset */
1117 0, /* tp_iter */
1118 0, /* tp_iternext */
1119 complex_methods, /* tp_methods */
1120 complex_members, /* tp_members */
1121 0, /* tp_getset */
1122 0, /* tp_base */
1123 0, /* tp_dict */
1124 0, /* tp_descr_get */
1125 0, /* tp_descr_set */
1126 0, /* tp_dictoffset */
1127 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001128 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001129 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001130 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001131};
1132
1133#endif