blob: a47cd549c558ae06d16cdd82409658e9e89749ba [file] [log] [blame]
Guido van Rossum96783941997-05-20 18:21:34 +00001
Guido van Rossumf9fca921996-01-12 00:47:05 +00002/* Complex object implementation */
3
4/* Borrows heavily from floatobject.c */
5
Guido van Rossum96783941997-05-20 18:21:34 +00006/* Submitted by Jim Hugunin */
7
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00009#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000010
Guido van Rossum65ce6de2002-06-13 17:07:07 +000011#ifndef WITHOUT_COMPLEX
12
Tim Peters70695122001-03-11 08:37:29 +000013/* Precisions used by repr() and str(), respectively.
14
15 The repr() precision (17 significant decimal digits) is the minimal number
16 that is guaranteed to have enough precision so that if the number is read
17 back in the exact same binary value is recreated. This is true for IEEE
18 floating point by design, and also happens to work for all other modern
19 hardware.
20
21 The str() precision is chosen so that in most cases, the rounding noise
22 created by various operations is suppressed, while giving plenty of
23 precision for practical use.
24*/
25
26#define PREC_REPR 17
27#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000028
29/* elementary operations on complex numbers */
30
Guido van Rossum9e720e31996-07-21 02:31:35 +000031static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
Tim Peters0f336042001-03-18 08:21:57 +000033Py_complex
34c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000035{
Guido van Rossum9e720e31996-07-21 02:31:35 +000036 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000037 r.real = a.real + b.real;
38 r.imag = a.imag + b.imag;
39 return r;
40}
41
Tim Peters0f336042001-03-18 08:21:57 +000042Py_complex
43c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000044{
Guido van Rossum9e720e31996-07-21 02:31:35 +000045 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000046 r.real = a.real - b.real;
47 r.imag = a.imag - b.imag;
48 return r;
49}
50
Tim Peters0f336042001-03-18 08:21:57 +000051Py_complex
52c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000053{
Guido van Rossum9e720e31996-07-21 02:31:35 +000054 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000055 r.real = -a.real;
56 r.imag = -a.imag;
57 return r;
58}
59
Tim Peters0f336042001-03-18 08:21:57 +000060Py_complex
61c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000062{
Guido van Rossum9e720e31996-07-21 02:31:35 +000063 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000064 r.real = a.real*b.real - a.imag*b.imag;
65 r.imag = a.real*b.imag + a.imag*b.real;
66 return r;
67}
68
Tim Peters0f336042001-03-18 08:21:57 +000069Py_complex
70c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000071{
Tim Peters0f336042001-03-18 08:21:57 +000072 /******************************************************************
73 This was the original algorithm. It's grossly prone to spurious
74 overflow and underflow errors. It also merrily divides by 0 despite
75 checking for that(!). The code still serves a doc purpose here, as
76 the algorithm following is a simple by-cases transformation of this
77 one:
78
Guido van Rossum9e720e31996-07-21 02:31:35 +000079 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000080 double d = b.real*b.real + b.imag*b.imag;
81 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000082 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000083 r.real = (a.real*b.real + a.imag*b.imag)/d;
84 r.imag = (a.imag*b.real - a.real*b.imag)/d;
85 return r;
Tim Peters0f336042001-03-18 08:21:57 +000086 ******************************************************************/
87
88 /* This algorithm is better, and is pretty obvious: first divide the
89 * numerators and denominator by whichever of {b.real, b.imag} has
90 * larger magnitude. The earliest reference I found was to CACM
91 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
92 * University). As usual, though, we're still ignoring all IEEE
93 * endcases.
94 */
95 Py_complex r; /* the result */
96 const double abs_breal = b.real < 0 ? -b.real : b.real;
97 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
98
99 if (abs_breal >= abs_bimag) {
100 /* divide tops and bottom by b.real */
101 if (abs_breal == 0.0) {
102 errno = EDOM;
103 r.real = r.imag = 0.0;
104 }
105 else {
106 const double ratio = b.imag / b.real;
107 const double denom = b.real + b.imag * ratio;
108 r.real = (a.real + a.imag * ratio) / denom;
109 r.imag = (a.imag - a.real * ratio) / denom;
110 }
111 }
112 else {
113 /* divide tops and bottom by b.imag */
114 const double ratio = b.real / b.imag;
115 const double denom = b.real * ratio + b.imag;
116 assert(b.imag != 0.0);
117 r.real = (a.real * ratio + a.imag) / denom;
118 r.imag = (a.imag * ratio - a.real) / denom;
119 }
120 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000121}
122
Tim Peters0f336042001-03-18 08:21:57 +0000123Py_complex
124c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000126 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000127 double vabs,len,at,phase;
128 if (b.real == 0. && b.imag == 0.) {
129 r.real = 1.;
130 r.imag = 0.;
131 }
132 else if (a.real == 0. && a.imag == 0.) {
133 if (b.imag != 0. || b.real < 0.)
Tim Petersbab22be2002-03-22 02:48:46 +0000134 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000135 r.real = 0.;
136 r.imag = 0.;
137 }
138 else {
139 vabs = hypot(a.real,a.imag);
140 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000141 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000142 phase = at*b.real;
143 if (b.imag != 0.0) {
144 len /= exp(at*b.imag);
145 phase += b.imag*log(vabs);
146 }
147 r.real = len*cos(phase);
148 r.imag = len*sin(phase);
149 }
150 return r;
151}
152
Tim Peters0f336042001-03-18 08:21:57 +0000153static Py_complex
154c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155{
Guido van Rossum926518b1996-08-19 19:30:45 +0000156 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000157 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000158 r = c_1;
159 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000160 while (mask > 0 && n >= mask) {
161 if (n & mask)
162 r = c_prod(r,p);
163 mask <<= 1;
164 p = c_prod(p,p);
165 }
166 return r;
167}
168
Tim Peters0f336042001-03-18 08:21:57 +0000169static Py_complex
170c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000171{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000172 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000173
174 if (n > 100 || n < -100) {
175 cn.real = (double) n;
176 cn.imag = 0.;
177 return c_pow(x,cn);
178 }
179 else if (n > 0)
180 return c_powu(x,n);
181 else
182 return c_quot(c_1,c_powu(x,-n));
183
184}
185
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186static PyObject *
187complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
188{
189 PyObject *op;
190
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000191 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000192 if (op != NULL)
193 ((PyComplexObject *)op)->cval = cval;
194 return op;
195}
196
Guido van Rossumf9fca921996-01-12 00:47:05 +0000197PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000198PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000199{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000200 register PyComplexObject *op;
201
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000202 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000203 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000204 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000206 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000207 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000209}
210
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211static PyObject *
212complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
213{
214 Py_complex c;
215 c.real = real;
216 c.imag = imag;
217 return complex_subtype_from_c_complex(type, c);
218}
219
Guido van Rossumf9fca921996-01-12 00:47:05 +0000220PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000221PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000222{
223 Py_complex c;
224 c.real = real;
225 c.imag = imag;
226 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000227}
228
229double
Fred Drake4288c802000-07-09 04:36:04 +0000230PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000231{
232 if (PyComplex_Check(op)) {
233 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000234 }
235 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000236 return PyFloat_AsDouble(op);
237 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000238}
239
240double
Fred Drake4288c802000-07-09 04:36:04 +0000241PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000242{
243 if (PyComplex_Check(op)) {
244 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000245 }
246 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000247 return 0.0;
248 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000249}
250
Guido van Rossum9e720e31996-07-21 02:31:35 +0000251Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000252PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000253{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000254 Py_complex cv;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000255 PyObject *newop = NULL;
256 static PyObject *complex_str = NULL;
257
258 assert(op);
259 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000260 if (PyComplex_Check(op)) {
261 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000262 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000263 /* If not, use op's __complex__ method, if it exists */
264
265 /* return -1 on failure */
266 cv.real = -1.;
267 cv.imag = 0.;
Christian Heimesfe82e772008-01-28 02:38:20 +0000268
269 if (complex_str == NULL) {
270 if (!(complex_str = PyUnicode_FromString("__complex__")))
271 return cv;
272 }
273
Guido van Rossumd8faa362007-04-27 19:54:29 +0000274 {
275 PyObject *complexfunc;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000276 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
277 /* complexfunc is a borrowed reference */
278 if (complexfunc) {
279 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
280 if (!newop)
281 return cv;
282 }
283 }
284
285 if (newop) {
286 if (!PyComplex_Check(newop)) {
287 PyErr_SetString(PyExc_TypeError,
288 "__complex__ should return a complex object");
289 Py_DECREF(newop);
290 return cv;
291 }
292 cv = ((PyComplexObject *)newop)->cval;
293 Py_DECREF(newop);
294 return cv;
295 }
296 /* If neither of the above works, interpret op as a float giving the
297 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000298 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000299 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000300 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000301 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000302 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000303}
304
Guido van Rossumf9fca921996-01-12 00:47:05 +0000305static void
Fred Drake4288c802000-07-09 04:36:04 +0000306complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000307{
Guido van Rossum9475a232001-10-05 20:51:39 +0000308 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000309}
310
311
Guido van Rossum363078a1996-05-24 20:45:01 +0000312static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000313complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000314{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000315 char format[32];
316 if (v->cval.real == 0.) {
Christian Heimesa156e092008-02-16 07:38:31 +0000317 if (!Py_IS_FINITE(v->cval.imag)) {
318 if (Py_IS_NAN(v->cval.imag))
319 strncpy(buf, "nan*j", 6);
320 /* else if (copysign(1, v->cval.imag) == 1) */
321 else if (v->cval.imag > 0)
322 strncpy(buf, "inf*j", 6);
323 else
324 strncpy(buf, "-inf*j", 7);
325 }
326 else {
327 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
328 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
329 strncat(buf, "j", 1);
330 }
Martin v. Löwis737ea822004-06-08 18:52:54 +0000331 } else {
332 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000333 /* Format imaginary part with sign, real part without */
Christian Heimesa156e092008-02-16 07:38:31 +0000334 if (!Py_IS_FINITE(v->cval.real)) {
335 if (Py_IS_NAN(v->cval.real))
336 strncpy(re, "nan", 4);
337 /* else if (copysign(1, v->cval.real) == 1) */
338 else if (v->cval.real > 0)
339 strncpy(re, "inf", 4);
340 else
341 strncpy(re, "-inf", 5);
342 }
343 else {
344 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
345 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
346 }
347 if (!Py_IS_FINITE(v->cval.imag)) {
348 if (Py_IS_NAN(v->cval.imag))
349 strncpy(im, "+nan*", 6);
350 /* else if (copysign(1, v->cval.imag) == 1) */
351 else if (v->cval.imag > 0)
352 strncpy(im, "+inf*", 6);
353 else
354 strncpy(im, "-inf*", 6);
355 }
356 else {
357 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
358 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
359 }
Georg Brandlc404ff22005-09-16 06:42:26 +0000360 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000361 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000362}
363
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000365complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366{
367 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000368 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000369 return PyUnicode_FromString(buf);
Tim Peters70695122001-03-11 08:37:29 +0000370}
371
372static PyObject *
373complex_str(PyComplexObject *v)
374{
375 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000376 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Walter Dörwald7696ed72007-05-31 15:51:35 +0000377 return PyUnicode_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000378}
379
Guido van Rossumf9fca921996-01-12 00:47:05 +0000380static long
Fred Drake4288c802000-07-09 04:36:04 +0000381complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000382{
Tim Peters39dce292000-08-15 03:34:48 +0000383 long hashreal, hashimag, combined;
384 hashreal = _Py_HashDouble(v->cval.real);
385 if (hashreal == -1)
386 return -1;
387 hashimag = _Py_HashDouble(v->cval.imag);
388 if (hashimag == -1)
389 return -1;
390 /* Note: if the imaginary part is 0, hashimag is 0 now,
391 * so the following returns hashreal unchanged. This is
392 * important because numbers of different types that
393 * compare equal must have the same hash value, so that
394 * hash(x + 0*j) must equal hash(x).
395 */
396 combined = hashreal + 1000003 * hashimag;
397 if (combined == -1)
398 combined = -2;
399 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000400}
401
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000402/* This macro may return! */
403#define TO_COMPLEX(obj, c) \
404 if (PyComplex_Check(obj)) \
405 c = ((PyComplexObject *)(obj))->cval; \
406 else if (to_complex(&(obj), &(c)) < 0) \
407 return (obj)
408
409static int
410to_complex(PyObject **pobj, Py_complex *pc)
411{
Christian Heimes587c2bf2008-01-19 16:21:02 +0000412 PyObject *obj = *pobj;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000413
Christian Heimes587c2bf2008-01-19 16:21:02 +0000414 pc->real = pc->imag = 0.0;
415 if (PyLong_Check(obj)) {
416 pc->real = PyLong_AsDouble(obj);
417 if (pc->real == -1.0 && PyErr_Occurred()) {
418 *pobj = NULL;
419 return -1;
420 }
421 return 0;
422 }
423 if (PyFloat_Check(obj)) {
424 pc->real = PyFloat_AsDouble(obj);
425 return 0;
426 }
427 Py_INCREF(Py_NotImplemented);
428 *pobj = Py_NotImplemented;
429 return -1;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000430}
431
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000434complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000435{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000436 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000437 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000438 TO_COMPLEX(v, a);
439 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000440 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000441 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000442 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000444}
445
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000447complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000448{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000449 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000450 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000451 TO_COMPLEX(v, a);
452 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000453 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000454 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000455 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000457}
458
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000460complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000461{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000462 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000463 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000464 TO_COMPLEX(v, a);
465 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000466 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000467 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000468 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000470}
471
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000473complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000474{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000475 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000476 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000477 TO_COMPLEX(v, a);
478 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000479 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000480 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000481 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000482 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000483 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000485 return NULL;
486 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000488}
489
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000491complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000492{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000493 PyErr_SetString(PyExc_TypeError,
494 "can't mod complex numbers.");
495 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000496}
497
Guido van Rossumee09fc11996-09-11 13:55:55 +0000498
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000500complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000501{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000502 PyErr_SetString(PyExc_TypeError,
503 "can't take floor or mod of complex number.");
504 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000505}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000508complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000510 Py_complex p;
511 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000512 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000513 Py_complex a, b;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000514 TO_COMPLEX(v, a);
515 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000516
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000517 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000519 return NULL;
520 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000521 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000522 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000523 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000524 int_exponent = (long)exponent.real;
525 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000526 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000527 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000528 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000529
Guido van Rossum45b83911997-03-14 04:32:50 +0000530 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000531 Py_ADJUST_ERANGE2(p.real, p.imag);
532 if (errno == EDOM) {
533 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000535 return NULL;
536 }
Tim Petersbab22be2002-03-22 02:48:46 +0000537 else if (errno == ERANGE) {
538 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000539 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000540 return NULL;
541 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000543}
544
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000546complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000547{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000548 PyErr_SetString(PyExc_TypeError,
549 "can't take floor of complex number.");
Guido van Rossum4668b002001-08-08 05:00:18 +0000550 return NULL;
551}
552
553static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000554complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000555{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000556 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000557 neg.real = -v->cval.real;
558 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000560}
561
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000563complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000564{
Tim Peters2400fa42001-09-12 19:12:49 +0000565 if (PyComplex_CheckExact(v)) {
566 Py_INCREF(v);
567 return (PyObject *)v;
568 }
569 else
570 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000571}
572
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000574complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000575{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000576 double result;
577 PyFPE_START_PROTECT("complex_abs", return 0)
578 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000579 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000580 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000581}
582
583static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000584complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000585{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000586 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000587}
588
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000589static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000590complex_richcompare(PyObject *v, PyObject *w, int op)
591{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000592 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000593 Py_complex i, j;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000594 TO_COMPLEX(v, i);
595 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000596
Guido van Rossum22056422001-09-24 17:52:04 +0000597 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000598 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000599 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000600 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000601 return NULL;
602 }
603
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000604 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
605 res = Py_True;
606 else
607 res = Py_False;
608
609 Py_INCREF(res);
610 return res;
611}
612
613static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000614complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000615{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000617 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000618 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000619}
620
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000621static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000622complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000623{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000625 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000626 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000627}
628
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000630complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000631{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000633 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000634 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000635}
636
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000638complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000639{
Guido van Rossum926518b1996-08-19 19:30:45 +0000640 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000641 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000642 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000644}
645
Guido van Rossum46334cd2007-08-01 17:43:15 +0000646PyDoc_STRVAR(complex_conjugate_doc,
647"complex.conjugate() -> complex\n"
648"\n"
649"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
650
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000651static PyObject *
652complex_getnewargs(PyComplexObject *v)
653{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000654 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000655}
656
Guido van Rossumf9fca921996-01-12 00:47:05 +0000657static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000658 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
659 complex_conjugate_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000660 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661 {NULL, NULL} /* sentinel */
662};
663
Guido van Rossum6f799372001-09-20 20:46:19 +0000664static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000665 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000666 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000667 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000668 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000669 {0},
670};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000674{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 const char *s, *start;
676 char *end;
677 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000678 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000679 int digit_or_dot;
680 int sw_error=0;
681 int sign;
682 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000683 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000684 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685
Neal Norwitzed2b7392007-08-26 04:51:10 +0000686 if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000687 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000688 PyErr_SetString(PyExc_ValueError,
689 "complex() literal too large to convert");
690 return NULL;
691 }
692 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
693 PyUnicode_GET_SIZE(v),
694 s_buffer,
695 NULL))
696 return NULL;
697 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000698 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000699 }
700 else if (PyObject_AsCharBuffer(v, &s, &len)) {
701 PyErr_SetString(PyExc_TypeError,
702 "complex() arg is not a string");
703 return NULL;
704 }
705
706 /* position on first nonblank */
707 start = s;
708 while (*s && isspace(Py_CHARMASK(*s)))
709 s++;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000710 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000711 PyErr_SetString(PyExc_ValueError,
712 "complex() arg is an empty string");
713 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000714 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000715 if (s[0] == '(') {
716 /* Skip over possible bracket from repr(). */
717 got_bracket = 1;
718 s++;
719 while (*s && isspace(Py_CHARMASK(*s)))
720 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721 }
722
723 z = -1.0;
724 sign = 1;
725 do {
726
727 switch (*s) {
728
729 case '\0':
730 if (s-start != len) {
731 PyErr_SetString(
732 PyExc_ValueError,
733 "complex() arg contains a null byte");
734 return NULL;
735 }
736 if(!done) sw_error=1;
737 break;
738
Guido van Rossumd8faa362007-04-27 19:54:29 +0000739 case ')':
740 if (!got_bracket || !(got_re || got_im)) {
741 sw_error=1;
742 break;
743 }
744 got_bracket=0;
745 done=1;
746 s++;
747 while (*s && isspace(Py_CHARMASK(*s)))
748 s++;
749 if (*s) sw_error=1;
750 break;
751
Tim Peters6d6c1a32001-08-02 04:15:00 +0000752 case '-':
753 sign = -1;
754 /* Fallthrough */
755 case '+':
756 if (done) sw_error=1;
757 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000758 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000759 isspace(Py_CHARMASK(*s)) ) sw_error=1;
760 break;
761
762 case 'J':
763 case 'j':
764 if (got_im || done) {
765 sw_error = 1;
766 break;
767 }
768 if (z<0.0) {
769 y=sign;
770 }
771 else{
772 y=sign*z;
773 }
774 got_im=1;
775 s++;
776 if (*s!='+' && *s!='-' )
777 done=1;
778 break;
779
780 default:
781 if (isspace(Py_CHARMASK(*s))) {
782 while (*s && isspace(Py_CHARMASK(*s)))
783 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000784 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785 sw_error=1;
786 else
787 done = 1;
788 break;
789 }
790 digit_or_dot =
791 (*s=='.' || isdigit(Py_CHARMASK(*s)));
792 if (done||!digit_or_dot) {
793 sw_error=1;
794 break;
795 }
796 errno = 0;
797 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000798 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 PyFPE_END_PROTECT(z)
800 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000801 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 "float() out of range: %.150s", s);
803 PyErr_SetString(
804 PyExc_ValueError,
805 buffer);
806 return NULL;
807 }
808 s=end;
809 if (*s=='J' || *s=='j') {
810
811 break;
812 }
813 if (got_re) {
814 sw_error=1;
815 break;
816 }
817
818 /* accept a real part */
819 x=sign*z;
820 got_re=1;
821 if (got_im) done=1;
822 z = -1.0;
823 sign = 1;
824 break;
825
826 } /* end of switch */
827
Tim Peters077f2712002-04-14 22:04:03 +0000828 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829
Guido van Rossumd8faa362007-04-27 19:54:29 +0000830 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831 PyErr_SetString(PyExc_ValueError,
832 "complex() arg is a malformed string");
833 return NULL;
834 }
835
836 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000837}
838
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839static PyObject *
840complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
841{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000842 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 PyNumberMethods *nbr, *nbi = NULL;
844 Py_complex cr, ci;
845 int own_r = 0;
Christian Heimes69a79632007-11-28 10:04:30 +0000846 int cr_is_complex = 0;
847 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000848 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000849 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850
851 r = Py_False;
852 i = NULL;
853 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
854 &r, &i))
855 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000856
Guido van Rossumd8faa362007-04-27 19:54:29 +0000857 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000858 if (PyComplex_CheckExact(r) && i == NULL &&
859 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000860 /* Note that we can't know whether it's safe to return
861 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000862 to exact complexes here. If either the input or the
863 output is a complex subclass, it will be handled below
864 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000865 Py_INCREF(r);
866 return r;
867 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000868 if (PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000869 if (i != NULL) {
870 PyErr_SetString(PyExc_TypeError,
871 "complex() can't take second arg"
872 " if first is a string");
873 return NULL;
Christian Heimes587c2bf2008-01-19 16:21:02 +0000874 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000876 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000877 if (i != NULL && PyUnicode_Check(i)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000878 PyErr_SetString(PyExc_TypeError,
879 "complex() second arg can't be a string");
880 return NULL;
881 }
Tim Peters2400fa42001-09-12 19:12:49 +0000882
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000883 /* XXX Hack to support classes with __complex__ method */
884 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000885 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000886 if (complexstr == NULL)
887 return NULL;
888 }
889 f = PyObject_GetAttr(r, complexstr);
890 if (f == NULL)
891 PyErr_Clear();
892 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000893 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000894 if (args == NULL)
895 return NULL;
896 r = PyEval_CallObject(f, args);
897 Py_DECREF(args);
898 Py_DECREF(f);
899 if (r == NULL)
900 return NULL;
901 own_r = 1;
902 }
Tim Peters2400fa42001-09-12 19:12:49 +0000903 nbr = r->ob_type->tp_as_number;
904 if (i != NULL)
905 nbi = i->ob_type->tp_as_number;
906 if (nbr == NULL || nbr->nb_float == NULL ||
907 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000908 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000909 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000910 if (own_r) {
911 Py_DECREF(r);
912 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000913 return NULL;
914 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000915
916 /* If we get this far, then the "real" and "imag" parts should
917 both be treated as numbers, and the constructor should return a
918 complex number equal to (real + imag*1j).
919
920 Note that we do NOT assume the input to already be in canonical
921 form; the "real" and "imag" parts might themselves be complex
922 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000923 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000924 /* Note that if r is of a complex subtype, we're only
925 retaining its real & imag parts here, and the return
926 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000927 cr = ((PyComplexObject*)r)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +0000928 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000929 if (own_r) {
930 Py_DECREF(r);
931 }
932 }
933 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000934 /* The "real" part really is entirely real, and contributes
935 nothing in the imaginary direction.
936 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000937 tmp = PyNumber_Float(r);
938 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000939 /* r was a newly created complex number, rather
940 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000941 Py_DECREF(r);
942 }
943 if (tmp == NULL)
944 return NULL;
945 if (!PyFloat_Check(tmp)) {
946 PyErr_SetString(PyExc_TypeError,
947 "float(r) didn't return a float");
948 Py_DECREF(tmp);
949 return NULL;
950 }
951 cr.real = PyFloat_AsDouble(tmp);
Christian Heimes587c2bf2008-01-19 16:21:02 +0000952 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000953 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000954 }
955 if (i == NULL) {
956 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957 }
Christian Heimes69a79632007-11-28 10:04:30 +0000958 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000959 ci = ((PyComplexObject*)i)->cval;
Christian Heimes69a79632007-11-28 10:04:30 +0000960 ci_is_complex = 1;
961 } else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000962 /* The "imag" part really is entirely imaginary, and
963 contributes nothing in the real direction.
964 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000965 tmp = (*nbi->nb_float)(i);
966 if (tmp == NULL)
967 return NULL;
968 ci.real = PyFloat_AsDouble(tmp);
969 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000970 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000971 /* If the input was in canonical form, then the "real" and "imag"
Christian Heimes69a79632007-11-28 10:04:30 +0000972 parts are real numbers, so that ci.imag and cr.imag are zero.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000973 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +0000974
975 if (ci_is_complex) {
976 cr.real -= ci.imag;
977 }
978 if (cr_is_complex) {
979 ci.real += cr.imag;
980 }
981 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000982}
983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000984PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000985"complex(real[, imag]) -> complex number\n"
986"\n"
987"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000988"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000990static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000991 (binaryfunc)complex_add, /* nb_add */
992 (binaryfunc)complex_sub, /* nb_subtract */
993 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000994 (binaryfunc)complex_remainder, /* nb_remainder */
995 (binaryfunc)complex_divmod, /* nb_divmod */
996 (ternaryfunc)complex_pow, /* nb_power */
997 (unaryfunc)complex_neg, /* nb_negative */
998 (unaryfunc)complex_pos, /* nb_positive */
999 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00001000 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001001 0, /* nb_invert */
1002 0, /* nb_lshift */
1003 0, /* nb_rshift */
1004 0, /* nb_and */
1005 0, /* nb_xor */
1006 0, /* nb_or */
Neil Schemenauer16c70752007-09-21 20:19:23 +00001007 0, /* nb_reserved */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001008 complex_int, /* nb_int */
1009 complex_long, /* nb_long */
1010 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001011 0, /* nb_oct */
1012 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001013 0, /* nb_inplace_add */
1014 0, /* nb_inplace_subtract */
1015 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001016 0, /* nb_inplace_remainder */
1017 0, /* nb_inplace_power */
1018 0, /* nb_inplace_lshift */
1019 0, /* nb_inplace_rshift */
1020 0, /* nb_inplace_and */
1021 0, /* nb_inplace_xor */
1022 0, /* nb_inplace_or */
1023 (binaryfunc)complex_int_div, /* nb_floor_divide */
1024 (binaryfunc)complex_div, /* nb_true_divide */
1025 0, /* nb_inplace_floor_divide */
1026 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001027};
1028
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001030 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001031 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001032 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001033 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001034 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +00001035 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001037 0, /* tp_setattr */
1038 0, /* tp_compare */
1039 (reprfunc)complex_repr, /* tp_repr */
1040 &complex_as_number, /* tp_as_number */
1041 0, /* tp_as_sequence */
1042 0, /* tp_as_mapping */
1043 (hashfunc)complex_hash, /* tp_hash */
1044 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001045 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001046 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001047 0, /* tp_setattro */
1048 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001049 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1050 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001051 0, /* tp_traverse */
1052 0, /* tp_clear */
1053 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001054 0, /* tp_weaklistoffset */
1055 0, /* tp_iter */
1056 0, /* tp_iternext */
1057 complex_methods, /* tp_methods */
1058 complex_members, /* tp_members */
1059 0, /* tp_getset */
1060 0, /* tp_base */
1061 0, /* tp_dict */
1062 0, /* tp_descr_get */
1063 0, /* tp_descr_set */
1064 0, /* tp_dictoffset */
1065 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001066 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001067 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001068 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001069};
1070
1071#endif