blob: 6e0fbb2b9d37bbe099c2d3ad73641d12ae55ca98 [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
30#define PREC_REPR 17
31#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
33/* elementary operations on complex numbers */
34
Guido van Rossum9e720e31996-07-21 02:31:35 +000035static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000036
Tim Peters0f336042001-03-18 08:21:57 +000037Py_complex
38c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000039{
Guido van Rossum9e720e31996-07-21 02:31:35 +000040 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000041 r.real = a.real + b.real;
42 r.imag = a.imag + b.imag;
43 return r;
44}
45
Tim Peters0f336042001-03-18 08:21:57 +000046Py_complex
47c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000048{
Guido van Rossum9e720e31996-07-21 02:31:35 +000049 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000050 r.real = a.real - b.real;
51 r.imag = a.imag - b.imag;
52 return r;
53}
54
Tim Peters0f336042001-03-18 08:21:57 +000055Py_complex
56c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000057{
Guido van Rossum9e720e31996-07-21 02:31:35 +000058 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000059 r.real = -a.real;
60 r.imag = -a.imag;
61 return r;
62}
63
Tim Peters0f336042001-03-18 08:21:57 +000064Py_complex
65c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000066{
Guido van Rossum9e720e31996-07-21 02:31:35 +000067 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000068 r.real = a.real*b.real - a.imag*b.imag;
69 r.imag = a.real*b.imag + a.imag*b.real;
70 return r;
71}
72
Tim Peters0f336042001-03-18 08:21:57 +000073Py_complex
74c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000075{
Tim Peters0f336042001-03-18 08:21:57 +000076 /******************************************************************
77 This was the original algorithm. It's grossly prone to spurious
78 overflow and underflow errors. It also merrily divides by 0 despite
79 checking for that(!). The code still serves a doc purpose here, as
80 the algorithm following is a simple by-cases transformation of this
81 one:
82
Guido van Rossum9e720e31996-07-21 02:31:35 +000083 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000084 double d = b.real*b.real + b.imag*b.imag;
85 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000086 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000087 r.real = (a.real*b.real + a.imag*b.imag)/d;
88 r.imag = (a.imag*b.real - a.real*b.imag)/d;
89 return r;
Tim Peters0f336042001-03-18 08:21:57 +000090 ******************************************************************/
91
92 /* This algorithm is better, and is pretty obvious: first divide the
93 * numerators and denominator by whichever of {b.real, b.imag} has
94 * larger magnitude. The earliest reference I found was to CACM
95 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
96 * University). As usual, though, we're still ignoring all IEEE
97 * endcases.
98 */
99 Py_complex r; /* the result */
100 const double abs_breal = b.real < 0 ? -b.real : b.real;
101 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
102
103 if (abs_breal >= abs_bimag) {
104 /* divide tops and bottom by b.real */
105 if (abs_breal == 0.0) {
106 errno = EDOM;
107 r.real = r.imag = 0.0;
108 }
109 else {
110 const double ratio = b.imag / b.real;
111 const double denom = b.real + b.imag * ratio;
112 r.real = (a.real + a.imag * ratio) / denom;
113 r.imag = (a.imag - a.real * ratio) / denom;
114 }
115 }
116 else {
117 /* divide tops and bottom by b.imag */
118 const double ratio = b.real / b.imag;
119 const double denom = b.real * ratio + b.imag;
120 assert(b.imag != 0.0);
121 r.real = (a.real * ratio + a.imag) / denom;
122 r.imag = (a.imag * ratio - a.real) / denom;
123 }
124 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125}
126
Tim Peters0f336042001-03-18 08:21:57 +0000127Py_complex
128c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000129{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000130 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000131 double vabs,len,at,phase;
132 if (b.real == 0. && b.imag == 0.) {
133 r.real = 1.;
134 r.imag = 0.;
135 }
136 else if (a.real == 0. && a.imag == 0.) {
137 if (b.imag != 0. || b.real < 0.)
Tim Petersbab22be2002-03-22 02:48:46 +0000138 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000139 r.real = 0.;
140 r.imag = 0.;
141 }
142 else {
143 vabs = hypot(a.real,a.imag);
144 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000145 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000146 phase = at*b.real;
147 if (b.imag != 0.0) {
148 len /= exp(at*b.imag);
149 phase += b.imag*log(vabs);
150 }
151 r.real = len*cos(phase);
152 r.imag = len*sin(phase);
153 }
154 return r;
155}
156
Tim Peters0f336042001-03-18 08:21:57 +0000157static Py_complex
158c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000159{
Guido van Rossum926518b1996-08-19 19:30:45 +0000160 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000161 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000162 r = c_1;
163 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000164 while (mask > 0 && n >= mask) {
165 if (n & mask)
166 r = c_prod(r,p);
167 mask <<= 1;
168 p = c_prod(p,p);
169 }
170 return r;
171}
172
Tim Peters0f336042001-03-18 08:21:57 +0000173static Py_complex
174c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000175{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000176 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000177
178 if (n > 100 || n < -100) {
179 cn.real = (double) n;
180 cn.imag = 0.;
181 return c_pow(x,cn);
182 }
183 else if (n > 0)
184 return c_powu(x,n);
185 else
186 return c_quot(c_1,c_powu(x,-n));
187
188}
189
Christian Heimes6f341092008-04-18 23:13:07 +0000190double
191c_abs(Py_complex z)
192{
193 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
194 double result;
195
196 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
197 /* C99 rules: if either the real or the imaginary part is an
198 infinity, return infinity, even if the other part is a
199 NaN. */
200 if (Py_IS_INFINITY(z.real)) {
201 result = fabs(z.real);
202 errno = 0;
203 return result;
204 }
205 if (Py_IS_INFINITY(z.imag)) {
206 result = fabs(z.imag);
207 errno = 0;
208 return result;
209 }
210 /* either the real or imaginary part is a NaN,
211 and neither is infinite. Result should be NaN. */
212 return Py_NAN;
213 }
214 result = hypot(z.real, z.imag);
215 if (!Py_IS_FINITE(result))
216 errno = ERANGE;
217 else
218 errno = 0;
219 return result;
220}
221
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222static PyObject *
223complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
224{
225 PyObject *op;
226
Georg Brandl6b50c632006-06-01 08:27:32 +0000227 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000228 if (op != NULL)
229 ((PyComplexObject *)op)->cval = cval;
230 return op;
231}
232
Guido van Rossumf9fca921996-01-12 00:47:05 +0000233PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000234PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000235{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000236 register PyComplexObject *op;
237
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000238 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000239 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000240 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000242 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000243 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000245}
246
Tim Peters6d6c1a32001-08-02 04:15:00 +0000247static PyObject *
248complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
249{
250 Py_complex c;
251 c.real = real;
252 c.imag = imag;
253 return complex_subtype_from_c_complex(type, c);
254}
255
Guido van Rossumf9fca921996-01-12 00:47:05 +0000256PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000257PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000258{
259 Py_complex c;
260 c.real = real;
261 c.imag = imag;
262 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000263}
264
265double
Fred Drake4288c802000-07-09 04:36:04 +0000266PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000267{
268 if (PyComplex_Check(op)) {
269 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000270 }
271 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000272 return PyFloat_AsDouble(op);
273 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274}
275
276double
Fred Drake4288c802000-07-09 04:36:04 +0000277PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000278{
279 if (PyComplex_Check(op)) {
280 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000281 }
282 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000283 return 0.0;
284 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000285}
286
Guido van Rossum9e720e31996-07-21 02:31:35 +0000287Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000288PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000289{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000290 Py_complex cv;
Georg Brandl2b869942007-03-17 16:08:45 +0000291 PyObject *newop = NULL;
292 static PyObject *complex_str = NULL;
293
294 assert(op);
295 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000296 if (PyComplex_Check(op)) {
297 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000298 }
Georg Brandl2b869942007-03-17 16:08:45 +0000299 /* If not, use op's __complex__ method, if it exists */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000300
Georg Brandl2b869942007-03-17 16:08:45 +0000301 /* return -1 on failure */
302 cv.real = -1.;
303 cv.imag = 0.;
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000304
305 if (complex_str == NULL) {
306 if (!(complex_str = PyString_InternFromString("__complex__")))
307 return cv;
308 }
Georg Brandl2b869942007-03-17 16:08:45 +0000309
310 if (PyInstance_Check(op)) {
311 /* this can go away in python 3000 */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000312 if (PyObject_HasAttr(op, complex_str)) {
Georg Brandl2b869942007-03-17 16:08:45 +0000313 newop = PyObject_CallMethod(op, "__complex__", NULL);
314 if (!newop)
315 return cv;
316 }
317 /* else try __float__ */
318 } else {
319 PyObject *complexfunc;
Georg Brandl2b869942007-03-17 16:08:45 +0000320 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. */
Fred Drake4288c802000-07-09 04:36:04 +0000342 else {
Georg Brandl2b869942007-03-17 16:08:45 +0000343 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000344 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000345 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000346 }
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{
Guido van Rossum9475a232001-10-05 20:51:39 +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{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000359 char format[32];
360 if (v->cval.real == 0.) {
Christian Heimes2f0da532008-02-15 06:57:08 +0000361 if (!Py_IS_FINITE(v->cval.imag)) {
362 if (Py_IS_NAN(v->cval.imag))
363 strncpy(buf, "nan*j", 6);
Christian Heimes6f341092008-04-18 23:13:07 +0000364 else if (copysign(1, v->cval.imag) == 1)
Christian Heimes2f0da532008-02-15 06:57:08 +0000365 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 }
Martin v. Löwis737ea822004-06-08 18:52:54 +0000374 } else {
375 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000376 /* Format imaginary part with sign, real part without */
Christian Heimes2f0da532008-02-15 06:57:08 +0000377 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 }
Georg Brandlc404ff22005-09-16 06:42:26 +0000403 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000404 }
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{
410 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000411 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000412 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Brett Cannon01531592007-09-17 03:28:34 +0000413 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000414 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000415 Py_END_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000416 return 0;
417}
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{
422 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000423 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000424 return PyString_FromString(buf);
425}
426
427static PyObject *
428complex_str(PyComplexObject *v)
429{
430 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000431 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 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{
Tim Peters39dce292000-08-15 03:34:48 +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) \
459 if (PyComplex_Check(obj)) \
460 c = ((PyComplexObject *)(obj))->cval; \
461 else if (to_complex(&(obj), &(c)) < 0) \
462 return (obj)
463
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)) {
471 pc->real = PyInt_AS_LONG(obj);
472 return 0;
473 }
474 if (PyLong_Check(obj)) {
475 pc->real = PyLong_AsDouble(obj);
476 if (pc->real == -1.0 && PyErr_Occurred()) {
477 *pobj = NULL;
478 return -1;
479 }
480 return 0;
481 }
482 if (PyFloat_Check(obj)) {
483 pc->real = PyFloat_AsDouble(obj);
484 return 0;
485 }
486 Py_INCREF(Py_NotImplemented);
487 *pobj = Py_NotImplemented;
488 return -1;
489}
490
491
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{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000495 Py_complex result;
496 PyFPE_START_PROTECT("complex_add", return 0)
497 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000498 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 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{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000505 Py_complex result;
506 PyFPE_START_PROTECT("complex_sub", return 0)
507 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000508 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 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{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000515 Py_complex result;
516 PyFPE_START_PROTECT("complex_mul", return 0)
517 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000518 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 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{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000525 Py_complex quot;
Christian Heimes6f341092008-04-18 23:13:07 +0000526
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000527 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000528 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000529 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000530 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000531 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000533 return NULL;
534 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 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{
541 Py_complex quot;
542
Guido van Rossum1832de42001-09-04 03:51:09 +0000543 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000544 PyErr_Warn(PyExc_DeprecationWarning,
545 "classic complex division") < 0)
546 return NULL;
547
548 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);
557}
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{
Georg Brandl96f21842008-01-19 10:18:07 +0000562 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000563
564 if (PyErr_Warn(PyExc_DeprecationWarning,
565 "complex divmod(), // and % are deprecated") < 0)
566 return NULL;
567
Guido van Rossum96783941997-05-20 18:21:34 +0000568 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000569 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000570 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000572 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));
577
Guido van Rossumc0b618a1997-05-02 03:12:38 +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{
Georg Brandl96f21842008-01-19 10:18:07 +0000585 Py_complex div, mod;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000586 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000587
588 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000589 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000590 return NULL;
591
Guido van Rossum96783941997-05-20 18:21:34 +0000592 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000593 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000594 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000596 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));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 d = PyComplex_FromCComplex(div);
602 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000603 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000604 Py_XDECREF(d);
605 Py_XDECREF(m);
606 return z;
607}
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{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000612 Py_complex p;
613 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000614 long int_exponent;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000615 Py_complex a, b;
Georg Brandl96f21842008-01-19 10:18:07 +0000616 TO_COMPLEX(v, a);
617 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000618
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000619 if (z!=Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000621 return NULL;
622 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000623 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000624 errno = 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000625 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000626 int_exponent = (long)exponent.real;
627 if (exponent.imag == 0. && exponent.real == int_exponent)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000628 p = c_powi(a,int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000629 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000630 p = c_pow(a,exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000631
Guido van Rossum45b83911997-03-14 04:32:50 +0000632 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000633 Py_ADJUST_ERANGE2(p.real, p.imag);
634 if (errno == EDOM) {
635 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000636 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637 return NULL;
638 }
Tim Petersbab22be2002-03-22 02:48:46 +0000639 else if (errno == ERANGE) {
640 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000641 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000642 return NULL;
643 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 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{
650 PyObject *t, *r;
651
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000652 if (PyErr_Warn(PyExc_DeprecationWarning,
653 "complex divmod(), // and % are deprecated") < 0)
654 return NULL;
655
Guido van Rossum4668b002001-08-08 05:00:18 +0000656 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;
664}
665
666static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000667complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000668{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000669 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000670 neg.real = -v->cval.real;
671 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672 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{
Tim Peters2400fa42001-09-12 19:12:49 +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{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000689 double result;
Christian Heimes6f341092008-04-18 23:13:07 +0000690
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000691 PyFPE_START_PROTECT("complex_abs", return 0)
Christian Heimes6f341092008-04-18 23:13:07 +0000692 result = c_abs(v->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000693 PyFPE_END_PROTECT(result)
Christian Heimes6f341092008-04-18 23:13:07 +0000694
695 if (errno == ERANGE) {
696 PyErr_SetString(PyExc_OverflowError,
697 "absolute value too large");
698 return NULL;
699 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 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{
Guido van Rossum3bbef601999-01-25 19:42:19 +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{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000712 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000713 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 if (PyInt_Check(*pw)) {
715 cval.real = (double)PyInt_AsLong(*pw);
716 *pw = PyComplex_FromCComplex(cval);
717 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000718 return 0;
719 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000720 else if (PyLong_Check(*pw)) {
721 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000722 if (cval.real == -1.0 && PyErr_Occurred())
723 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 *pw = PyComplex_FromCComplex(cval);
725 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000726 return 0;
727 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 else if (PyFloat_Check(*pw)) {
729 cval.real = PyFloat_AsDouble(*pw);
730 *pw = PyComplex_FromCComplex(cval);
731 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000732 return 0;
733 }
Guido van Rossum63805962001-09-19 01:13:10 +0000734 else if (PyComplex_Check(*pw)) {
735 Py_INCREF(*pv);
736 Py_INCREF(*pw);
737 return 0;
738 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000739 return 1; /* Can't do it */
740}
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{
745 int c;
746 Py_complex i, j;
747 PyObject *res;
748
Guido van Rossumbe4cbb12001-01-18 01:12:39 +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 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000756 /* Make sure both arguments are complex. */
757 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000758 Py_DECREF(v);
759 Py_DECREF(w);
760 Py_INCREF(Py_NotImplemented);
761 return Py_NotImplemented;
762 }
763
764 i = ((PyComplexObject *)v)->cval;
765 j = ((PyComplexObject *)w)->cval;
766 Py_DECREF(v);
767 Py_DECREF(w);
768
Guido van Rossum22056422001-09-24 17:52:04 +0000769 if (op != Py_EQ && op != Py_NE) {
770 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000771 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000772 return NULL;
773 }
774
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000775 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
776 res = Py_True;
777 else
778 res = Py_False;
779
780 Py_INCREF(res);
781 return res;
782}
783
784static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000785complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000786{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000787 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000788 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000789 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000795 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000796 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000797 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000803 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000804 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000805 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{
Guido van Rossum926518b1996-08-19 19:30:45 +0000811 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000812 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000813 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000814 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{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000825 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000826}
827
Christian Heimes6f341092008-04-18 23:13:07 +0000828#if 0
829static PyObject *
830complex_is_finite(PyObject *self)
831{
832 Py_complex c;
833 c = ((PyComplexObject *)self)->cval;
834 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
835 Py_IS_FINITE(c.imag)));
836}
837
838PyDoc_STRVAR(complex_is_finite_doc,
839"complex.is_finite() -> bool\n"
840"\n"
841"Returns True if the real and the imaginary part is finite.");
842#endif
843
Guido van Rossumf9fca921996-01-12 00:47:05 +0000844static PyMethodDef complex_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000845 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
846 complex_conjugate_doc},
Christian Heimes6f341092008-04-18 23:13:07 +0000847#if 0
848 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
849 complex_is_finite_doc},
850#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000851 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000852 {NULL, NULL} /* sentinel */
853};
854
Guido van Rossum6f799372001-09-20 20:46:19 +0000855static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000856 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000857 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000858 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000859 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 {0},
861};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000862
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000863static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000865{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000866 const char *s, *start;
867 char *end;
868 double x=0.0, y=0.0, z;
Collin Wintere38051d2007-03-09 20:33:07 +0000869 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000870 int digit_or_dot;
871 int sw_error=0;
872 int sign;
873 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000874#ifdef Py_USING_UNICODE
875 char s_buffer[256];
876#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000877 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000878
879 if (PyString_Check(v)) {
880 s = PyString_AS_STRING(v);
881 len = PyString_GET_SIZE(v);
882 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000883#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000884 else if (PyUnicode_Check(v)) {
Skip Montanaro429433b2006-04-18 00:35:43 +0000885 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000886 PyErr_SetString(PyExc_ValueError,
887 "complex() literal too large to convert");
888 return NULL;
889 }
890 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
891 PyUnicode_GET_SIZE(v),
892 s_buffer,
893 NULL))
894 return NULL;
895 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000896 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000897 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000898#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000899 else if (PyObject_AsCharBuffer(v, &s, &len)) {
900 PyErr_SetString(PyExc_TypeError,
901 "complex() arg is not a string");
902 return NULL;
903 }
904
905 /* position on first nonblank */
906 start = s;
907 while (*s && isspace(Py_CHARMASK(*s)))
908 s++;
Georg Brandl96f21842008-01-19 10:18:07 +0000909 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000910 PyErr_SetString(PyExc_ValueError,
911 "complex() arg is an empty string");
912 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +0000913 }
Collin Wintere38051d2007-03-09 20:33:07 +0000914 if (s[0] == '(') {
915 /* Skip over possible bracket from repr(). */
916 got_bracket = 1;
917 s++;
918 while (*s && isspace(Py_CHARMASK(*s)))
919 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000920 }
921
922 z = -1.0;
923 sign = 1;
924 do {
925
926 switch (*s) {
927
928 case '\0':
929 if (s-start != len) {
930 PyErr_SetString(
931 PyExc_ValueError,
932 "complex() arg contains a null byte");
933 return NULL;
934 }
935 if(!done) sw_error=1;
936 break;
937
Collin Wintere38051d2007-03-09 20:33:07 +0000938 case ')':
939 if (!got_bracket || !(got_re || got_im)) {
940 sw_error=1;
941 break;
942 }
943 got_bracket=0;
944 done=1;
945 s++;
946 while (*s && isspace(Py_CHARMASK(*s)))
947 s++;
948 if (*s) sw_error=1;
949 break;
950
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951 case '-':
952 sign = -1;
953 /* Fallthrough */
954 case '+':
955 if (done) sw_error=1;
956 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000957 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000958 isspace(Py_CHARMASK(*s)) ) sw_error=1;
959 break;
960
961 case 'J':
962 case 'j':
963 if (got_im || done) {
964 sw_error = 1;
965 break;
966 }
967 if (z<0.0) {
968 y=sign;
969 }
970 else{
971 y=sign*z;
972 }
973 got_im=1;
974 s++;
975 if (*s!='+' && *s!='-' )
976 done=1;
977 break;
978
979 default:
980 if (isspace(Py_CHARMASK(*s))) {
981 while (*s && isspace(Py_CHARMASK(*s)))
982 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000983 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 sw_error=1;
985 else
986 done = 1;
987 break;
988 }
989 digit_or_dot =
990 (*s=='.' || isdigit(Py_CHARMASK(*s)));
991 if (done||!digit_or_dot) {
992 sw_error=1;
993 break;
994 }
995 errno = 0;
996 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000997 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000998 PyFPE_END_PROTECT(z)
999 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +00001000 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +00001001 "float() out of range: %.150s", s);
1002 PyErr_SetString(
1003 PyExc_ValueError,
1004 buffer);
1005 return NULL;
1006 }
1007 s=end;
1008 if (*s=='J' || *s=='j') {
1009
1010 break;
1011 }
1012 if (got_re) {
1013 sw_error=1;
1014 break;
1015 }
1016
1017 /* accept a real part */
1018 x=sign*z;
1019 got_re=1;
1020 if (got_im) done=1;
1021 z = -1.0;
1022 sign = 1;
1023 break;
1024
1025 } /* end of switch */
1026
Tim Peters077f2712002-04-14 22:04:03 +00001027 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001028
Collin Wintere38051d2007-03-09 20:33:07 +00001029 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030 PyErr_SetString(PyExc_ValueError,
1031 "complex() arg is a malformed string");
1032 return NULL;
1033 }
1034
1035 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +00001036}
1037
Tim Peters6d6c1a32001-08-02 04:15:00 +00001038static PyObject *
1039complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1040{
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001041 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001042 PyNumberMethods *nbr, *nbi = NULL;
1043 Py_complex cr, ci;
1044 int own_r = 0;
Guido van Rossum715ec182007-11-27 22:38:36 +00001045 int cr_is_complex = 0;
1046 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001047 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001048 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001049
1050 r = Py_False;
1051 i = NULL;
1052 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
1053 &r, &i))
1054 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001055
Georg Brandl8f032cb2007-03-13 07:57:51 +00001056 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +00001057 if (PyComplex_CheckExact(r) && i == NULL &&
1058 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001059 /* Note that we can't know whether it's safe to return
1060 a complex *subclass* instance as-is, hence the restriction
Georg Brandl8f032cb2007-03-13 07:57:51 +00001061 to exact complexes here. If either the input or the
1062 output is a complex subclass, it will be handled below
1063 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001064 Py_INCREF(r);
1065 return r;
1066 }
Fred Drake526c7a02001-12-13 19:52:22 +00001067 if (PyString_Check(r) || PyUnicode_Check(r)) {
1068 if (i != NULL) {
1069 PyErr_SetString(PyExc_TypeError,
1070 "complex() can't take second arg"
1071 " if first is a string");
1072 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +00001073 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001074 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +00001075 }
1076 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
1077 PyErr_SetString(PyExc_TypeError,
1078 "complex() second arg can't be a string");
1079 return NULL;
1080 }
Tim Peters2400fa42001-09-12 19:12:49 +00001081
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001082 /* XXX Hack to support classes with __complex__ method */
1083 if (complexstr == NULL) {
1084 complexstr = PyString_InternFromString("__complex__");
1085 if (complexstr == NULL)
1086 return NULL;
1087 }
1088 f = PyObject_GetAttr(r, complexstr);
1089 if (f == NULL)
1090 PyErr_Clear();
1091 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001092 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001093 if (args == NULL)
1094 return NULL;
1095 r = PyEval_CallObject(f, args);
1096 Py_DECREF(args);
1097 Py_DECREF(f);
1098 if (r == NULL)
1099 return NULL;
1100 own_r = 1;
1101 }
Tim Peters2400fa42001-09-12 19:12:49 +00001102 nbr = r->ob_type->tp_as_number;
1103 if (i != NULL)
1104 nbi = i->ob_type->tp_as_number;
1105 if (nbr == NULL || nbr->nb_float == NULL ||
1106 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001107 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001108 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +00001109 if (own_r) {
1110 Py_DECREF(r);
1111 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001112 return NULL;
1113 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001114
1115 /* If we get this far, then the "real" and "imag" parts should
1116 both be treated as numbers, and the constructor should return a
1117 complex number equal to (real + imag*1j).
1118
1119 Note that we do NOT assume the input to already be in canonical
1120 form; the "real" and "imag" parts might themselves be complex
1121 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001122 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +00001123 /* Note that if r is of a complex subtype, we're only
1124 retaining its real & imag parts here, and the return
1125 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001126 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001127 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001128 if (own_r) {
1129 Py_DECREF(r);
1130 }
1131 }
1132 else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001133 /* The "real" part really is entirely real, and contributes
1134 nothing in the imaginary direction.
1135 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001136 tmp = PyNumber_Float(r);
1137 if (own_r) {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001138 /* r was a newly created complex number, rather
1139 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001140 Py_DECREF(r);
1141 }
1142 if (tmp == NULL)
1143 return NULL;
1144 if (!PyFloat_Check(tmp)) {
1145 PyErr_SetString(PyExc_TypeError,
1146 "float(r) didn't return a float");
1147 Py_DECREF(tmp);
1148 return NULL;
1149 }
1150 cr.real = PyFloat_AsDouble(tmp);
Georg Brandl96f21842008-01-19 10:18:07 +00001151 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001152 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001153 }
1154 if (i == NULL) {
1155 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001156 }
Guido van Rossum715ec182007-11-27 22:38:36 +00001157 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001158 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001159 ci_is_complex = 1;
1160 } else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001161 /* The "imag" part really is entirely imaginary, and
1162 contributes nothing in the real direction.
1163 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001164 tmp = (*nbi->nb_float)(i);
1165 if (tmp == NULL)
1166 return NULL;
1167 ci.real = PyFloat_AsDouble(tmp);
1168 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001169 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001170 /* If the input was in canonical form, then the "real" and "imag"
Guido van Rossum715ec182007-11-27 22:38:36 +00001171 parts are real numbers, so that ci.imag and cr.imag are zero.
Georg Brandl8f032cb2007-03-13 07:57:51 +00001172 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001173
1174 if (ci_is_complex) {
1175 cr.real -= ci.imag;
1176 }
1177 if (cr_is_complex) {
1178 ci.real += cr.imag;
1179 }
1180 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181}
1182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001183PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001184"complex(real[, imag]) -> complex number\n"
1185"\n"
1186"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001187"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001188
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001189static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001190 (binaryfunc)complex_add, /* nb_add */
1191 (binaryfunc)complex_sub, /* nb_subtract */
1192 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +00001193 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001194 (binaryfunc)complex_remainder, /* nb_remainder */
1195 (binaryfunc)complex_divmod, /* nb_divmod */
1196 (ternaryfunc)complex_pow, /* nb_power */
1197 (unaryfunc)complex_neg, /* nb_negative */
1198 (unaryfunc)complex_pos, /* nb_positive */
1199 (unaryfunc)complex_abs, /* nb_absolute */
1200 (inquiry)complex_nonzero, /* nb_nonzero */
1201 0, /* nb_invert */
1202 0, /* nb_lshift */
1203 0, /* nb_rshift */
1204 0, /* nb_and */
1205 0, /* nb_xor */
1206 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +00001207 complex_coerce, /* nb_coerce */
1208 complex_int, /* nb_int */
1209 complex_long, /* nb_long */
1210 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001211 0, /* nb_oct */
1212 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001213 0, /* nb_inplace_add */
1214 0, /* nb_inplace_subtract */
1215 0, /* nb_inplace_multiply*/
1216 0, /* nb_inplace_divide */
1217 0, /* nb_inplace_remainder */
1218 0, /* nb_inplace_power */
1219 0, /* nb_inplace_lshift */
1220 0, /* nb_inplace_rshift */
1221 0, /* nb_inplace_and */
1222 0, /* nb_inplace_xor */
1223 0, /* nb_inplace_or */
1224 (binaryfunc)complex_int_div, /* nb_floor_divide */
1225 (binaryfunc)complex_div, /* nb_true_divide */
1226 0, /* nb_inplace_floor_divide */
1227 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001228};
1229
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001230PyTypeObject PyComplex_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001231 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001232 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001233 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001234 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001235 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001236 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001237 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001238 0, /* tp_setattr */
1239 0, /* tp_compare */
1240 (reprfunc)complex_repr, /* tp_repr */
1241 &complex_as_number, /* tp_as_number */
1242 0, /* tp_as_sequence */
1243 0, /* tp_as_mapping */
1244 (hashfunc)complex_hash, /* tp_hash */
1245 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001246 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001247 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001248 0, /* tp_setattro */
1249 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001250 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1251 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001252 0, /* tp_traverse */
1253 0, /* tp_clear */
1254 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001255 0, /* tp_weaklistoffset */
1256 0, /* tp_iter */
1257 0, /* tp_iternext */
1258 complex_methods, /* tp_methods */
1259 complex_members, /* tp_members */
1260 0, /* tp_getset */
1261 0, /* tp_base */
1262 0, /* tp_dict */
1263 0, /* tp_descr_get */
1264 0, /* tp_descr_set */
1265 0, /* tp_dictoffset */
1266 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001267 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001269 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001270};
1271
1272#endif