blob: 4777ed148192df19353dbed56b7203632c556a1b [file] [log] [blame]
Guido van Rossum96783941997-05-20 18:21:34 +00001
Guido van Rossumf9fca921996-01-12 00:47:05 +00002/* Complex object implementation */
3
4/* Borrows heavily from floatobject.c */
5
Guido van Rossum96783941997-05-20 18:21:34 +00006/* Submitted by Jim Hugunin */
7
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00009#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000010
Guido van Rossum65ce6de2002-06-13 17:07:07 +000011#ifndef WITHOUT_COMPLEX
12
Tim Peters70695122001-03-11 08:37:29 +000013/* Precisions used by repr() and str(), respectively.
14
15 The repr() precision (17 significant decimal digits) is the minimal number
16 that is guaranteed to have enough precision so that if the number is read
17 back in the exact same binary value is recreated. This is true for IEEE
18 floating point by design, and also happens to work for all other modern
19 hardware.
20
21 The str() precision is chosen so that in most cases, the rounding noise
22 created by various operations is suppressed, while giving plenty of
23 precision for practical use.
24*/
25
26#define PREC_REPR 17
27#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000028
29/* elementary operations on complex numbers */
30
Guido van Rossum9e720e31996-07-21 02:31:35 +000031static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
Tim Peters0f336042001-03-18 08:21:57 +000033Py_complex
34c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000035{
Guido van Rossum9e720e31996-07-21 02:31:35 +000036 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000037 r.real = a.real + b.real;
38 r.imag = a.imag + b.imag;
39 return r;
40}
41
Tim Peters0f336042001-03-18 08:21:57 +000042Py_complex
43c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000044{
Guido van Rossum9e720e31996-07-21 02:31:35 +000045 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000046 r.real = a.real - b.real;
47 r.imag = a.imag - b.imag;
48 return r;
49}
50
Tim Peters0f336042001-03-18 08:21:57 +000051Py_complex
52c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000053{
Guido van Rossum9e720e31996-07-21 02:31:35 +000054 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000055 r.real = -a.real;
56 r.imag = -a.imag;
57 return r;
58}
59
Tim Peters0f336042001-03-18 08:21:57 +000060Py_complex
61c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000062{
Guido van Rossum9e720e31996-07-21 02:31:35 +000063 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000064 r.real = a.real*b.real - a.imag*b.imag;
65 r.imag = a.real*b.imag + a.imag*b.real;
66 return r;
67}
68
Tim Peters0f336042001-03-18 08:21:57 +000069Py_complex
70c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000071{
Tim Peters0f336042001-03-18 08:21:57 +000072 /******************************************************************
73 This was the original algorithm. It's grossly prone to spurious
74 overflow and underflow errors. It also merrily divides by 0 despite
75 checking for that(!). The code still serves a doc purpose here, as
76 the algorithm following is a simple by-cases transformation of this
77 one:
78
Guido van Rossum9e720e31996-07-21 02:31:35 +000079 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000080 double d = b.real*b.real + b.imag*b.imag;
81 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000082 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000083 r.real = (a.real*b.real + a.imag*b.imag)/d;
84 r.imag = (a.imag*b.real - a.real*b.imag)/d;
85 return r;
Tim Peters0f336042001-03-18 08:21:57 +000086 ******************************************************************/
87
88 /* This algorithm is better, and is pretty obvious: first divide the
89 * numerators and denominator by whichever of {b.real, b.imag} has
90 * larger magnitude. The earliest reference I found was to CACM
91 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
92 * University). As usual, though, we're still ignoring all IEEE
93 * endcases.
94 */
95 Py_complex r; /* the result */
96 const double abs_breal = b.real < 0 ? -b.real : b.real;
97 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
98
99 if (abs_breal >= abs_bimag) {
100 /* divide tops and bottom by b.real */
101 if (abs_breal == 0.0) {
102 errno = EDOM;
103 r.real = r.imag = 0.0;
104 }
105 else {
106 const double ratio = b.imag / b.real;
107 const double denom = b.real + b.imag * ratio;
108 r.real = (a.real + a.imag * ratio) / denom;
109 r.imag = (a.imag - a.real * ratio) / denom;
110 }
111 }
112 else {
113 /* divide tops and bottom by b.imag */
114 const double ratio = b.real / b.imag;
115 const double denom = b.real * ratio + b.imag;
116 assert(b.imag != 0.0);
117 r.real = (a.real * ratio + a.imag) / denom;
118 r.imag = (a.imag * ratio - a.real) / denom;
119 }
120 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000121}
122
Tim Peters0f336042001-03-18 08:21:57 +0000123Py_complex
124c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000126 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000127 double vabs,len,at,phase;
128 if (b.real == 0. && b.imag == 0.) {
129 r.real = 1.;
130 r.imag = 0.;
131 }
132 else if (a.real == 0. && a.imag == 0.) {
133 if (b.imag != 0. || b.real < 0.)
Tim Petersbab22be2002-03-22 02:48:46 +0000134 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000135 r.real = 0.;
136 r.imag = 0.;
137 }
138 else {
139 vabs = hypot(a.real,a.imag);
140 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000141 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000142 phase = at*b.real;
143 if (b.imag != 0.0) {
144 len /= exp(at*b.imag);
145 phase += b.imag*log(vabs);
146 }
147 r.real = len*cos(phase);
148 r.imag = len*sin(phase);
149 }
150 return r;
151}
152
Tim Peters0f336042001-03-18 08:21:57 +0000153static Py_complex
154c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155{
Guido van Rossum926518b1996-08-19 19:30:45 +0000156 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000157 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000158 r = c_1;
159 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000160 while (mask > 0 && n >= mask) {
161 if (n & mask)
162 r = c_prod(r,p);
163 mask <<= 1;
164 p = c_prod(p,p);
165 }
166 return r;
167}
168
Tim Peters0f336042001-03-18 08:21:57 +0000169static Py_complex
170c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000171{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000172 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000173
174 if (n > 100 || n < -100) {
175 cn.real = (double) n;
176 cn.imag = 0.;
177 return c_pow(x,cn);
178 }
179 else if (n > 0)
180 return c_powu(x,n);
181 else
182 return c_quot(c_1,c_powu(x,-n));
183
184}
185
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186static PyObject *
187complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
188{
189 PyObject *op;
190
Georg Brandl6b50c632006-06-01 08:27:32 +0000191 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000192 if (op != NULL)
193 ((PyComplexObject *)op)->cval = cval;
194 return op;
195}
196
Guido van Rossumf9fca921996-01-12 00:47:05 +0000197PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000198PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000199{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000200 register PyComplexObject *op;
201
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000202 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000203 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000204 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000206 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000207 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000209}
210
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211static PyObject *
212complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
213{
214 Py_complex c;
215 c.real = real;
216 c.imag = imag;
217 return complex_subtype_from_c_complex(type, c);
218}
219
Guido van Rossumf9fca921996-01-12 00:47:05 +0000220PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000221PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000222{
223 Py_complex c;
224 c.real = real;
225 c.imag = imag;
226 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000227}
228
229double
Fred Drake4288c802000-07-09 04:36:04 +0000230PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000231{
232 if (PyComplex_Check(op)) {
233 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000234 }
235 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000236 return PyFloat_AsDouble(op);
237 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000238}
239
240double
Fred Drake4288c802000-07-09 04:36:04 +0000241PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000242{
243 if (PyComplex_Check(op)) {
244 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000245 }
246 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000247 return 0.0;
248 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000249}
250
Guido van Rossum9e720e31996-07-21 02:31:35 +0000251Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000252PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000253{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000254 Py_complex cv;
Georg Brandl2b869942007-03-17 16:08:45 +0000255 PyObject *newop = NULL;
256 static PyObject *complex_str = NULL;
257
258 assert(op);
259 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000260 if (PyComplex_Check(op)) {
261 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000262 }
Georg Brandl2b869942007-03-17 16:08:45 +0000263 /* If not, use op's __complex__ method, if it exists */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000264
Georg Brandl2b869942007-03-17 16:08:45 +0000265 /* return -1 on failure */
266 cv.real = -1.;
267 cv.imag = 0.;
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000268
269 if (complex_str == NULL) {
270 if (!(complex_str = PyString_InternFromString("__complex__")))
271 return cv;
272 }
Georg Brandl2b869942007-03-17 16:08:45 +0000273
274 if (PyInstance_Check(op)) {
275 /* this can go away in python 3000 */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000276 if (PyObject_HasAttr(op, complex_str)) {
Georg Brandl2b869942007-03-17 16:08:45 +0000277 newop = PyObject_CallMethod(op, "__complex__", NULL);
278 if (!newop)
279 return cv;
280 }
281 /* else try __float__ */
282 } else {
283 PyObject *complexfunc;
Georg Brandl2b869942007-03-17 16:08:45 +0000284 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
285 /* complexfunc is a borrowed reference */
286 if (complexfunc) {
287 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
288 if (!newop)
289 return cv;
290 }
291 }
292
293 if (newop) {
294 if (!PyComplex_Check(newop)) {
295 PyErr_SetString(PyExc_TypeError,
296 "__complex__ should return a complex object");
297 Py_DECREF(newop);
298 return cv;
299 }
300 cv = ((PyComplexObject *)newop)->cval;
301 Py_DECREF(newop);
302 return cv;
303 }
304 /* If neither of the above works, interpret op as a float giving the
305 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000306 else {
Georg Brandl2b869942007-03-17 16:08:45 +0000307 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000308 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000309 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000310 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000311}
312
Guido van Rossumf9fca921996-01-12 00:47:05 +0000313static void
Fred Drake4288c802000-07-09 04:36:04 +0000314complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000315{
Guido van Rossum9475a232001-10-05 20:51:39 +0000316 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000317}
318
319
Guido van Rossum363078a1996-05-24 20:45:01 +0000320static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000321complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000322{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000323 char format[32];
324 if (v->cval.real == 0.) {
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000325 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
326 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
327 strncat(buf, "j", 1);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000328 } else {
329 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000330 /* Format imaginary part with sign, real part without */
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000331 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
332 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
333 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
334 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
Georg Brandlc404ff22005-09-16 06:42:26 +0000335 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000336 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000337}
338
339static int
Fred Drake4288c802000-07-09 04:36:04 +0000340complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000341{
342 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000343 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000344 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Brett Cannon01531592007-09-17 03:28:34 +0000345 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000346 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000347 Py_END_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000348 return 0;
349}
350
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000352complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000353{
354 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000355 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000356 return PyString_FromString(buf);
357}
358
359static PyObject *
360complex_str(PyComplexObject *v)
361{
362 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000363 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000365}
366
Guido van Rossumf9fca921996-01-12 00:47:05 +0000367static long
Fred Drake4288c802000-07-09 04:36:04 +0000368complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000369{
Tim Peters39dce292000-08-15 03:34:48 +0000370 long hashreal, hashimag, combined;
371 hashreal = _Py_HashDouble(v->cval.real);
372 if (hashreal == -1)
373 return -1;
374 hashimag = _Py_HashDouble(v->cval.imag);
375 if (hashimag == -1)
376 return -1;
377 /* Note: if the imaginary part is 0, hashimag is 0 now,
378 * so the following returns hashreal unchanged. This is
379 * important because numbers of different types that
380 * compare equal must have the same hash value, so that
381 * hash(x + 0*j) must equal hash(x).
382 */
383 combined = hashreal + 1000003 * hashimag;
384 if (combined == -1)
385 combined = -2;
386 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000387}
388
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000389/* This macro may return! */
390#define TO_COMPLEX(obj, c) \
391 if (PyComplex_Check(obj)) \
392 c = ((PyComplexObject *)(obj))->cval; \
393 else if (to_complex(&(obj), &(c)) < 0) \
394 return (obj)
395
396static int
397to_complex(PyObject **pobj, Py_complex *pc)
398{
399 PyObject *obj = *pobj;
400
401 pc->real = pc->imag = 0.0;
402 if (PyInt_Check(obj)) {
403 pc->real = PyInt_AS_LONG(obj);
404 return 0;
405 }
406 if (PyLong_Check(obj)) {
407 pc->real = PyLong_AsDouble(obj);
408 if (pc->real == -1.0 && PyErr_Occurred()) {
409 *pobj = NULL;
410 return -1;
411 }
412 return 0;
413 }
414 if (PyFloat_Check(obj)) {
415 pc->real = PyFloat_AsDouble(obj);
416 return 0;
417 }
418 Py_INCREF(Py_NotImplemented);
419 *pobj = Py_NotImplemented;
420 return -1;
421}
422
423
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000425complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000426{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000427 Py_complex result;
428 PyFPE_START_PROTECT("complex_add", return 0)
429 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000430 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000432}
433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000435complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000436{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000437 Py_complex result;
438 PyFPE_START_PROTECT("complex_sub", return 0)
439 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000440 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000442}
443
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000445complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000446{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000447 Py_complex result;
448 PyFPE_START_PROTECT("complex_mul", return 0)
449 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000450 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000452}
453
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000455complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000456{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000457 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000458 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000459 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000460 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000461 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000462 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000464 return NULL;
465 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000467}
468
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000470complex_classic_div(PyComplexObject *v, PyComplexObject *w)
471{
472 Py_complex quot;
473
Guido van Rossum1832de42001-09-04 03:51:09 +0000474 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000475 PyErr_Warn(PyExc_DeprecationWarning,
476 "classic complex division") < 0)
477 return NULL;
478
479 PyFPE_START_PROTECT("complex_classic_div", return 0)
480 errno = 0;
481 quot = c_quot(v->cval,w->cval);
482 PyFPE_END_PROTECT(quot)
483 if (errno == EDOM) {
484 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
485 return NULL;
486 }
487 return PyComplex_FromCComplex(quot);
488}
489
490static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000491complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000492{
Georg Brandl96f21842008-01-19 10:18:07 +0000493 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000494
495 if (PyErr_Warn(PyExc_DeprecationWarning,
496 "complex divmod(), // and % are deprecated") < 0)
497 return NULL;
498
Guido van Rossum96783941997-05-20 18:21:34 +0000499 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000500 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000501 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000503 return NULL;
504 }
505 div.real = floor(div.real); /* Use the floor of the real part. */
506 div.imag = 0.0;
507 mod = c_diff(v->cval, c_prod(w->cval, div));
508
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000509 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000510}
511
Guido van Rossumee09fc11996-09-11 13:55:55 +0000512
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000514complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000515{
Georg Brandl96f21842008-01-19 10:18:07 +0000516 Py_complex div, mod;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000517 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000518
519 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000520 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000521 return NULL;
522
Guido van Rossum96783941997-05-20 18:21:34 +0000523 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000524 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000525 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000527 return NULL;
528 }
529 div.real = floor(div.real); /* Use the floor of the real part. */
530 div.imag = 0.0;
531 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 d = PyComplex_FromCComplex(div);
533 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000534 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000535 Py_XDECREF(d);
536 Py_XDECREF(m);
537 return z;
538}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540static PyObject *
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000541complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000542{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000543 Py_complex p;
544 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000545 long int_exponent;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000546 Py_complex a, b;
Georg Brandl96f21842008-01-19 10:18:07 +0000547 TO_COMPLEX(v, a);
548 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000549
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000550 if (z!=Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000552 return NULL;
553 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000554 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000555 errno = 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000556 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000557 int_exponent = (long)exponent.real;
558 if (exponent.imag == 0. && exponent.real == int_exponent)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000559 p = c_powi(a,int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000560 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000561 p = c_pow(a,exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000562
Guido van Rossum45b83911997-03-14 04:32:50 +0000563 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000564 Py_ADJUST_ERANGE2(p.real, p.imag);
565 if (errno == EDOM) {
566 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000568 return NULL;
569 }
Tim Petersbab22be2002-03-22 02:48:46 +0000570 else if (errno == ERANGE) {
571 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000572 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000573 return NULL;
574 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000576}
577
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000578static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000579complex_int_div(PyComplexObject *v, PyComplexObject *w)
580{
581 PyObject *t, *r;
582
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000583 if (PyErr_Warn(PyExc_DeprecationWarning,
584 "complex divmod(), // and % are deprecated") < 0)
585 return NULL;
586
Guido van Rossum4668b002001-08-08 05:00:18 +0000587 t = complex_divmod(v, w);
588 if (t != NULL) {
589 r = PyTuple_GET_ITEM(t, 0);
590 Py_INCREF(r);
591 Py_DECREF(t);
592 return r;
593 }
594 return NULL;
595}
596
597static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000598complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000599{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000600 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000601 neg.real = -v->cval.real;
602 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000604}
605
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000607complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000608{
Tim Peters2400fa42001-09-12 19:12:49 +0000609 if (PyComplex_CheckExact(v)) {
610 Py_INCREF(v);
611 return (PyObject *)v;
612 }
613 else
614 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000615}
616
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000618complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000619{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000620 double result;
621 PyFPE_START_PROTECT("complex_abs", return 0)
622 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000623 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000625}
626
627static int
Fred Drake4288c802000-07-09 04:36:04 +0000628complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000629{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000630 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000631}
632
633static int
Fred Drake4288c802000-07-09 04:36:04 +0000634complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000635{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000636 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 if (PyInt_Check(*pw)) {
639 cval.real = (double)PyInt_AsLong(*pw);
640 *pw = PyComplex_FromCComplex(cval);
641 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000642 return 0;
643 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 else if (PyLong_Check(*pw)) {
645 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000646 if (cval.real == -1.0 && PyErr_Occurred())
647 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648 *pw = PyComplex_FromCComplex(cval);
649 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000650 return 0;
651 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652 else if (PyFloat_Check(*pw)) {
653 cval.real = PyFloat_AsDouble(*pw);
654 *pw = PyComplex_FromCComplex(cval);
655 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000656 return 0;
657 }
Guido van Rossum63805962001-09-19 01:13:10 +0000658 else if (PyComplex_Check(*pw)) {
659 Py_INCREF(*pv);
660 Py_INCREF(*pw);
661 return 0;
662 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000663 return 1; /* Can't do it */
664}
665
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000667complex_richcompare(PyObject *v, PyObject *w, int op)
668{
669 int c;
670 Py_complex i, j;
671 PyObject *res;
672
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000673 c = PyNumber_CoerceEx(&v, &w);
674 if (c < 0)
675 return NULL;
676 if (c > 0) {
677 Py_INCREF(Py_NotImplemented);
678 return Py_NotImplemented;
679 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000680 /* Make sure both arguments are complex. */
681 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000682 Py_DECREF(v);
683 Py_DECREF(w);
684 Py_INCREF(Py_NotImplemented);
685 return Py_NotImplemented;
686 }
687
688 i = ((PyComplexObject *)v)->cval;
689 j = ((PyComplexObject *)w)->cval;
690 Py_DECREF(v);
691 Py_DECREF(w);
692
Guido van Rossum22056422001-09-24 17:52:04 +0000693 if (op != Py_EQ && op != Py_NE) {
694 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000695 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000696 return NULL;
697 }
698
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000699 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
700 res = Py_True;
701 else
702 res = Py_False;
703
704 Py_INCREF(res);
705 return res;
706}
707
708static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000709complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000710{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000712 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000713 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000714}
715
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000716static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000717complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000718{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000720 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000721 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000722}
723
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000725complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000726{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000728 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000729 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000730}
731
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000733complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000734{
Guido van Rossum926518b1996-08-19 19:30:45 +0000735 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000736 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000737 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000738 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000739}
740
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000741PyDoc_STRVAR(complex_conjugate_doc,
742"complex.conjugate() -> complex\n"
743"\n"
744"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
745
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000746static PyObject *
747complex_getnewargs(PyComplexObject *v)
748{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000749 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000750}
751
Guido van Rossumf9fca921996-01-12 00:47:05 +0000752static PyMethodDef complex_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000753 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
754 complex_conjugate_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000755 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000756 {NULL, NULL} /* sentinel */
757};
758
Guido van Rossum6f799372001-09-20 20:46:19 +0000759static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000760 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000761 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000762 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000763 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000764 {0},
765};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000766
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000767static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000768complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000769{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000770 const char *s, *start;
771 char *end;
772 double x=0.0, y=0.0, z;
Collin Wintere38051d2007-03-09 20:33:07 +0000773 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000774 int digit_or_dot;
775 int sw_error=0;
776 int sign;
777 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000778#ifdef Py_USING_UNICODE
779 char s_buffer[256];
780#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000781 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782
783 if (PyString_Check(v)) {
784 s = PyString_AS_STRING(v);
785 len = PyString_GET_SIZE(v);
786 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000787#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000788 else if (PyUnicode_Check(v)) {
Skip Montanaro429433b2006-04-18 00:35:43 +0000789 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790 PyErr_SetString(PyExc_ValueError,
791 "complex() literal too large to convert");
792 return NULL;
793 }
794 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
795 PyUnicode_GET_SIZE(v),
796 s_buffer,
797 NULL))
798 return NULL;
799 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000800 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000802#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 else if (PyObject_AsCharBuffer(v, &s, &len)) {
804 PyErr_SetString(PyExc_TypeError,
805 "complex() arg is not a string");
806 return NULL;
807 }
808
809 /* position on first nonblank */
810 start = s;
811 while (*s && isspace(Py_CHARMASK(*s)))
812 s++;
Georg Brandl96f21842008-01-19 10:18:07 +0000813 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 PyErr_SetString(PyExc_ValueError,
815 "complex() arg is an empty string");
816 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +0000817 }
Collin Wintere38051d2007-03-09 20:33:07 +0000818 if (s[0] == '(') {
819 /* Skip over possible bracket from repr(). */
820 got_bracket = 1;
821 s++;
822 while (*s && isspace(Py_CHARMASK(*s)))
823 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824 }
825
826 z = -1.0;
827 sign = 1;
828 do {
829
830 switch (*s) {
831
832 case '\0':
833 if (s-start != len) {
834 PyErr_SetString(
835 PyExc_ValueError,
836 "complex() arg contains a null byte");
837 return NULL;
838 }
839 if(!done) sw_error=1;
840 break;
841
Collin Wintere38051d2007-03-09 20:33:07 +0000842 case ')':
843 if (!got_bracket || !(got_re || got_im)) {
844 sw_error=1;
845 break;
846 }
847 got_bracket=0;
848 done=1;
849 s++;
850 while (*s && isspace(Py_CHARMASK(*s)))
851 s++;
852 if (*s) sw_error=1;
853 break;
854
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 case '-':
856 sign = -1;
857 /* Fallthrough */
858 case '+':
859 if (done) sw_error=1;
860 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000861 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862 isspace(Py_CHARMASK(*s)) ) sw_error=1;
863 break;
864
865 case 'J':
866 case 'j':
867 if (got_im || done) {
868 sw_error = 1;
869 break;
870 }
871 if (z<0.0) {
872 y=sign;
873 }
874 else{
875 y=sign*z;
876 }
877 got_im=1;
878 s++;
879 if (*s!='+' && *s!='-' )
880 done=1;
881 break;
882
883 default:
884 if (isspace(Py_CHARMASK(*s))) {
885 while (*s && isspace(Py_CHARMASK(*s)))
886 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000887 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000888 sw_error=1;
889 else
890 done = 1;
891 break;
892 }
893 digit_or_dot =
894 (*s=='.' || isdigit(Py_CHARMASK(*s)));
895 if (done||!digit_or_dot) {
896 sw_error=1;
897 break;
898 }
899 errno = 0;
900 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000901 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000902 PyFPE_END_PROTECT(z)
903 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000904 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905 "float() out of range: %.150s", s);
906 PyErr_SetString(
907 PyExc_ValueError,
908 buffer);
909 return NULL;
910 }
911 s=end;
912 if (*s=='J' || *s=='j') {
913
914 break;
915 }
916 if (got_re) {
917 sw_error=1;
918 break;
919 }
920
921 /* accept a real part */
922 x=sign*z;
923 got_re=1;
924 if (got_im) done=1;
925 z = -1.0;
926 sign = 1;
927 break;
928
929 } /* end of switch */
930
Tim Peters077f2712002-04-14 22:04:03 +0000931 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000932
Collin Wintere38051d2007-03-09 20:33:07 +0000933 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000934 PyErr_SetString(PyExc_ValueError,
935 "complex() arg is a malformed string");
936 return NULL;
937 }
938
939 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000940}
941
Tim Peters6d6c1a32001-08-02 04:15:00 +0000942static PyObject *
943complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
944{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000945 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000946 PyNumberMethods *nbr, *nbi = NULL;
947 Py_complex cr, ci;
948 int own_r = 0;
Guido van Rossum715ec182007-11-27 22:38:36 +0000949 int cr_is_complex = 0;
950 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000951 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000952 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000953
954 r = Py_False;
955 i = NULL;
956 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
957 &r, &i))
958 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000959
Georg Brandl8f032cb2007-03-13 07:57:51 +0000960 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000961 if (PyComplex_CheckExact(r) && i == NULL &&
962 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000963 /* Note that we can't know whether it's safe to return
964 a complex *subclass* instance as-is, hence the restriction
Georg Brandl8f032cb2007-03-13 07:57:51 +0000965 to exact complexes here. If either the input or the
966 output is a complex subclass, it will be handled below
967 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000968 Py_INCREF(r);
969 return r;
970 }
Fred Drake526c7a02001-12-13 19:52:22 +0000971 if (PyString_Check(r) || PyUnicode_Check(r)) {
972 if (i != NULL) {
973 PyErr_SetString(PyExc_TypeError,
974 "complex() can't take second arg"
975 " if first is a string");
976 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +0000977 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000978 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000979 }
980 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
981 PyErr_SetString(PyExc_TypeError,
982 "complex() second arg can't be a string");
983 return NULL;
984 }
Tim Peters2400fa42001-09-12 19:12:49 +0000985
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000986 /* XXX Hack to support classes with __complex__ method */
987 if (complexstr == NULL) {
988 complexstr = PyString_InternFromString("__complex__");
989 if (complexstr == NULL)
990 return NULL;
991 }
992 f = PyObject_GetAttr(r, complexstr);
993 if (f == NULL)
994 PyErr_Clear();
995 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000996 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000997 if (args == NULL)
998 return NULL;
999 r = PyEval_CallObject(f, args);
1000 Py_DECREF(args);
1001 Py_DECREF(f);
1002 if (r == NULL)
1003 return NULL;
1004 own_r = 1;
1005 }
Tim Peters2400fa42001-09-12 19:12:49 +00001006 nbr = r->ob_type->tp_as_number;
1007 if (i != NULL)
1008 nbi = i->ob_type->tp_as_number;
1009 if (nbr == NULL || nbr->nb_float == NULL ||
1010 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001011 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001012 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +00001013 if (own_r) {
1014 Py_DECREF(r);
1015 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 return NULL;
1017 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001018
1019 /* If we get this far, then the "real" and "imag" parts should
1020 both be treated as numbers, and the constructor should return a
1021 complex number equal to (real + imag*1j).
1022
1023 Note that we do NOT assume the input to already be in canonical
1024 form; the "real" and "imag" parts might themselves be complex
1025 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +00001027 /* Note that if r is of a complex subtype, we're only
1028 retaining its real & imag parts here, and the return
1029 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001031 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001032 if (own_r) {
1033 Py_DECREF(r);
1034 }
1035 }
1036 else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001037 /* The "real" part really is entirely real, and contributes
1038 nothing in the imaginary direction.
1039 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001040 tmp = PyNumber_Float(r);
1041 if (own_r) {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001042 /* r was a newly created complex number, rather
1043 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001044 Py_DECREF(r);
1045 }
1046 if (tmp == NULL)
1047 return NULL;
1048 if (!PyFloat_Check(tmp)) {
1049 PyErr_SetString(PyExc_TypeError,
1050 "float(r) didn't return a float");
1051 Py_DECREF(tmp);
1052 return NULL;
1053 }
1054 cr.real = PyFloat_AsDouble(tmp);
Georg Brandl96f21842008-01-19 10:18:07 +00001055 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001057 }
1058 if (i == NULL) {
1059 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001060 }
Guido van Rossum715ec182007-11-27 22:38:36 +00001061 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001062 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001063 ci_is_complex = 1;
1064 } else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001065 /* The "imag" part really is entirely imaginary, and
1066 contributes nothing in the real direction.
1067 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001068 tmp = (*nbi->nb_float)(i);
1069 if (tmp == NULL)
1070 return NULL;
1071 ci.real = PyFloat_AsDouble(tmp);
1072 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001074 /* If the input was in canonical form, then the "real" and "imag"
Guido van Rossum715ec182007-11-27 22:38:36 +00001075 parts are real numbers, so that ci.imag and cr.imag are zero.
Georg Brandl8f032cb2007-03-13 07:57:51 +00001076 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001077
1078 if (ci_is_complex) {
1079 cr.real -= ci.imag;
1080 }
1081 if (cr_is_complex) {
1082 ci.real += cr.imag;
1083 }
1084 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001085}
1086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001087PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001088"complex(real[, imag]) -> complex number\n"
1089"\n"
1090"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001091"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001092
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001093static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001094 (binaryfunc)complex_add, /* nb_add */
1095 (binaryfunc)complex_sub, /* nb_subtract */
1096 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +00001097 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001098 (binaryfunc)complex_remainder, /* nb_remainder */
1099 (binaryfunc)complex_divmod, /* nb_divmod */
1100 (ternaryfunc)complex_pow, /* nb_power */
1101 (unaryfunc)complex_neg, /* nb_negative */
1102 (unaryfunc)complex_pos, /* nb_positive */
1103 (unaryfunc)complex_abs, /* nb_absolute */
1104 (inquiry)complex_nonzero, /* nb_nonzero */
1105 0, /* nb_invert */
1106 0, /* nb_lshift */
1107 0, /* nb_rshift */
1108 0, /* nb_and */
1109 0, /* nb_xor */
1110 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +00001111 complex_coerce, /* nb_coerce */
1112 complex_int, /* nb_int */
1113 complex_long, /* nb_long */
1114 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001115 0, /* nb_oct */
1116 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001117 0, /* nb_inplace_add */
1118 0, /* nb_inplace_subtract */
1119 0, /* nb_inplace_multiply*/
1120 0, /* nb_inplace_divide */
1121 0, /* nb_inplace_remainder */
1122 0, /* nb_inplace_power */
1123 0, /* nb_inplace_lshift */
1124 0, /* nb_inplace_rshift */
1125 0, /* nb_inplace_and */
1126 0, /* nb_inplace_xor */
1127 0, /* nb_inplace_or */
1128 (binaryfunc)complex_int_div, /* nb_floor_divide */
1129 (binaryfunc)complex_div, /* nb_true_divide */
1130 0, /* nb_inplace_floor_divide */
1131 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001132};
1133
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001134PyTypeObject PyComplex_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001135 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001136 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001137 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001138 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001139 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001140 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001141 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001142 0, /* tp_setattr */
1143 0, /* tp_compare */
1144 (reprfunc)complex_repr, /* tp_repr */
1145 &complex_as_number, /* tp_as_number */
1146 0, /* tp_as_sequence */
1147 0, /* tp_as_mapping */
1148 (hashfunc)complex_hash, /* tp_hash */
1149 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001150 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001151 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001152 0, /* tp_setattro */
1153 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001154 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1155 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001156 0, /* tp_traverse */
1157 0, /* tp_clear */
1158 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001159 0, /* tp_weaklistoffset */
1160 0, /* tp_iter */
1161 0, /* tp_iternext */
1162 complex_methods, /* tp_methods */
1163 complex_members, /* tp_members */
1164 0, /* tp_getset */
1165 0, /* tp_base */
1166 0, /* tp_dict */
1167 0, /* tp_descr_get */
1168 0, /* tp_descr_set */
1169 0, /* tp_dictoffset */
1170 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001171 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001172 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001173 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001174};
1175
1176#endif