blob: 03b80c880bcb242115e6305a8baca118fbe19170 [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 */
264
265 /* return -1 on failure */
266 cv.real = -1.;
267 cv.imag = 0.;
268
269 if (PyInstance_Check(op)) {
270 /* this can go away in python 3000 */
271 if (PyObject_HasAttrString(op, "__complex__")) {
272 newop = PyObject_CallMethod(op, "__complex__", NULL);
273 if (!newop)
274 return cv;
275 }
276 /* else try __float__ */
277 } else {
278 PyObject *complexfunc;
279 if (!complex_str) {
280 if (!(complex_str = PyString_FromString("__complex__")))
281 return cv;
282 }
283 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
284 /* complexfunc is a borrowed reference */
285 if (complexfunc) {
286 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
287 if (!newop)
288 return cv;
289 }
290 }
291
292 if (newop) {
293 if (!PyComplex_Check(newop)) {
294 PyErr_SetString(PyExc_TypeError,
295 "__complex__ should return a complex object");
296 Py_DECREF(newop);
297 return cv;
298 }
299 cv = ((PyComplexObject *)newop)->cval;
300 Py_DECREF(newop);
301 return cv;
302 }
303 /* If neither of the above works, interpret op as a float giving the
304 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000305 else {
Georg Brandl2b869942007-03-17 16:08:45 +0000306 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000307 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000308 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000309 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000310}
311
Guido van Rossumf9fca921996-01-12 00:47:05 +0000312static void
Fred Drake4288c802000-07-09 04:36:04 +0000313complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000314{
Guido van Rossum9475a232001-10-05 20:51:39 +0000315 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000316}
317
318
Guido van Rossum363078a1996-05-24 20:45:01 +0000319static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000320complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000321{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000322 char format[32];
323 if (v->cval.real == 0.) {
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000324 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
325 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
326 strncat(buf, "j", 1);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000327 } else {
328 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000329 /* Format imaginary part with sign, real part without */
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000330 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
331 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
332 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
333 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
Georg Brandlc404ff22005-09-16 06:42:26 +0000334 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000335 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000336}
337
338static int
Fred Drake4288c802000-07-09 04:36:04 +0000339complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000340{
341 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000342 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000343 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Brett Cannon01531592007-09-17 03:28:34 +0000344 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000345 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000346 Py_END_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000347 return 0;
348}
349
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000351complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000352{
353 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000354 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000355 return PyString_FromString(buf);
356}
357
358static PyObject *
359complex_str(PyComplexObject *v)
360{
361 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000362 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000364}
365
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366static long
Fred Drake4288c802000-07-09 04:36:04 +0000367complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000368{
Tim Peters39dce292000-08-15 03:34:48 +0000369 long hashreal, hashimag, combined;
370 hashreal = _Py_HashDouble(v->cval.real);
371 if (hashreal == -1)
372 return -1;
373 hashimag = _Py_HashDouble(v->cval.imag);
374 if (hashimag == -1)
375 return -1;
376 /* Note: if the imaginary part is 0, hashimag is 0 now,
377 * so the following returns hashreal unchanged. This is
378 * important because numbers of different types that
379 * compare equal must have the same hash value, so that
380 * hash(x + 0*j) must equal hash(x).
381 */
382 combined = hashreal + 1000003 * hashimag;
383 if (combined == -1)
384 combined = -2;
385 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000386}
387
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000388/* This macro may return! */
389#define TO_COMPLEX(obj, c) \
390 if (PyComplex_Check(obj)) \
391 c = ((PyComplexObject *)(obj))->cval; \
392 else if (to_complex(&(obj), &(c)) < 0) \
393 return (obj)
394
395static int
396to_complex(PyObject **pobj, Py_complex *pc)
397{
398 PyObject *obj = *pobj;
399
400 pc->real = pc->imag = 0.0;
401 if (PyInt_Check(obj)) {
402 pc->real = PyInt_AS_LONG(obj);
403 return 0;
404 }
405 if (PyLong_Check(obj)) {
406 pc->real = PyLong_AsDouble(obj);
407 if (pc->real == -1.0 && PyErr_Occurred()) {
408 *pobj = NULL;
409 return -1;
410 }
411 return 0;
412 }
413 if (PyFloat_Check(obj)) {
414 pc->real = PyFloat_AsDouble(obj);
415 return 0;
416 }
417 Py_INCREF(Py_NotImplemented);
418 *pobj = Py_NotImplemented;
419 return -1;
420}
421
422
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000424complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000425{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000426 Py_complex result;
427 PyFPE_START_PROTECT("complex_add", return 0)
428 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000429 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000431}
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000434complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000435{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000436 Py_complex result;
437 PyFPE_START_PROTECT("complex_sub", return 0)
438 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000439 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000441}
442
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000444complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000445{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000446 Py_complex result;
447 PyFPE_START_PROTECT("complex_mul", return 0)
448 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000449 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000451}
452
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000454complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000455{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000456 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000457 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000458 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000459 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000460 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000461 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000463 return NULL;
464 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000466}
467
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000469complex_classic_div(PyComplexObject *v, PyComplexObject *w)
470{
471 Py_complex quot;
472
Guido van Rossum1832de42001-09-04 03:51:09 +0000473 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000474 PyErr_Warn(PyExc_DeprecationWarning,
475 "classic complex division") < 0)
476 return NULL;
477
478 PyFPE_START_PROTECT("complex_classic_div", return 0)
479 errno = 0;
480 quot = c_quot(v->cval,w->cval);
481 PyFPE_END_PROTECT(quot)
482 if (errno == EDOM) {
483 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
484 return NULL;
485 }
486 return PyComplex_FromCComplex(quot);
487}
488
489static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000490complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000491{
Georg Brandl96f21842008-01-19 10:18:07 +0000492 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000493
494 if (PyErr_Warn(PyExc_DeprecationWarning,
495 "complex divmod(), // and % are deprecated") < 0)
496 return NULL;
497
Guido van Rossum96783941997-05-20 18:21:34 +0000498 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000499 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000500 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000502 return NULL;
503 }
504 div.real = floor(div.real); /* Use the floor of the real part. */
505 div.imag = 0.0;
506 mod = c_diff(v->cval, c_prod(w->cval, div));
507
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000509}
510
Guido van Rossumee09fc11996-09-11 13:55:55 +0000511
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000513complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000514{
Georg Brandl96f21842008-01-19 10:18:07 +0000515 Py_complex div, mod;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000516 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000517
518 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000519 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000520 return NULL;
521
Guido van Rossum96783941997-05-20 18:21:34 +0000522 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000523 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000524 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000526 return NULL;
527 }
528 div.real = floor(div.real); /* Use the floor of the real part. */
529 div.imag = 0.0;
530 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 d = PyComplex_FromCComplex(div);
532 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000533 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000534 Py_XDECREF(d);
535 Py_XDECREF(m);
536 return z;
537}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539static PyObject *
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000540complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000541{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000542 Py_complex p;
543 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000544 long int_exponent;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000545 Py_complex a, b;
Georg Brandl96f21842008-01-19 10:18:07 +0000546 TO_COMPLEX(v, a);
547 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000548
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000549 if (z!=Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000551 return NULL;
552 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000553 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000554 errno = 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000555 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000556 int_exponent = (long)exponent.real;
557 if (exponent.imag == 0. && exponent.real == int_exponent)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000558 p = c_powi(a,int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000559 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000560 p = c_pow(a,exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000561
Guido van Rossum45b83911997-03-14 04:32:50 +0000562 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000563 Py_ADJUST_ERANGE2(p.real, p.imag);
564 if (errno == EDOM) {
565 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000567 return NULL;
568 }
Tim Petersbab22be2002-03-22 02:48:46 +0000569 else if (errno == ERANGE) {
570 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000571 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000572 return NULL;
573 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000575}
576
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000578complex_int_div(PyComplexObject *v, PyComplexObject *w)
579{
580 PyObject *t, *r;
581
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000582 if (PyErr_Warn(PyExc_DeprecationWarning,
583 "complex divmod(), // and % are deprecated") < 0)
584 return NULL;
585
Guido van Rossum4668b002001-08-08 05:00:18 +0000586 t = complex_divmod(v, w);
587 if (t != NULL) {
588 r = PyTuple_GET_ITEM(t, 0);
589 Py_INCREF(r);
590 Py_DECREF(t);
591 return r;
592 }
593 return NULL;
594}
595
596static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000597complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000598{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000599 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000600 neg.real = -v->cval.real;
601 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000603}
604
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000606complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000607{
Tim Peters2400fa42001-09-12 19:12:49 +0000608 if (PyComplex_CheckExact(v)) {
609 Py_INCREF(v);
610 return (PyObject *)v;
611 }
612 else
613 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000614}
615
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000617complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000618{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000619 double result;
620 PyFPE_START_PROTECT("complex_abs", return 0)
621 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000622 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000624}
625
626static int
Fred Drake4288c802000-07-09 04:36:04 +0000627complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000628{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000629 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000630}
631
632static int
Fred Drake4288c802000-07-09 04:36:04 +0000633complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000634{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000635 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000636 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 if (PyInt_Check(*pw)) {
638 cval.real = (double)PyInt_AsLong(*pw);
639 *pw = PyComplex_FromCComplex(cval);
640 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000641 return 0;
642 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643 else if (PyLong_Check(*pw)) {
644 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000645 if (cval.real == -1.0 && PyErr_Occurred())
646 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 *pw = PyComplex_FromCComplex(cval);
648 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000649 return 0;
650 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 else if (PyFloat_Check(*pw)) {
652 cval.real = PyFloat_AsDouble(*pw);
653 *pw = PyComplex_FromCComplex(cval);
654 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000655 return 0;
656 }
Guido van Rossum63805962001-09-19 01:13:10 +0000657 else if (PyComplex_Check(*pw)) {
658 Py_INCREF(*pv);
659 Py_INCREF(*pw);
660 return 0;
661 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000662 return 1; /* Can't do it */
663}
664
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000666complex_richcompare(PyObject *v, PyObject *w, int op)
667{
668 int c;
669 Py_complex i, j;
670 PyObject *res;
671
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000672 c = PyNumber_CoerceEx(&v, &w);
673 if (c < 0)
674 return NULL;
675 if (c > 0) {
676 Py_INCREF(Py_NotImplemented);
677 return Py_NotImplemented;
678 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000679 /* Make sure both arguments are complex. */
680 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000681 Py_DECREF(v);
682 Py_DECREF(w);
683 Py_INCREF(Py_NotImplemented);
684 return Py_NotImplemented;
685 }
686
687 i = ((PyComplexObject *)v)->cval;
688 j = ((PyComplexObject *)w)->cval;
689 Py_DECREF(v);
690 Py_DECREF(w);
691
Guido van Rossum22056422001-09-24 17:52:04 +0000692 if (op != Py_EQ && op != Py_NE) {
693 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000694 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000695 return NULL;
696 }
697
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000698 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
699 res = Py_True;
700 else
701 res = Py_False;
702
703 Py_INCREF(res);
704 return res;
705}
706
707static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000708complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000709{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000711 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000712 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000713}
714
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000716complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000717{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000719 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000720 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000721}
722
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000724complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000725{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000726 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000727 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000728 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000729}
730
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000732complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000733{
Guido van Rossum926518b1996-08-19 19:30:45 +0000734 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000736 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000738}
739
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000740PyDoc_STRVAR(complex_conjugate_doc,
741"complex.conjugate() -> complex\n"
742"\n"
743"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
744
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000745static PyObject *
746complex_getnewargs(PyComplexObject *v)
747{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000748 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000749}
750
Guido van Rossumf9fca921996-01-12 00:47:05 +0000751static PyMethodDef complex_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000752 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
753 complex_conjugate_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000754 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000755 {NULL, NULL} /* sentinel */
756};
757
Guido van Rossum6f799372001-09-20 20:46:19 +0000758static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000759 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000760 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000761 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000762 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000763 {0},
764};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000765
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000766static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000767complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000768{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000769 const char *s, *start;
770 char *end;
771 double x=0.0, y=0.0, z;
Collin Wintere38051d2007-03-09 20:33:07 +0000772 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000773 int digit_or_dot;
774 int sw_error=0;
775 int sign;
776 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000777#ifdef Py_USING_UNICODE
778 char s_buffer[256];
779#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000780 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000781
782 if (PyString_Check(v)) {
783 s = PyString_AS_STRING(v);
784 len = PyString_GET_SIZE(v);
785 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000786#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000787 else if (PyUnicode_Check(v)) {
Skip Montanaro429433b2006-04-18 00:35:43 +0000788 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789 PyErr_SetString(PyExc_ValueError,
790 "complex() literal too large to convert");
791 return NULL;
792 }
793 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
794 PyUnicode_GET_SIZE(v),
795 s_buffer,
796 NULL))
797 return NULL;
798 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000799 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000800 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000801#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 else if (PyObject_AsCharBuffer(v, &s, &len)) {
803 PyErr_SetString(PyExc_TypeError,
804 "complex() arg is not a string");
805 return NULL;
806 }
807
808 /* position on first nonblank */
809 start = s;
810 while (*s && isspace(Py_CHARMASK(*s)))
811 s++;
Georg Brandl96f21842008-01-19 10:18:07 +0000812 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813 PyErr_SetString(PyExc_ValueError,
814 "complex() arg is an empty string");
815 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +0000816 }
Collin Wintere38051d2007-03-09 20:33:07 +0000817 if (s[0] == '(') {
818 /* Skip over possible bracket from repr(). */
819 got_bracket = 1;
820 s++;
821 while (*s && isspace(Py_CHARMASK(*s)))
822 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823 }
824
825 z = -1.0;
826 sign = 1;
827 do {
828
829 switch (*s) {
830
831 case '\0':
832 if (s-start != len) {
833 PyErr_SetString(
834 PyExc_ValueError,
835 "complex() arg contains a null byte");
836 return NULL;
837 }
838 if(!done) sw_error=1;
839 break;
840
Collin Wintere38051d2007-03-09 20:33:07 +0000841 case ')':
842 if (!got_bracket || !(got_re || got_im)) {
843 sw_error=1;
844 break;
845 }
846 got_bracket=0;
847 done=1;
848 s++;
849 while (*s && isspace(Py_CHARMASK(*s)))
850 s++;
851 if (*s) sw_error=1;
852 break;
853
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854 case '-':
855 sign = -1;
856 /* Fallthrough */
857 case '+':
858 if (done) sw_error=1;
859 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000860 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000861 isspace(Py_CHARMASK(*s)) ) sw_error=1;
862 break;
863
864 case 'J':
865 case 'j':
866 if (got_im || done) {
867 sw_error = 1;
868 break;
869 }
870 if (z<0.0) {
871 y=sign;
872 }
873 else{
874 y=sign*z;
875 }
876 got_im=1;
877 s++;
878 if (*s!='+' && *s!='-' )
879 done=1;
880 break;
881
882 default:
883 if (isspace(Py_CHARMASK(*s))) {
884 while (*s && isspace(Py_CHARMASK(*s)))
885 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000886 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 sw_error=1;
888 else
889 done = 1;
890 break;
891 }
892 digit_or_dot =
893 (*s=='.' || isdigit(Py_CHARMASK(*s)));
894 if (done||!digit_or_dot) {
895 sw_error=1;
896 break;
897 }
898 errno = 0;
899 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000900 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000901 PyFPE_END_PROTECT(z)
902 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000903 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000904 "float() out of range: %.150s", s);
905 PyErr_SetString(
906 PyExc_ValueError,
907 buffer);
908 return NULL;
909 }
910 s=end;
911 if (*s=='J' || *s=='j') {
912
913 break;
914 }
915 if (got_re) {
916 sw_error=1;
917 break;
918 }
919
920 /* accept a real part */
921 x=sign*z;
922 got_re=1;
923 if (got_im) done=1;
924 z = -1.0;
925 sign = 1;
926 break;
927
928 } /* end of switch */
929
Tim Peters077f2712002-04-14 22:04:03 +0000930 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931
Collin Wintere38051d2007-03-09 20:33:07 +0000932 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000933 PyErr_SetString(PyExc_ValueError,
934 "complex() arg is a malformed string");
935 return NULL;
936 }
937
938 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000939}
940
Tim Peters6d6c1a32001-08-02 04:15:00 +0000941static PyObject *
942complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
943{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000944 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000945 PyNumberMethods *nbr, *nbi = NULL;
946 Py_complex cr, ci;
947 int own_r = 0;
Guido van Rossum715ec182007-11-27 22:38:36 +0000948 int cr_is_complex = 0;
949 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000950 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000951 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000952
953 r = Py_False;
954 i = NULL;
955 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
956 &r, &i))
957 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000958
Georg Brandl8f032cb2007-03-13 07:57:51 +0000959 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000960 if (PyComplex_CheckExact(r) && i == NULL &&
961 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000962 /* Note that we can't know whether it's safe to return
963 a complex *subclass* instance as-is, hence the restriction
Georg Brandl8f032cb2007-03-13 07:57:51 +0000964 to exact complexes here. If either the input or the
965 output is a complex subclass, it will be handled below
966 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000967 Py_INCREF(r);
968 return r;
969 }
Fred Drake526c7a02001-12-13 19:52:22 +0000970 if (PyString_Check(r) || PyUnicode_Check(r)) {
971 if (i != NULL) {
972 PyErr_SetString(PyExc_TypeError,
973 "complex() can't take second arg"
974 " if first is a string");
975 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +0000976 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000977 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000978 }
979 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
980 PyErr_SetString(PyExc_TypeError,
981 "complex() second arg can't be a string");
982 return NULL;
983 }
Tim Peters2400fa42001-09-12 19:12:49 +0000984
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000985 /* XXX Hack to support classes with __complex__ method */
986 if (complexstr == NULL) {
987 complexstr = PyString_InternFromString("__complex__");
988 if (complexstr == NULL)
989 return NULL;
990 }
991 f = PyObject_GetAttr(r, complexstr);
992 if (f == NULL)
993 PyErr_Clear();
994 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000995 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000996 if (args == NULL)
997 return NULL;
998 r = PyEval_CallObject(f, args);
999 Py_DECREF(args);
1000 Py_DECREF(f);
1001 if (r == NULL)
1002 return NULL;
1003 own_r = 1;
1004 }
Tim Peters2400fa42001-09-12 19:12:49 +00001005 nbr = r->ob_type->tp_as_number;
1006 if (i != NULL)
1007 nbi = i->ob_type->tp_as_number;
1008 if (nbr == NULL || nbr->nb_float == NULL ||
1009 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001010 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001011 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +00001012 if (own_r) {
1013 Py_DECREF(r);
1014 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015 return NULL;
1016 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001017
1018 /* If we get this far, then the "real" and "imag" parts should
1019 both be treated as numbers, and the constructor should return a
1020 complex number equal to (real + imag*1j).
1021
1022 Note that we do NOT assume the input to already be in canonical
1023 form; the "real" and "imag" parts might themselves be complex
1024 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001025 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +00001026 /* Note that if r is of a complex subtype, we're only
1027 retaining its real & imag parts here, and the return
1028 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001030 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001031 if (own_r) {
1032 Py_DECREF(r);
1033 }
1034 }
1035 else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001036 /* The "real" part really is entirely real, and contributes
1037 nothing in the imaginary direction.
1038 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039 tmp = PyNumber_Float(r);
1040 if (own_r) {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001041 /* r was a newly created complex number, rather
1042 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001043 Py_DECREF(r);
1044 }
1045 if (tmp == NULL)
1046 return NULL;
1047 if (!PyFloat_Check(tmp)) {
1048 PyErr_SetString(PyExc_TypeError,
1049 "float(r) didn't return a float");
1050 Py_DECREF(tmp);
1051 return NULL;
1052 }
1053 cr.real = PyFloat_AsDouble(tmp);
Georg Brandl96f21842008-01-19 10:18:07 +00001054 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001055 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056 }
1057 if (i == NULL) {
1058 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001059 }
Guido van Rossum715ec182007-11-27 22:38:36 +00001060 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001061 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001062 ci_is_complex = 1;
1063 } else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001064 /* The "imag" part really is entirely imaginary, and
1065 contributes nothing in the real direction.
1066 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001067 tmp = (*nbi->nb_float)(i);
1068 if (tmp == NULL)
1069 return NULL;
1070 ci.real = PyFloat_AsDouble(tmp);
1071 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001072 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001073 /* If the input was in canonical form, then the "real" and "imag"
Guido van Rossum715ec182007-11-27 22:38:36 +00001074 parts are real numbers, so that ci.imag and cr.imag are zero.
Georg Brandl8f032cb2007-03-13 07:57:51 +00001075 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001076
1077 if (ci_is_complex) {
1078 cr.real -= ci.imag;
1079 }
1080 if (cr_is_complex) {
1081 ci.real += cr.imag;
1082 }
1083 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001084}
1085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001086PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001087"complex(real[, imag]) -> complex number\n"
1088"\n"
1089"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001090"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001091
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001092static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001093 (binaryfunc)complex_add, /* nb_add */
1094 (binaryfunc)complex_sub, /* nb_subtract */
1095 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +00001096 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001097 (binaryfunc)complex_remainder, /* nb_remainder */
1098 (binaryfunc)complex_divmod, /* nb_divmod */
1099 (ternaryfunc)complex_pow, /* nb_power */
1100 (unaryfunc)complex_neg, /* nb_negative */
1101 (unaryfunc)complex_pos, /* nb_positive */
1102 (unaryfunc)complex_abs, /* nb_absolute */
1103 (inquiry)complex_nonzero, /* nb_nonzero */
1104 0, /* nb_invert */
1105 0, /* nb_lshift */
1106 0, /* nb_rshift */
1107 0, /* nb_and */
1108 0, /* nb_xor */
1109 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +00001110 complex_coerce, /* nb_coerce */
1111 complex_int, /* nb_int */
1112 complex_long, /* nb_long */
1113 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001114 0, /* nb_oct */
1115 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001116 0, /* nb_inplace_add */
1117 0, /* nb_inplace_subtract */
1118 0, /* nb_inplace_multiply*/
1119 0, /* nb_inplace_divide */
1120 0, /* nb_inplace_remainder */
1121 0, /* nb_inplace_power */
1122 0, /* nb_inplace_lshift */
1123 0, /* nb_inplace_rshift */
1124 0, /* nb_inplace_and */
1125 0, /* nb_inplace_xor */
1126 0, /* nb_inplace_or */
1127 (binaryfunc)complex_int_div, /* nb_floor_divide */
1128 (binaryfunc)complex_div, /* nb_true_divide */
1129 0, /* nb_inplace_floor_divide */
1130 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001131};
1132
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001133PyTypeObject PyComplex_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001134 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001135 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001136 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001137 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001138 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001139 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001140 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001141 0, /* tp_setattr */
1142 0, /* tp_compare */
1143 (reprfunc)complex_repr, /* tp_repr */
1144 &complex_as_number, /* tp_as_number */
1145 0, /* tp_as_sequence */
1146 0, /* tp_as_mapping */
1147 (hashfunc)complex_hash, /* tp_hash */
1148 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001149 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001151 0, /* tp_setattro */
1152 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001153 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1154 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001155 0, /* tp_traverse */
1156 0, /* tp_clear */
1157 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001158 0, /* tp_weaklistoffset */
1159 0, /* tp_iter */
1160 0, /* tp_iternext */
1161 complex_methods, /* tp_methods */
1162 complex_members, /* tp_members */
1163 0, /* tp_getset */
1164 0, /* tp_base */
1165 0, /* tp_dict */
1166 0, /* tp_descr_get */
1167 0, /* tp_descr_set */
1168 0, /* tp_dictoffset */
1169 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001170 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001171 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001172 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001173};
1174
1175#endif