blob: 82dd7c1240f49b63c89b0b968eb35412d499f0e5 [file] [log] [blame]
Guido van Rossum96783941997-05-20 18:21:34 +00001
Guido van Rossumf9fca921996-01-12 00:47:05 +00002/* Complex object implementation */
3
4/* Borrows heavily from floatobject.c */
5
Guido van Rossum96783941997-05-20 18:21:34 +00006/* Submitted by Jim Hugunin */
7
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00009#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000010
Guido van Rossum65ce6de2002-06-13 17:07:07 +000011#ifndef WITHOUT_COMPLEX
12
Tim Peters70695122001-03-11 08:37:29 +000013/* Precisions used by repr() and str(), respectively.
14
15 The repr() precision (17 significant decimal digits) is the minimal number
16 that is guaranteed to have enough precision so that if the number is read
17 back in the exact same binary value is recreated. This is true for IEEE
18 floating point by design, and also happens to work for all other modern
19 hardware.
20
21 The str() precision is chosen so that in most cases, the rounding noise
22 created by various operations is suppressed, while giving plenty of
23 precision for practical use.
24*/
25
26#define PREC_REPR 17
27#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000028
29/* elementary operations on complex numbers */
30
Guido van Rossum9e720e31996-07-21 02:31:35 +000031static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
Tim Peters0f336042001-03-18 08:21:57 +000033Py_complex
34c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000035{
Guido van Rossum9e720e31996-07-21 02:31:35 +000036 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000037 r.real = a.real + b.real;
38 r.imag = a.imag + b.imag;
39 return r;
40}
41
Tim Peters0f336042001-03-18 08:21:57 +000042Py_complex
43c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000044{
Guido van Rossum9e720e31996-07-21 02:31:35 +000045 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000046 r.real = a.real - b.real;
47 r.imag = a.imag - b.imag;
48 return r;
49}
50
Tim Peters0f336042001-03-18 08:21:57 +000051Py_complex
52c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000053{
Guido van Rossum9e720e31996-07-21 02:31:35 +000054 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000055 r.real = -a.real;
56 r.imag = -a.imag;
57 return r;
58}
59
Tim Peters0f336042001-03-18 08:21:57 +000060Py_complex
61c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000062{
Guido van Rossum9e720e31996-07-21 02:31:35 +000063 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000064 r.real = a.real*b.real - a.imag*b.imag;
65 r.imag = a.real*b.imag + a.imag*b.real;
66 return r;
67}
68
Tim Peters0f336042001-03-18 08:21:57 +000069Py_complex
70c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000071{
Tim Peters0f336042001-03-18 08:21:57 +000072 /******************************************************************
73 This was the original algorithm. It's grossly prone to spurious
74 overflow and underflow errors. It also merrily divides by 0 despite
75 checking for that(!). The code still serves a doc purpose here, as
76 the algorithm following is a simple by-cases transformation of this
77 one:
78
Guido van Rossum9e720e31996-07-21 02:31:35 +000079 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000080 double d = b.real*b.real + b.imag*b.imag;
81 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000082 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000083 r.real = (a.real*b.real + a.imag*b.imag)/d;
84 r.imag = (a.imag*b.real - a.real*b.imag)/d;
85 return r;
Tim Peters0f336042001-03-18 08:21:57 +000086 ******************************************************************/
87
88 /* This algorithm is better, and is pretty obvious: first divide the
89 * numerators and denominator by whichever of {b.real, b.imag} has
90 * larger magnitude. The earliest reference I found was to CACM
91 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
92 * University). As usual, though, we're still ignoring all IEEE
93 * endcases.
94 */
95 Py_complex r; /* the result */
96 const double abs_breal = b.real < 0 ? -b.real : b.real;
97 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
98
99 if (abs_breal >= abs_bimag) {
100 /* divide tops and bottom by b.real */
101 if (abs_breal == 0.0) {
102 errno = EDOM;
103 r.real = r.imag = 0.0;
104 }
105 else {
106 const double ratio = b.imag / b.real;
107 const double denom = b.real + b.imag * ratio;
108 r.real = (a.real + a.imag * ratio) / denom;
109 r.imag = (a.imag - a.real * ratio) / denom;
110 }
111 }
112 else {
113 /* divide tops and bottom by b.imag */
114 const double ratio = b.real / b.imag;
115 const double denom = b.real * ratio + b.imag;
116 assert(b.imag != 0.0);
117 r.real = (a.real * ratio + a.imag) / denom;
118 r.imag = (a.imag * ratio - a.real) / denom;
119 }
120 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000121}
122
Tim Peters0f336042001-03-18 08:21:57 +0000123Py_complex
124c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000126 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000127 double vabs,len,at,phase;
128 if (b.real == 0. && b.imag == 0.) {
129 r.real = 1.;
130 r.imag = 0.;
131 }
132 else if (a.real == 0. && a.imag == 0.) {
133 if (b.imag != 0. || b.real < 0.)
Tim Petersbab22be2002-03-22 02:48:46 +0000134 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000135 r.real = 0.;
136 r.imag = 0.;
137 }
138 else {
139 vabs = hypot(a.real,a.imag);
140 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000141 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000142 phase = at*b.real;
143 if (b.imag != 0.0) {
144 len /= exp(at*b.imag);
145 phase += b.imag*log(vabs);
146 }
147 r.real = len*cos(phase);
148 r.imag = len*sin(phase);
149 }
150 return r;
151}
152
Tim Peters0f336042001-03-18 08:21:57 +0000153static Py_complex
154c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155{
Guido van Rossum926518b1996-08-19 19:30:45 +0000156 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000157 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000158 r = c_1;
159 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000160 while (mask > 0 && n >= mask) {
161 if (n & mask)
162 r = c_prod(r,p);
163 mask <<= 1;
164 p = c_prod(p,p);
165 }
166 return r;
167}
168
Tim Peters0f336042001-03-18 08:21:57 +0000169static Py_complex
170c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000171{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000172 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000173
174 if (n > 100 || n < -100) {
175 cn.real = (double) n;
176 cn.imag = 0.;
177 return c_pow(x,cn);
178 }
179 else if (n > 0)
180 return c_powu(x,n);
181 else
182 return c_quot(c_1,c_powu(x,-n));
183
184}
185
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186static PyObject *
187complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
188{
189 PyObject *op;
190
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000191 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000192 if (op != NULL)
193 ((PyComplexObject *)op)->cval = cval;
194 return op;
195}
196
Guido van Rossumf9fca921996-01-12 00:47:05 +0000197PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000198PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000199{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000200 register PyComplexObject *op;
201
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000202 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000203 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000204 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000206 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000207 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000209}
210
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211static PyObject *
212complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
213{
214 Py_complex c;
215 c.real = real;
216 c.imag = imag;
217 return complex_subtype_from_c_complex(type, c);
218}
219
Guido van Rossumf9fca921996-01-12 00:47:05 +0000220PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000221PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000222{
223 Py_complex c;
224 c.real = real;
225 c.imag = imag;
226 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000227}
228
229double
Fred Drake4288c802000-07-09 04:36:04 +0000230PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000231{
232 if (PyComplex_Check(op)) {
233 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000234 }
235 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000236 return PyFloat_AsDouble(op);
237 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000238}
239
240double
Fred Drake4288c802000-07-09 04:36:04 +0000241PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000242{
243 if (PyComplex_Check(op)) {
244 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000245 }
246 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000247 return 0.0;
248 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000249}
250
Guido van Rossum9e720e31996-07-21 02:31:35 +0000251Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000252PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000253{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000254 Py_complex cv;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000255 PyObject *newop = NULL;
256 static PyObject *complex_str = NULL;
257
258 assert(op);
259 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000260 if (PyComplex_Check(op)) {
261 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000262 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000263 /* If not, use op's __complex__ method, if it exists */
264
265 /* return -1 on failure */
266 cv.real = -1.;
267 cv.imag = 0.;
268
269 {
270 PyObject *complexfunc;
271 if (!complex_str) {
272 if (!(complex_str = PyString_FromString("__complex__")))
273 return cv;
274 }
275 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
276 /* complexfunc is a borrowed reference */
277 if (complexfunc) {
278 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
279 if (!newop)
280 return cv;
281 }
282 }
283
284 if (newop) {
285 if (!PyComplex_Check(newop)) {
286 PyErr_SetString(PyExc_TypeError,
287 "__complex__ should return a complex object");
288 Py_DECREF(newop);
289 return cv;
290 }
291 cv = ((PyComplexObject *)newop)->cval;
292 Py_DECREF(newop);
293 return cv;
294 }
295 /* If neither of the above works, interpret op as a float giving the
296 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000297 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000298 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000299 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000300 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000301 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000302}
303
Guido van Rossumf9fca921996-01-12 00:47:05 +0000304static void
Fred Drake4288c802000-07-09 04:36:04 +0000305complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000306{
Guido van Rossum9475a232001-10-05 20:51:39 +0000307 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000308}
309
310
Guido van Rossum363078a1996-05-24 20:45:01 +0000311static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000312complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000313{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000314 char format[32];
315 if (v->cval.real == 0.) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000316 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
317 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
318 strncat(buf, "j", 1);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000319 } else {
320 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000321 /* Format imaginary part with sign, real part without */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000322 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
323 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
324 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
325 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
Georg Brandlc404ff22005-09-16 06:42:26 +0000326 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000327 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000328}
329
330static int
Fred Drake4288c802000-07-09 04:36:04 +0000331complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000332{
333 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000334 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000335 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000336 fputs(buf, fp);
337 return 0;
338}
339
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000341complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000342{
343 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000344 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000345 return PyString_FromString(buf);
346}
347
348static PyObject *
349complex_str(PyComplexObject *v)
350{
351 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000352 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000354}
355
Guido van Rossumf9fca921996-01-12 00:47:05 +0000356static long
Fred Drake4288c802000-07-09 04:36:04 +0000357complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000358{
Tim Peters39dce292000-08-15 03:34:48 +0000359 long hashreal, hashimag, combined;
360 hashreal = _Py_HashDouble(v->cval.real);
361 if (hashreal == -1)
362 return -1;
363 hashimag = _Py_HashDouble(v->cval.imag);
364 if (hashimag == -1)
365 return -1;
366 /* Note: if the imaginary part is 0, hashimag is 0 now,
367 * so the following returns hashreal unchanged. This is
368 * important because numbers of different types that
369 * compare equal must have the same hash value, so that
370 * hash(x + 0*j) must equal hash(x).
371 */
372 combined = hashreal + 1000003 * hashimag;
373 if (combined == -1)
374 combined = -2;
375 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000376}
377
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000378/* This macro may return! */
379#define TO_COMPLEX(obj, c) \
380 if (PyComplex_Check(obj)) \
381 c = ((PyComplexObject *)(obj))->cval; \
382 else if (to_complex(&(obj), &(c)) < 0) \
383 return (obj)
384
385static int
386to_complex(PyObject **pobj, Py_complex *pc)
387{
388 PyObject *obj = *pobj;
389
390 pc->real = pc->imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000391 if (PyLong_Check(obj)) {
392 pc->real = PyLong_AsDouble(obj);
393 if (pc->real == -1.0 && PyErr_Occurred()) {
394 *pobj = NULL;
395 return -1;
396 }
397 return 0;
398 }
399 if (PyFloat_Check(obj)) {
400 pc->real = PyFloat_AsDouble(obj);
401 return 0;
402 }
403 Py_INCREF(Py_NotImplemented);
404 *pobj = Py_NotImplemented;
405 return -1;
406}
407
408
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000410complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000411{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000412 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000413 Py_complex a, b;
414 TO_COMPLEX(v, a);
415 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000416 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000417 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000418 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000420}
421
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000423complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000424{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000425 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000426 Py_complex a, b;
427 TO_COMPLEX(v, a);
428 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000429 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000430 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000431 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000433}
434
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000436complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000437{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000438 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000439 Py_complex a, b;
440 TO_COMPLEX(v, a);
441 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000442 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000443 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000444 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000446}
447
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000449complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000450{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000451 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000452 Py_complex a, b;
453 TO_COMPLEX(v, a);
454 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000455 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000456 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000457 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000458 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000459 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000461 return NULL;
462 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000464}
465
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000467complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000468{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000469 Py_complex div, mod;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000470 Py_complex a, b;
471 TO_COMPLEX(v, a);
472 TO_COMPLEX(w, b);
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000473
474 if (PyErr_Warn(PyExc_DeprecationWarning,
475 "complex divmod(), // and % are deprecated") < 0)
476 return NULL;
477
Guido van Rossum96783941997-05-20 18:21:34 +0000478 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000479 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000480 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000482 return NULL;
483 }
484 div.real = floor(div.real); /* Use the floor of the real part. */
485 div.imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000486 mod = c_diff(a, c_prod(b, div));
Guido van Rossum3be12e91996-09-12 20:56:18 +0000487
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000489}
490
Guido van Rossumee09fc11996-09-11 13:55:55 +0000491
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000493complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000494{
495 Py_complex div, mod;
496 PyObject *d, *m, *z;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000497 Py_complex a, b;
498 TO_COMPLEX(v, a);
499 TO_COMPLEX(w, b);
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000500
501 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000502 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000503 return NULL;
504
Guido van Rossum96783941997-05-20 18:21:34 +0000505 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000506 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000507 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000509 return NULL;
510 }
511 div.real = floor(div.real); /* Use the floor of the real part. */
512 div.imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000513 mod = c_diff(a, c_prod(b, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 d = PyComplex_FromCComplex(div);
515 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000516 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000517 Py_XDECREF(d);
518 Py_XDECREF(m);
519 return z;
520}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000521
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000523complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000524{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000525 Py_complex p;
526 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000527 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000528 Py_complex a, b;
529 TO_COMPLEX(v, a);
530 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000531
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000532 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000534 return NULL;
535 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000536 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000537 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000538 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539 int_exponent = (long)exponent.real;
540 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000541 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000542 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000543 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000544
Guido van Rossum45b83911997-03-14 04:32:50 +0000545 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000546 Py_ADJUST_ERANGE2(p.real, p.imag);
547 if (errno == EDOM) {
548 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000550 return NULL;
551 }
Tim Petersbab22be2002-03-22 02:48:46 +0000552 else if (errno == ERANGE) {
553 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000554 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000555 return NULL;
556 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000558}
559
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000561complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000562{
563 PyObject *t, *r;
564
565 t = complex_divmod(v, w);
566 if (t != NULL) {
567 r = PyTuple_GET_ITEM(t, 0);
568 Py_INCREF(r);
569 Py_DECREF(t);
570 return r;
571 }
572 return NULL;
573}
574
575static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000576complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000577{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000578 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000579 neg.real = -v->cval.real;
580 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000582}
583
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000584static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000585complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000586{
Tim Peters2400fa42001-09-12 19:12:49 +0000587 if (PyComplex_CheckExact(v)) {
588 Py_INCREF(v);
589 return (PyObject *)v;
590 }
591 else
592 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000593}
594
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000596complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000597{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000598 double result;
599 PyFPE_START_PROTECT("complex_abs", return 0)
600 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000601 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000603}
604
605static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000606complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000607{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000608 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000609}
610
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000612complex_richcompare(PyObject *v, PyObject *w, int op)
613{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000614 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000615 Py_complex i, j;
616 TO_COMPLEX(v, i);
617 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000618
Guido van Rossum22056422001-09-24 17:52:04 +0000619 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000620 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000621 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000622 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000623 return NULL;
624 }
625
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000626 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
627 res = Py_True;
628 else
629 res = Py_False;
630
631 Py_INCREF(res);
632 return res;
633}
634
635static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000636complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000639 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000640 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000641}
642
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000644complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000645{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000647 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000648 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000649}
650
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000652complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000653{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000655 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000656 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000657}
658
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000660complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661{
Guido van Rossum926518b1996-08-19 19:30:45 +0000662 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000664 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000666}
667
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000668static PyObject *
669complex_getnewargs(PyComplexObject *v)
670{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000671 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000672}
673
Guido van Rossumf9fca921996-01-12 00:47:05 +0000674static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000675 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000676 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000677 {NULL, NULL} /* sentinel */
678};
679
Guido van Rossum6f799372001-09-20 20:46:19 +0000680static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000681 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000682 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000683 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000684 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685 {0},
686};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000689complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000690{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000691 const char *s, *start;
692 char *end;
693 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000694 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000695 int digit_or_dot;
696 int sw_error=0;
697 int sign;
698 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000699#ifdef Py_USING_UNICODE
700 char s_buffer[256];
701#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000702 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000703
704 if (PyString_Check(v)) {
705 s = PyString_AS_STRING(v);
706 len = PyString_GET_SIZE(v);
707 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000708#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000709 else if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000710 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000711 PyErr_SetString(PyExc_ValueError,
712 "complex() literal too large to convert");
713 return NULL;
714 }
715 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
716 PyUnicode_GET_SIZE(v),
717 s_buffer,
718 NULL))
719 return NULL;
720 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000721 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000722 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000723#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000724 else if (PyObject_AsCharBuffer(v, &s, &len)) {
725 PyErr_SetString(PyExc_TypeError,
726 "complex() arg is not a string");
727 return NULL;
728 }
729
730 /* position on first nonblank */
731 start = s;
732 while (*s && isspace(Py_CHARMASK(*s)))
733 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000734 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000735 PyErr_SetString(PyExc_ValueError,
736 "complex() arg is an empty string");
737 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000738 }
739 if (s[0] == '(') {
740 /* Skip over possible bracket from repr(). */
741 got_bracket = 1;
742 s++;
743 while (*s && isspace(Py_CHARMASK(*s)))
744 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000745 }
746
747 z = -1.0;
748 sign = 1;
749 do {
750
751 switch (*s) {
752
753 case '\0':
754 if (s-start != len) {
755 PyErr_SetString(
756 PyExc_ValueError,
757 "complex() arg contains a null byte");
758 return NULL;
759 }
760 if(!done) sw_error=1;
761 break;
762
Guido van Rossumd8faa362007-04-27 19:54:29 +0000763 case ')':
764 if (!got_bracket || !(got_re || got_im)) {
765 sw_error=1;
766 break;
767 }
768 got_bracket=0;
769 done=1;
770 s++;
771 while (*s && isspace(Py_CHARMASK(*s)))
772 s++;
773 if (*s) sw_error=1;
774 break;
775
Tim Peters6d6c1a32001-08-02 04:15:00 +0000776 case '-':
777 sign = -1;
778 /* Fallthrough */
779 case '+':
780 if (done) sw_error=1;
781 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000782 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000783 isspace(Py_CHARMASK(*s)) ) sw_error=1;
784 break;
785
786 case 'J':
787 case 'j':
788 if (got_im || done) {
789 sw_error = 1;
790 break;
791 }
792 if (z<0.0) {
793 y=sign;
794 }
795 else{
796 y=sign*z;
797 }
798 got_im=1;
799 s++;
800 if (*s!='+' && *s!='-' )
801 done=1;
802 break;
803
804 default:
805 if (isspace(Py_CHARMASK(*s))) {
806 while (*s && isspace(Py_CHARMASK(*s)))
807 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000808 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000809 sw_error=1;
810 else
811 done = 1;
812 break;
813 }
814 digit_or_dot =
815 (*s=='.' || isdigit(Py_CHARMASK(*s)));
816 if (done||!digit_or_dot) {
817 sw_error=1;
818 break;
819 }
820 errno = 0;
821 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000822 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823 PyFPE_END_PROTECT(z)
824 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000825 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000826 "float() out of range: %.150s", s);
827 PyErr_SetString(
828 PyExc_ValueError,
829 buffer);
830 return NULL;
831 }
832 s=end;
833 if (*s=='J' || *s=='j') {
834
835 break;
836 }
837 if (got_re) {
838 sw_error=1;
839 break;
840 }
841
842 /* accept a real part */
843 x=sign*z;
844 got_re=1;
845 if (got_im) done=1;
846 z = -1.0;
847 sign = 1;
848 break;
849
850 } /* end of switch */
851
Tim Peters077f2712002-04-14 22:04:03 +0000852 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853
Guido van Rossumd8faa362007-04-27 19:54:29 +0000854 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 PyErr_SetString(PyExc_ValueError,
856 "complex() arg is a malformed string");
857 return NULL;
858 }
859
860 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000861}
862
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863static PyObject *
864complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
865{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000866 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867 PyNumberMethods *nbr, *nbi = NULL;
868 Py_complex cr, ci;
869 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000870 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000871 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872
873 r = Py_False;
874 i = NULL;
875 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
876 &r, &i))
877 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000878
Guido van Rossumd8faa362007-04-27 19:54:29 +0000879 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000880 if (PyComplex_CheckExact(r) && i == NULL &&
881 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000882 /* Note that we can't know whether it's safe to return
883 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000884 to exact complexes here. If either the input or the
885 output is a complex subclass, it will be handled below
886 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000887 Py_INCREF(r);
888 return r;
889 }
Fred Drake526c7a02001-12-13 19:52:22 +0000890 if (PyString_Check(r) || PyUnicode_Check(r)) {
891 if (i != NULL) {
892 PyErr_SetString(PyExc_TypeError,
893 "complex() can't take second arg"
894 " if first is a string");
895 return NULL;
896 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000897 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000898 }
899 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
900 PyErr_SetString(PyExc_TypeError,
901 "complex() second arg can't be a string");
902 return NULL;
903 }
Tim Peters2400fa42001-09-12 19:12:49 +0000904
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000905 /* XXX Hack to support classes with __complex__ method */
906 if (complexstr == NULL) {
907 complexstr = PyString_InternFromString("__complex__");
908 if (complexstr == NULL)
909 return NULL;
910 }
911 f = PyObject_GetAttr(r, complexstr);
912 if (f == NULL)
913 PyErr_Clear();
914 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000915 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000916 if (args == NULL)
917 return NULL;
918 r = PyEval_CallObject(f, args);
919 Py_DECREF(args);
920 Py_DECREF(f);
921 if (r == NULL)
922 return NULL;
923 own_r = 1;
924 }
Tim Peters2400fa42001-09-12 19:12:49 +0000925 nbr = r->ob_type->tp_as_number;
926 if (i != NULL)
927 nbi = i->ob_type->tp_as_number;
928 if (nbr == NULL || nbr->nb_float == NULL ||
929 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000930 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000931 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000932 if (own_r) {
933 Py_DECREF(r);
934 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000935 return NULL;
936 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000937
938 /* If we get this far, then the "real" and "imag" parts should
939 both be treated as numbers, and the constructor should return a
940 complex number equal to (real + imag*1j).
941
942 Note that we do NOT assume the input to already be in canonical
943 form; the "real" and "imag" parts might themselves be complex
944 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000945 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000946 /* Note that if r is of a complex subtype, we're only
947 retaining its real & imag parts here, and the return
948 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949 cr = ((PyComplexObject*)r)->cval;
950 if (own_r) {
951 Py_DECREF(r);
952 }
953 }
954 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000955 /* The "real" part really is entirely real, and contributes
956 nothing in the imaginary direction.
957 Just treat it as a double. */
958 cr.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000959 tmp = PyNumber_Float(r);
960 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000961 /* r was a newly created complex number, rather
962 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000963 Py_DECREF(r);
964 }
965 if (tmp == NULL)
966 return NULL;
967 if (!PyFloat_Check(tmp)) {
968 PyErr_SetString(PyExc_TypeError,
969 "float(r) didn't return a float");
970 Py_DECREF(tmp);
971 return NULL;
972 }
973 cr.real = PyFloat_AsDouble(tmp);
974 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000975 }
976 if (i == NULL) {
977 ci.real = 0.0;
978 ci.imag = 0.0;
979 }
980 else if (PyComplex_Check(i))
981 ci = ((PyComplexObject*)i)->cval;
982 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000983 /* The "imag" part really is entirely imaginary, and
984 contributes nothing in the real direction.
985 Just treat it as a double. */
986 ci.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987 tmp = (*nbi->nb_float)(i);
988 if (tmp == NULL)
989 return NULL;
990 ci.real = PyFloat_AsDouble(tmp);
991 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000992 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000993 /* If the input was in canonical form, then the "real" and "imag"
994 parts are real numbers, so that ci.real and cr.imag are zero.
995 We need this correction in case they were not real numbers. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000996 cr.real -= ci.imag;
997 cr.imag += ci.real;
998 return complex_subtype_from_c_complex(type, cr);
999}
1000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001001PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001002"complex(real[, imag]) -> complex number\n"
1003"\n"
1004"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001005"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001007static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001008 (binaryfunc)complex_add, /* nb_add */
1009 (binaryfunc)complex_sub, /* nb_subtract */
1010 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001011 (binaryfunc)complex_remainder, /* nb_remainder */
1012 (binaryfunc)complex_divmod, /* nb_divmod */
1013 (ternaryfunc)complex_pow, /* nb_power */
1014 (unaryfunc)complex_neg, /* nb_negative */
1015 (unaryfunc)complex_pos, /* nb_positive */
1016 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +00001017 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001018 0, /* nb_invert */
1019 0, /* nb_lshift */
1020 0, /* nb_rshift */
1021 0, /* nb_and */
1022 0, /* nb_xor */
1023 0, /* nb_or */
Neal Norwitz4886cc32006-08-21 17:06:07 +00001024 (coercion)0, /* nb_coerce */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001025 complex_int, /* nb_int */
1026 complex_long, /* nb_long */
1027 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001028 0, /* nb_oct */
1029 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001030 0, /* nb_inplace_add */
1031 0, /* nb_inplace_subtract */
1032 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001033 0, /* nb_inplace_remainder */
1034 0, /* nb_inplace_power */
1035 0, /* nb_inplace_lshift */
1036 0, /* nb_inplace_rshift */
1037 0, /* nb_inplace_and */
1038 0, /* nb_inplace_xor */
1039 0, /* nb_inplace_or */
1040 (binaryfunc)complex_int_div, /* nb_floor_divide */
1041 (binaryfunc)complex_div, /* nb_true_divide */
1042 0, /* nb_inplace_floor_divide */
1043 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001044};
1045
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046PyTypeObject PyComplex_Type = {
1047 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001048 0,
1049 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001050 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001051 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001052 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001053 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001054 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001055 0, /* tp_setattr */
1056 0, /* tp_compare */
1057 (reprfunc)complex_repr, /* tp_repr */
1058 &complex_as_number, /* tp_as_number */
1059 0, /* tp_as_sequence */
1060 0, /* tp_as_mapping */
1061 (hashfunc)complex_hash, /* tp_hash */
1062 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001063 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001065 0, /* tp_setattro */
1066 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001067 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1068 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001069 0, /* tp_traverse */
1070 0, /* tp_clear */
1071 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001072 0, /* tp_weaklistoffset */
1073 0, /* tp_iter */
1074 0, /* tp_iternext */
1075 complex_methods, /* tp_methods */
1076 complex_members, /* tp_members */
1077 0, /* tp_getset */
1078 0, /* tp_base */
1079 0, /* tp_dict */
1080 0, /* tp_descr_get */
1081 0, /* tp_descr_set */
1082 0, /* tp_dictoffset */
1083 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001084 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001085 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001086 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001087};
1088
1089#endif