blob: e8c8ebb3aae356a6274ef49ef260f2af874cbc13 [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
Neal Norwitz9fdfaaf2008-03-28 05:34:59 +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
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000030#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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000040 Py_complex r;
41 r.real = a.real + b.real;
42 r.imag = a.imag + b.imag;
43 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000044}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000049 Py_complex r;
50 r.real = a.real - b.real;
51 r.imag = a.imag - b.imag;
52 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000053}
54
Tim Peters0f336042001-03-18 08:21:57 +000055Py_complex
56c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000057{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000058 Py_complex r;
59 r.real = -a.real;
60 r.imag = -a.imag;
61 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000062}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000067 Py_complex r;
68 r.real = a.real*b.real - a.imag*b.imag;
69 r.imag = a.real*b.imag + a.imag*b.real;
70 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000071}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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:
Tim Peters0f336042001-03-18 08:21:57 +000082
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000083 Py_complex r;
84 double d = b.real*b.real + b.imag*b.imag;
85 if (d == 0.)
86 errno = EDOM;
87 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;
90 ******************************************************************/
Tim Peters0f336042001-03-18 08:21:57 +000091
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000092 /* 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;
Tim Peters0f336042001-03-18 08:21:57 +0000102
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000103 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000130 Py_complex r;
131 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.)
138 errno = EDOM;
139 r.real = 0.;
140 r.imag = 0.;
141 }
142 else {
143 vabs = hypot(a.real,a.imag);
144 len = pow(vabs,b.real);
145 at = atan2(a.imag, a.real);
146 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;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000160 Py_complex r, p;
161 long mask = 1;
162 r = c_1;
163 p = x;
164 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;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000171}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000176 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000177
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000178 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));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000187
188}
189
Christian Heimes6f341092008-04-18 23:13:07 +0000190double
191c_abs(Py_complex z)
192{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000193 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
194 double result;
Christian Heimes6f341092008-04-18 23:13:07 +0000195
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000196 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;
Christian Heimes6f341092008-04-18 23:13:07 +0000220}
221
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222static PyObject *
223complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
224{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000225 PyObject *op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000226
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000227 op = type->tp_alloc(type, 0);
228 if (op != NULL)
229 ((PyComplexObject *)op)->cval = cval;
230 return op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000231}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000236 register PyComplexObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000237
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000238 /* Inline PyObject_New */
239 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
240 if (op == NULL)
241 return PyErr_NoMemory();
242 PyObject_INIT(op, &PyComplex_Type);
243 op->cval = cval;
244 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000250 Py_complex c;
251 c.real = real;
252 c.imag = imag;
253 return complex_subtype_from_c_complex(type, c);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000254}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000259 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000268 if (PyComplex_Check(op)) {
269 return ((PyComplexObject *)op)->cval.real;
270 }
271 else {
272 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000279 if (PyComplex_Check(op)) {
280 return ((PyComplexObject *)op)->cval.imag;
281 }
282 else {
283 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000290 Py_complex cv;
291 PyObject *newop = NULL;
292 static PyObject *complex_str = NULL;
Georg Brandl2b869942007-03-17 16:08:45 +0000293
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000294 assert(op);
295 /* If op is already of type PyComplex_Type, return its value */
296 if (PyComplex_Check(op)) {
297 return ((PyComplexObject *)op)->cval;
298 }
299 /* If not, use op's __complex__ method, if it exists */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000300
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000301 /* return -1 on failure */
302 cv.real = -1.;
303 cv.imag = 0.;
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000304
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000305 if (complex_str == NULL) {
306 if (!(complex_str = PyString_InternFromString("__complex__")))
307 return cv;
308 }
Georg Brandl2b869942007-03-17 16:08:45 +0000309
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000310 if (PyInstance_Check(op)) {
311 /* this can go away in python 3000 */
312 if (PyObject_HasAttr(op, complex_str)) {
313 newop = PyObject_CallMethod(op, "__complex__", NULL);
314 if (!newop)
315 return cv;
316 }
317 /* else try __float__ */
318 } else {
319 PyObject *complexfunc;
320 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
321 /* complexfunc is a borrowed reference */
322 if (complexfunc) {
323 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
324 if (!newop)
325 return cv;
326 }
327 }
328
329 if (newop) {
330 if (!PyComplex_Check(newop)) {
331 PyErr_SetString(PyExc_TypeError,
332 "__complex__ should return a complex object");
333 Py_DECREF(newop);
334 return cv;
335 }
336 cv = ((PyComplexObject *)newop)->cval;
337 Py_DECREF(newop);
338 return cv;
339 }
340 /* If neither of the above works, interpret op as a float giving the
341 real part of the result, and fill in the imaginary part as 0. */
342 else {
343 /* PyFloat_AsDouble will return -1 on failure */
344 cv.real = PyFloat_AsDouble(op);
345 return cv;
346 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000347}
348
Guido van Rossumf9fca921996-01-12 00:47:05 +0000349static void
Fred Drake4288c802000-07-09 04:36:04 +0000350complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000351{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000352 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000353}
354
355
Guido van Rossum363078a1996-05-24 20:45:01 +0000356static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000357complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000358{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000359 char format[32];
360 if (v->cval.real == 0.) {
361 if (!Py_IS_FINITE(v->cval.imag)) {
362 if (Py_IS_NAN(v->cval.imag))
363 strncpy(buf, "nan*j", 6);
364 else if (copysign(1, v->cval.imag) == 1)
365 strncpy(buf, "inf*j", 6);
366 else
367 strncpy(buf, "-inf*j", 7);
368 }
369 else {
370 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
371 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
372 strncat(buf, "j", 1);
373 }
374 } else {
375 char re[64], im[64];
376 /* Format imaginary part with sign, real part without */
377 if (!Py_IS_FINITE(v->cval.real)) {
378 if (Py_IS_NAN(v->cval.real))
379 strncpy(re, "nan", 4);
380 /* else if (copysign(1, v->cval.real) == 1) */
381 else if (v->cval.real > 0)
382 strncpy(re, "inf", 4);
383 else
384 strncpy(re, "-inf", 5);
385 }
386 else {
387 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
388 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
389 }
390 if (!Py_IS_FINITE(v->cval.imag)) {
391 if (Py_IS_NAN(v->cval.imag))
392 strncpy(im, "+nan*", 6);
393 /* else if (copysign(1, v->cval.imag) == 1) */
394 else if (v->cval.imag > 0)
395 strncpy(im, "+inf*", 6);
396 else
397 strncpy(im, "-inf*", 6);
398 }
399 else {
400 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
401 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
402 }
403 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
404 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000405}
406
407static int
Fred Drake4288c802000-07-09 04:36:04 +0000408complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000409{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000410 char buf[100];
411 complex_to_buf(buf, sizeof(buf), v,
412 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
413 Py_BEGIN_ALLOW_THREADS
414 fputs(buf, fp);
415 Py_END_ALLOW_THREADS
416 return 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000417}
418
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000420complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000421{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000422 char buf[100];
423 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
424 return PyString_FromString(buf);
Tim Peters70695122001-03-11 08:37:29 +0000425}
426
427static PyObject *
428complex_str(PyComplexObject *v)
429{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000430 char buf[100];
431 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
432 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000433}
434
Guido van Rossumf9fca921996-01-12 00:47:05 +0000435static long
Fred Drake4288c802000-07-09 04:36:04 +0000436complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000437{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000438 long hashreal, hashimag, combined;
439 hashreal = _Py_HashDouble(v->cval.real);
440 if (hashreal == -1)
441 return -1;
442 hashimag = _Py_HashDouble(v->cval.imag);
443 if (hashimag == -1)
444 return -1;
445 /* Note: if the imaginary part is 0, hashimag is 0 now,
446 * so the following returns hashreal unchanged. This is
447 * important because numbers of different types that
448 * compare equal must have the same hash value, so that
449 * hash(x + 0*j) must equal hash(x).
450 */
451 combined = hashreal + 1000003 * hashimag;
452 if (combined == -1)
453 combined = -2;
454 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000455}
456
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000457/* This macro may return! */
458#define TO_COMPLEX(obj, c) \
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000459 if (PyComplex_Check(obj)) \
460 c = ((PyComplexObject *)(obj))->cval; \
461 else if (to_complex(&(obj), &(c)) < 0) \
462 return (obj)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000463
464static int
465to_complex(PyObject **pobj, Py_complex *pc)
466{
467 PyObject *obj = *pobj;
468
469 pc->real = pc->imag = 0.0;
470 if (PyInt_Check(obj)) {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000471 pc->real = PyInt_AS_LONG(obj);
472 return 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000473 }
474 if (PyLong_Check(obj)) {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000475 pc->real = PyLong_AsDouble(obj);
476 if (pc->real == -1.0 && PyErr_Occurred()) {
477 *pobj = NULL;
478 return -1;
479 }
480 return 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000481 }
482 if (PyFloat_Check(obj)) {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000483 pc->real = PyFloat_AsDouble(obj);
484 return 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000485 }
486 Py_INCREF(Py_NotImplemented);
487 *pobj = Py_NotImplemented;
488 return -1;
489}
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000490
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000491
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000493complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000494{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000495 Py_complex result;
496 PyFPE_START_PROTECT("complex_add", return 0)
497 result = c_sum(v->cval,w->cval);
498 PyFPE_END_PROTECT(result)
499 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000500}
501
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000503complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000504{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000505 Py_complex result;
506 PyFPE_START_PROTECT("complex_sub", return 0)
507 result = c_diff(v->cval,w->cval);
508 PyFPE_END_PROTECT(result)
509 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000510}
511
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000513complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000514{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000515 Py_complex result;
516 PyFPE_START_PROTECT("complex_mul", return 0)
517 result = c_prod(v->cval,w->cval);
518 PyFPE_END_PROTECT(result)
519 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000520}
521
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000523complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000524{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000525 Py_complex quot;
Christian Heimes6f341092008-04-18 23:13:07 +0000526
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000527 PyFPE_START_PROTECT("complex_div", return 0)
528 errno = 0;
529 quot = c_quot(v->cval,w->cval);
530 PyFPE_END_PROTECT(quot)
531 if (errno == EDOM) {
532 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
533 return NULL;
534 }
535 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000536}
537
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000539complex_classic_div(PyComplexObject *v, PyComplexObject *w)
540{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000541 Py_complex quot;
Guido van Rossum393661d2001-08-31 17:40:15 +0000542
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000543 if (Py_DivisionWarningFlag >= 2 &&
544 PyErr_Warn(PyExc_DeprecationWarning,
545 "classic complex division") < 0)
546 return NULL;
Guido van Rossum393661d2001-08-31 17:40:15 +0000547
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000548 PyFPE_START_PROTECT("complex_classic_div", return 0)
549 errno = 0;
550 quot = c_quot(v->cval,w->cval);
551 PyFPE_END_PROTECT(quot)
552 if (errno == EDOM) {
553 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
554 return NULL;
555 }
556 return PyComplex_FromCComplex(quot);
Guido van Rossum393661d2001-08-31 17:40:15 +0000557}
558
559static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000560complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000561{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000562 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000563
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000564 if (PyErr_Warn(PyExc_DeprecationWarning,
565 "complex divmod(), // and % are deprecated") < 0)
566 return NULL;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000567
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000568 errno = 0;
569 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
570 if (errno == EDOM) {
571 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
572 return NULL;
573 }
574 div.real = floor(div.real); /* Use the floor of the real part. */
575 div.imag = 0.0;
576 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossum3be12e91996-09-12 20:56:18 +0000577
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000578 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000579}
580
Guido van Rossumee09fc11996-09-11 13:55:55 +0000581
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000583complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000584{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000585 Py_complex div, mod;
586 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000587
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000588 if (PyErr_Warn(PyExc_DeprecationWarning,
589 "complex divmod(), // and % are deprecated") < 0)
590 return NULL;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000591
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000592 errno = 0;
593 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
594 if (errno == EDOM) {
595 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
596 return NULL;
597 }
598 div.real = floor(div.real); /* Use the floor of the real part. */
599 div.imag = 0.0;
600 mod = c_diff(v->cval, c_prod(w->cval, div));
601 d = PyComplex_FromCComplex(div);
602 m = PyComplex_FromCComplex(mod);
603 z = PyTuple_Pack(2, d, m);
604 Py_XDECREF(d);
605 Py_XDECREF(m);
606 return z;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000607}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000608
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609static PyObject *
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000610complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000611{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000612 Py_complex p;
613 Py_complex exponent;
614 long int_exponent;
615 Py_complex a, b;
616 TO_COMPLEX(v, a);
617 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000618
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000619 if (z!=Py_None) {
620 PyErr_SetString(PyExc_ValueError, "complex modulo");
621 return NULL;
622 }
623 PyFPE_START_PROTECT("complex_pow", return 0)
624 errno = 0;
625 exponent = b;
626 int_exponent = (long)exponent.real;
627 if (exponent.imag == 0. && exponent.real == int_exponent)
628 p = c_powi(a,int_exponent);
629 else
630 p = c_pow(a,exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000631
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000632 PyFPE_END_PROTECT(p)
633 Py_ADJUST_ERANGE2(p.real, p.imag);
634 if (errno == EDOM) {
635 PyErr_SetString(PyExc_ZeroDivisionError,
636 "0.0 to a negative or complex power");
637 return NULL;
638 }
639 else if (errno == ERANGE) {
640 PyErr_SetString(PyExc_OverflowError,
641 "complex exponentiation");
642 return NULL;
643 }
644 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000645}
646
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000648complex_int_div(PyComplexObject *v, PyComplexObject *w)
649{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000650 PyObject *t, *r;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000651
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000652 if (PyErr_Warn(PyExc_DeprecationWarning,
653 "complex divmod(), // and % are deprecated") < 0)
654 return NULL;
655
656 t = complex_divmod(v, w);
657 if (t != NULL) {
658 r = PyTuple_GET_ITEM(t, 0);
659 Py_INCREF(r);
660 Py_DECREF(t);
661 return r;
662 }
663 return NULL;
Guido van Rossum4668b002001-08-08 05:00:18 +0000664}
665
666static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000667complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000668{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000669 Py_complex neg;
670 neg.real = -v->cval.real;
671 neg.imag = -v->cval.imag;
672 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000673}
674
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000676complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000677{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000678 if (PyComplex_CheckExact(v)) {
679 Py_INCREF(v);
680 return (PyObject *)v;
681 }
682 else
683 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000684}
685
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000687complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000688{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000689 double result;
Christian Heimes6f341092008-04-18 23:13:07 +0000690
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000691 PyFPE_START_PROTECT("complex_abs", return 0)
692 result = c_abs(v->cval);
693 PyFPE_END_PROTECT(result)
Christian Heimes6f341092008-04-18 23:13:07 +0000694
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000695 if (errno == ERANGE) {
696 PyErr_SetString(PyExc_OverflowError,
697 "absolute value too large");
698 return NULL;
699 }
700 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000701}
702
703static int
Fred Drake4288c802000-07-09 04:36:04 +0000704complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000705{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000706 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000707}
708
709static int
Fred Drake4288c802000-07-09 04:36:04 +0000710complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000711{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000712 Py_complex cval;
713 cval.imag = 0.;
714 if (PyInt_Check(*pw)) {
715 cval.real = (double)PyInt_AsLong(*pw);
716 *pw = PyComplex_FromCComplex(cval);
717 Py_INCREF(*pv);
718 return 0;
719 }
720 else if (PyLong_Check(*pw)) {
721 cval.real = PyLong_AsDouble(*pw);
722 if (cval.real == -1.0 && PyErr_Occurred())
723 return -1;
724 *pw = PyComplex_FromCComplex(cval);
725 Py_INCREF(*pv);
726 return 0;
727 }
728 else if (PyFloat_Check(*pw)) {
729 cval.real = PyFloat_AsDouble(*pw);
730 *pw = PyComplex_FromCComplex(cval);
731 Py_INCREF(*pv);
732 return 0;
733 }
734 else if (PyComplex_Check(*pw)) {
735 Py_INCREF(*pv);
736 Py_INCREF(*pw);
737 return 0;
738 }
739 return 1; /* Can't do it */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000740}
741
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000742static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000743complex_richcompare(PyObject *v, PyObject *w, int op)
744{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000745 int c;
746 Py_complex i, j;
747 PyObject *res;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000748
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000749 c = PyNumber_CoerceEx(&v, &w);
750 if (c < 0)
751 return NULL;
752 if (c > 0) {
753 Py_INCREF(Py_NotImplemented);
754 return Py_NotImplemented;
755 }
756 /* Make sure both arguments are complex. */
757 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
758 Py_DECREF(v);
759 Py_DECREF(w);
760 Py_INCREF(Py_NotImplemented);
761 return Py_NotImplemented;
762 }
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000763
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000764 i = ((PyComplexObject *)v)->cval;
765 j = ((PyComplexObject *)w)->cval;
766 Py_DECREF(v);
767 Py_DECREF(w);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000768
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000769 if (op != Py_EQ && op != Py_NE) {
770 PyErr_SetString(PyExc_TypeError,
771 "no ordering relation is defined for complex numbers");
772 return NULL;
773 }
Guido van Rossum22056422001-09-24 17:52:04 +0000774
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000775 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
776 res = Py_True;
777 else
778 res = Py_False;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000779
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000780 Py_INCREF(res);
781 return res;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000782}
783
784static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000785complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000786{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000787 PyErr_SetString(PyExc_TypeError,
788 "can't convert complex to int");
789 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000790}
791
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000792static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000793complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000794{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000795 PyErr_SetString(PyExc_TypeError,
796 "can't convert complex to long");
797 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000798}
799
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000801complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000802{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000803 PyErr_SetString(PyExc_TypeError,
804 "can't convert complex to float");
805 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000806}
807
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000808static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000809complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000810{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000811 Py_complex c;
812 c = ((PyComplexObject *)self)->cval;
813 c.imag = -c.imag;
814 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000815}
816
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000817PyDoc_STRVAR(complex_conjugate_doc,
818"complex.conjugate() -> complex\n"
819"\n"
820"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
821
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000822static PyObject *
823complex_getnewargs(PyComplexObject *v)
824{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000825 Py_complex c = v->cval;
826 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000827}
828
Christian Heimes6f341092008-04-18 23:13:07 +0000829#if 0
830static PyObject *
831complex_is_finite(PyObject *self)
832{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000833 Py_complex c;
834 c = ((PyComplexObject *)self)->cval;
835 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
836 Py_IS_FINITE(c.imag)));
Christian Heimes6f341092008-04-18 23:13:07 +0000837}
838
839PyDoc_STRVAR(complex_is_finite_doc,
840"complex.is_finite() -> bool\n"
841"\n"
842"Returns True if the real and the imaginary part is finite.");
843#endif
844
Guido van Rossumf9fca921996-01-12 00:47:05 +0000845static PyMethodDef complex_methods[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000846 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
847 complex_conjugate_doc},
Christian Heimes6f341092008-04-18 23:13:07 +0000848#if 0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000849 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
850 complex_is_finite_doc},
Christian Heimes6f341092008-04-18 23:13:07 +0000851#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000852 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
853 {NULL, NULL} /* sentinel */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000854};
855
Guido van Rossum6f799372001-09-20 20:46:19 +0000856static PyMemberDef complex_members[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000857 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
858 "the real part of a complex number"},
859 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
860 "the imaginary part of a complex number"},
861 {0},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000863
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000864static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000865complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000866{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000867 const char *s, *start;
868 char *end;
869 double x=0.0, y=0.0, z;
870 int got_re=0, got_im=0, got_bracket=0, done=0;
871 int digit_or_dot;
872 int sw_error=0;
873 int sign;
874 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000875#ifdef Py_USING_UNICODE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000876 char s_buffer[256];
Guido van Rossum70e36882001-10-25 18:07:22 +0000877#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000878 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000880 if (PyString_Check(v)) {
881 s = PyString_AS_STRING(v);
882 len = PyString_GET_SIZE(v);
883 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000884#ifdef Py_USING_UNICODE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000885 else if (PyUnicode_Check(v)) {
886 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
887 PyErr_SetString(PyExc_ValueError,
888 "complex() literal too large to convert");
889 return NULL;
890 }
891 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
892 PyUnicode_GET_SIZE(v),
893 s_buffer,
894 NULL))
895 return NULL;
896 s = s_buffer;
897 len = strlen(s);
898 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000899#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000900 else if (PyObject_AsCharBuffer(v, &s, &len)) {
901 PyErr_SetString(PyExc_TypeError,
902 "complex() arg is not a string");
903 return NULL;
904 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000906 /* position on first nonblank */
907 start = s;
908 while (*s && isspace(Py_CHARMASK(*s)))
909 s++;
910 if (s[0] == '\0') {
911 PyErr_SetString(PyExc_ValueError,
912 "complex() arg is an empty string");
913 return NULL;
914 }
915 if (s[0] == '(') {
916 /* Skip over possible bracket from repr(). */
917 got_bracket = 1;
918 s++;
919 while (*s && isspace(Py_CHARMASK(*s)))
920 s++;
921 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000922
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000923 z = -1.0;
924 sign = 1;
925 do {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000926
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000927 switch (*s) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000928
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000929 case '\0':
930 if (s-start != len) {
931 PyErr_SetString(
932 PyExc_ValueError,
933 "complex() arg contains a null byte");
934 return NULL;
935 }
936 if(!done) sw_error=1;
937 break;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000938
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000939 case ')':
940 if (!got_bracket || !(got_re || got_im)) {
941 sw_error=1;
942 break;
943 }
944 got_bracket=0;
945 done=1;
946 s++;
947 while (*s && isspace(Py_CHARMASK(*s)))
948 s++;
949 if (*s) sw_error=1;
950 break;
Collin Wintere38051d2007-03-09 20:33:07 +0000951
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000952 case '-':
953 sign = -1;
954 /* Fallthrough */
955 case '+':
956 if (done) sw_error=1;
957 s++;
958 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
959 isspace(Py_CHARMASK(*s)) ) sw_error=1;
960 break;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000961
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000962 case 'J':
963 case 'j':
964 if (got_im || done) {
965 sw_error = 1;
966 break;
967 }
968 if (z<0.0) {
969 y=sign;
970 }
971 else{
972 y=sign*z;
973 }
974 got_im=1;
975 s++;
976 if (*s!='+' && *s!='-' )
977 done=1;
978 break;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000979
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000980 default:
981 if (isspace(Py_CHARMASK(*s))) {
982 while (*s && isspace(Py_CHARMASK(*s)))
983 s++;
984 if (*s && *s != ')')
985 sw_error=1;
986 else
987 done = 1;
988 break;
989 }
990 digit_or_dot =
991 (*s=='.' || isdigit(Py_CHARMASK(*s)));
992 if (done||!digit_or_dot) {
993 sw_error=1;
994 break;
995 }
996 errno = 0;
997 PyFPE_START_PROTECT("strtod", return 0)
998 z = PyOS_ascii_strtod(s, &end) ;
999 PyFPE_END_PROTECT(z)
1000 if (errno == ERANGE && fabs(z) >= 1.0) {
1001 PyOS_snprintf(buffer, sizeof(buffer),
1002 "float() out of range: %.150s", s);
1003 PyErr_SetString(
1004 PyExc_ValueError,
1005 buffer);
1006 return NULL;
1007 }
1008 s=end;
1009 if (*s=='J' || *s=='j') {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001010
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001011 break;
1012 }
1013 if (got_re) {
1014 sw_error=1;
1015 break;
1016 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001018 /* accept a real part */
1019 x=sign*z;
1020 got_re=1;
1021 if (got_im) done=1;
1022 z = -1.0;
1023 sign = 1;
1024 break;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001025
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001026 } /* end of switch */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001027
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001028 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001030 if (sw_error || got_bracket) {
1031 PyErr_SetString(PyExc_ValueError,
1032 "complex() arg is a malformed string");
1033 return NULL;
1034 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001035
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001036 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +00001037}
1038
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039static PyObject *
1040complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1041{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001042 PyObject *r, *i, *tmp, *f;
1043 PyNumberMethods *nbr, *nbi = NULL;
1044 Py_complex cr, ci;
1045 int own_r = 0;
1046 int cr_is_complex = 0;
1047 int ci_is_complex = 0;
1048 static PyObject *complexstr;
1049 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001050
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001051 r = Py_False;
1052 i = NULL;
1053 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
1054 &r, &i))
1055 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001056
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001057 /* Special-case for a single argument when type(arg) is complex. */
1058 if (PyComplex_CheckExact(r) && i == NULL &&
1059 type == &PyComplex_Type) {
1060 /* Note that we can't know whether it's safe to return
1061 a complex *subclass* instance as-is, hence the restriction
1062 to exact complexes here. If either the input or the
1063 output is a complex subclass, it will be handled below
1064 as a non-orthogonal vector. */
1065 Py_INCREF(r);
1066 return r;
1067 }
1068 if (PyString_Check(r) || PyUnicode_Check(r)) {
1069 if (i != NULL) {
1070 PyErr_SetString(PyExc_TypeError,
1071 "complex() can't take second arg"
1072 " if first is a string");
1073 return NULL;
1074 }
1075 return complex_subtype_from_string(type, r);
1076 }
1077 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
1078 PyErr_SetString(PyExc_TypeError,
1079 "complex() second arg can't be a string");
1080 return NULL;
1081 }
Tim Peters2400fa42001-09-12 19:12:49 +00001082
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001083 /* XXX Hack to support classes with __complex__ method */
1084 if (complexstr == NULL) {
1085 complexstr = PyString_InternFromString("__complex__");
1086 if (complexstr == NULL)
1087 return NULL;
1088 }
1089 f = PyObject_GetAttr(r, complexstr);
1090 if (f == NULL)
1091 PyErr_Clear();
1092 else {
1093 PyObject *args = PyTuple_New(0);
1094 if (args == NULL)
1095 return NULL;
1096 r = PyEval_CallObject(f, args);
1097 Py_DECREF(args);
1098 Py_DECREF(f);
1099 if (r == NULL)
1100 return NULL;
1101 own_r = 1;
1102 }
1103 nbr = r->ob_type->tp_as_number;
1104 if (i != NULL)
1105 nbi = i->ob_type->tp_as_number;
1106 if (nbr == NULL || nbr->nb_float == NULL ||
1107 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
1108 PyErr_SetString(PyExc_TypeError,
1109 "complex() argument must be a string or a number");
1110 if (own_r) {
1111 Py_DECREF(r);
1112 }
1113 return NULL;
1114 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001115
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001116 /* If we get this far, then the "real" and "imag" parts should
1117 both be treated as numbers, and the constructor should return a
1118 complex number equal to (real + imag*1j).
Georg Brandl8f032cb2007-03-13 07:57:51 +00001119
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001120 Note that we do NOT assume the input to already be in canonical
1121 form; the "real" and "imag" parts might themselves be complex
1122 numbers, which slightly complicates the code below. */
1123 if (PyComplex_Check(r)) {
1124 /* Note that if r is of a complex subtype, we're only
1125 retaining its real & imag parts here, and the return
1126 value is (properly) of the builtin complex type. */
1127 cr = ((PyComplexObject*)r)->cval;
1128 cr_is_complex = 1;
1129 if (own_r) {
1130 Py_DECREF(r);
1131 }
1132 }
1133 else {
1134 /* The "real" part really is entirely real, and contributes
1135 nothing in the imaginary direction.
1136 Just treat it as a double. */
1137 tmp = PyNumber_Float(r);
1138 if (own_r) {
1139 /* r was a newly created complex number, rather
1140 than the original "real" argument. */
1141 Py_DECREF(r);
1142 }
1143 if (tmp == NULL)
1144 return NULL;
1145 if (!PyFloat_Check(tmp)) {
1146 PyErr_SetString(PyExc_TypeError,
1147 "float(r) didn't return a float");
1148 Py_DECREF(tmp);
1149 return NULL;
1150 }
1151 cr.real = PyFloat_AsDouble(tmp);
1152 cr.imag = 0.0; /* Shut up compiler warning */
1153 Py_DECREF(tmp);
1154 }
1155 if (i == NULL) {
1156 ci.real = 0.0;
1157 }
1158 else if (PyComplex_Check(i)) {
1159 ci = ((PyComplexObject*)i)->cval;
1160 ci_is_complex = 1;
1161 } else {
1162 /* The "imag" part really is entirely imaginary, and
1163 contributes nothing in the real direction.
1164 Just treat it as a double. */
1165 tmp = (*nbi->nb_float)(i);
1166 if (tmp == NULL)
1167 return NULL;
1168 ci.real = PyFloat_AsDouble(tmp);
1169 Py_DECREF(tmp);
1170 }
1171 /* If the input was in canonical form, then the "real" and "imag"
1172 parts are real numbers, so that ci.imag and cr.imag are zero.
1173 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001174
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001175 if (ci_is_complex) {
1176 cr.real -= ci.imag;
1177 }
1178 if (cr_is_complex) {
1179 ci.real += cr.imag;
1180 }
1181 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001182}
1183
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001184PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001185"complex(real[, imag]) -> complex number\n"
1186"\n"
1187"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001188"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001189
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001190static PyNumberMethods complex_as_number = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001191 (binaryfunc)complex_add, /* nb_add */
1192 (binaryfunc)complex_sub, /* nb_subtract */
1193 (binaryfunc)complex_mul, /* nb_multiply */
1194 (binaryfunc)complex_classic_div, /* nb_divide */
1195 (binaryfunc)complex_remainder, /* nb_remainder */
1196 (binaryfunc)complex_divmod, /* nb_divmod */
1197 (ternaryfunc)complex_pow, /* nb_power */
1198 (unaryfunc)complex_neg, /* nb_negative */
1199 (unaryfunc)complex_pos, /* nb_positive */
1200 (unaryfunc)complex_abs, /* nb_absolute */
1201 (inquiry)complex_nonzero, /* nb_nonzero */
1202 0, /* nb_invert */
1203 0, /* nb_lshift */
1204 0, /* nb_rshift */
1205 0, /* nb_and */
1206 0, /* nb_xor */
1207 0, /* nb_or */
1208 complex_coerce, /* nb_coerce */
1209 complex_int, /* nb_int */
1210 complex_long, /* nb_long */
1211 complex_float, /* nb_float */
1212 0, /* nb_oct */
1213 0, /* nb_hex */
1214 0, /* nb_inplace_add */
1215 0, /* nb_inplace_subtract */
1216 0, /* nb_inplace_multiply*/
1217 0, /* nb_inplace_divide */
1218 0, /* nb_inplace_remainder */
1219 0, /* nb_inplace_power */
1220 0, /* nb_inplace_lshift */
1221 0, /* nb_inplace_rshift */
1222 0, /* nb_inplace_and */
1223 0, /* nb_inplace_xor */
1224 0, /* nb_inplace_or */
1225 (binaryfunc)complex_int_div, /* nb_floor_divide */
1226 (binaryfunc)complex_div, /* nb_true_divide */
1227 0, /* nb_inplace_floor_divide */
1228 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001229};
1230
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001231PyTypeObject PyComplex_Type = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00001232 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1233 "complex",
1234 sizeof(PyComplexObject),
1235 0,
1236 complex_dealloc, /* tp_dealloc */
1237 (printfunc)complex_print, /* tp_print */
1238 0, /* tp_getattr */
1239 0, /* tp_setattr */
1240 0, /* tp_compare */
1241 (reprfunc)complex_repr, /* tp_repr */
1242 &complex_as_number, /* tp_as_number */
1243 0, /* tp_as_sequence */
1244 0, /* tp_as_mapping */
1245 (hashfunc)complex_hash, /* tp_hash */
1246 0, /* tp_call */
1247 (reprfunc)complex_str, /* tp_str */
1248 PyObject_GenericGetAttr, /* tp_getattro */
1249 0, /* tp_setattro */
1250 0, /* tp_as_buffer */
1251 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1252 complex_doc, /* tp_doc */
1253 0, /* tp_traverse */
1254 0, /* tp_clear */
1255 complex_richcompare, /* tp_richcompare */
1256 0, /* tp_weaklistoffset */
1257 0, /* tp_iter */
1258 0, /* tp_iternext */
1259 complex_methods, /* tp_methods */
1260 complex_members, /* tp_members */
1261 0, /* tp_getset */
1262 0, /* tp_base */
1263 0, /* tp_dict */
1264 0, /* tp_descr_get */
1265 0, /* tp_descr_set */
1266 0, /* tp_dictoffset */
1267 0, /* tp_init */
1268 PyType_GenericAlloc, /* tp_alloc */
1269 complex_new, /* tp_new */
1270 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001271};
1272
1273#endif