blob: a51e8067791b8327a3aa399679854d282cbda9b6 [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) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000272 if (!(complex_str = PyUnicode_FromString("__complex__")))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000273 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);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000345 return PyUnicode_FromString(buf);
Tim Peters70695122001-03-11 08:37:29 +0000346}
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);
Walter Dörwald7696ed72007-05-31 15:51:35 +0000353 return PyUnicode_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 Rossum46334cd2007-08-01 17:43:15 +0000469 PyErr_SetString(PyExc_TypeError,
470 "can't mod complex numbers.");
471 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000472}
473
Guido van Rossumee09fc11996-09-11 13:55:55 +0000474
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000476complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000477{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000478 PyErr_SetString(PyExc_TypeError,
479 "can't take floor or mod of complex number.");
480 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000481}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000482
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000484complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000485{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000486 Py_complex p;
487 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000488 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000489 Py_complex a, b;
490 TO_COMPLEX(v, a);
491 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000492
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000493 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000495 return NULL;
496 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000497 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000498 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000499 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000500 int_exponent = (long)exponent.real;
501 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000502 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000503 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000504 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000505
Guido van Rossum45b83911997-03-14 04:32:50 +0000506 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000507 Py_ADJUST_ERANGE2(p.real, p.imag);
508 if (errno == EDOM) {
509 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000511 return NULL;
512 }
Tim Petersbab22be2002-03-22 02:48:46 +0000513 else if (errno == ERANGE) {
514 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000515 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000516 return NULL;
517 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000519}
520
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000522complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000523{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000524 PyErr_SetString(PyExc_TypeError,
525 "can't take floor of complex number.");
Guido van Rossum4668b002001-08-08 05:00:18 +0000526 return NULL;
527}
528
529static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000530complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000531{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000532 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000533 neg.real = -v->cval.real;
534 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000536}
537
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000538static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000539complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000540{
Tim Peters2400fa42001-09-12 19:12:49 +0000541 if (PyComplex_CheckExact(v)) {
542 Py_INCREF(v);
543 return (PyObject *)v;
544 }
545 else
546 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000547}
548
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000550complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000551{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000552 double result;
553 PyFPE_START_PROTECT("complex_abs", return 0)
554 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000555 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000557}
558
559static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000560complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000561{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000562 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000563}
564
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000566complex_richcompare(PyObject *v, PyObject *w, int op)
567{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000568 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000569 Py_complex i, j;
570 TO_COMPLEX(v, i);
571 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000572
Guido van Rossum22056422001-09-24 17:52:04 +0000573 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000574 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000575 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000576 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000577 return NULL;
578 }
579
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000580 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
581 res = Py_True;
582 else
583 res = Py_False;
584
585 Py_INCREF(res);
586 return res;
587}
588
589static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000590complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000591{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000593 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000594 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000595}
596
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000598complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000599{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000600 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000601 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000602 return NULL;
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_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000607{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000609 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000610 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000611}
612
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000614complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000615{
Guido van Rossum926518b1996-08-19 19:30:45 +0000616 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000618 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000620}
621
Guido van Rossum46334cd2007-08-01 17:43:15 +0000622PyDoc_STRVAR(complex_conjugate_doc,
623"complex.conjugate() -> complex\n"
624"\n"
625"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
626
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000627static PyObject *
628complex_getnewargs(PyComplexObject *v)
629{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000630 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000631}
632
Guido van Rossumf9fca921996-01-12 00:47:05 +0000633static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000634 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
635 complex_conjugate_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000636 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637 {NULL, NULL} /* sentinel */
638};
639
Guido van Rossum6f799372001-09-20 20:46:19 +0000640static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000641 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000642 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000643 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000644 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000645 {0},
646};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000647
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000649complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000650{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000651 const char *s, *start;
652 char *end;
653 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000654 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000655 int digit_or_dot;
656 int sw_error=0;
657 int sign;
658 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000659 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000660 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000661
662 if (PyString_Check(v)) {
663 s = PyString_AS_STRING(v);
664 len = PyString_GET_SIZE(v);
665 }
666 else if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000667 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000668 PyErr_SetString(PyExc_ValueError,
669 "complex() literal too large to convert");
670 return NULL;
671 }
672 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
673 PyUnicode_GET_SIZE(v),
674 s_buffer,
675 NULL))
676 return NULL;
677 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000678 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000679 }
680 else if (PyObject_AsCharBuffer(v, &s, &len)) {
681 PyErr_SetString(PyExc_TypeError,
682 "complex() arg is not a string");
683 return NULL;
684 }
685
686 /* position on first nonblank */
687 start = s;
688 while (*s && isspace(Py_CHARMASK(*s)))
689 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000690 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000691 PyErr_SetString(PyExc_ValueError,
692 "complex() arg is an empty string");
693 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000694 }
695 if (s[0] == '(') {
696 /* Skip over possible bracket from repr(). */
697 got_bracket = 1;
698 s++;
699 while (*s && isspace(Py_CHARMASK(*s)))
700 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000701 }
702
703 z = -1.0;
704 sign = 1;
705 do {
706
707 switch (*s) {
708
709 case '\0':
710 if (s-start != len) {
711 PyErr_SetString(
712 PyExc_ValueError,
713 "complex() arg contains a null byte");
714 return NULL;
715 }
716 if(!done) sw_error=1;
717 break;
718
Guido van Rossumd8faa362007-04-27 19:54:29 +0000719 case ')':
720 if (!got_bracket || !(got_re || got_im)) {
721 sw_error=1;
722 break;
723 }
724 got_bracket=0;
725 done=1;
726 s++;
727 while (*s && isspace(Py_CHARMASK(*s)))
728 s++;
729 if (*s) sw_error=1;
730 break;
731
Tim Peters6d6c1a32001-08-02 04:15:00 +0000732 case '-':
733 sign = -1;
734 /* Fallthrough */
735 case '+':
736 if (done) sw_error=1;
737 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000738 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000739 isspace(Py_CHARMASK(*s)) ) sw_error=1;
740 break;
741
742 case 'J':
743 case 'j':
744 if (got_im || done) {
745 sw_error = 1;
746 break;
747 }
748 if (z<0.0) {
749 y=sign;
750 }
751 else{
752 y=sign*z;
753 }
754 got_im=1;
755 s++;
756 if (*s!='+' && *s!='-' )
757 done=1;
758 break;
759
760 default:
761 if (isspace(Py_CHARMASK(*s))) {
762 while (*s && isspace(Py_CHARMASK(*s)))
763 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000764 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000765 sw_error=1;
766 else
767 done = 1;
768 break;
769 }
770 digit_or_dot =
771 (*s=='.' || isdigit(Py_CHARMASK(*s)));
772 if (done||!digit_or_dot) {
773 sw_error=1;
774 break;
775 }
776 errno = 0;
777 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000778 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000779 PyFPE_END_PROTECT(z)
780 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000781 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782 "float() out of range: %.150s", s);
783 PyErr_SetString(
784 PyExc_ValueError,
785 buffer);
786 return NULL;
787 }
788 s=end;
789 if (*s=='J' || *s=='j') {
790
791 break;
792 }
793 if (got_re) {
794 sw_error=1;
795 break;
796 }
797
798 /* accept a real part */
799 x=sign*z;
800 got_re=1;
801 if (got_im) done=1;
802 z = -1.0;
803 sign = 1;
804 break;
805
806 } /* end of switch */
807
Tim Peters077f2712002-04-14 22:04:03 +0000808 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000809
Guido van Rossumd8faa362007-04-27 19:54:29 +0000810 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000811 PyErr_SetString(PyExc_ValueError,
812 "complex() arg is a malformed string");
813 return NULL;
814 }
815
816 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000817}
818
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819static PyObject *
820complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
821{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000822 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823 PyNumberMethods *nbr, *nbi = NULL;
824 Py_complex cr, ci;
825 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000826 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000827 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828
829 r = Py_False;
830 i = NULL;
831 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
832 &r, &i))
833 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000834
Guido van Rossumd8faa362007-04-27 19:54:29 +0000835 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000836 if (PyComplex_CheckExact(r) && i == NULL &&
837 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000838 /* Note that we can't know whether it's safe to return
839 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000840 to exact complexes here. If either the input or the
841 output is a complex subclass, it will be handled below
842 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000843 Py_INCREF(r);
844 return r;
845 }
Fred Drake526c7a02001-12-13 19:52:22 +0000846 if (PyString_Check(r) || PyUnicode_Check(r)) {
847 if (i != NULL) {
848 PyErr_SetString(PyExc_TypeError,
849 "complex() can't take second arg"
850 " if first is a string");
851 return NULL;
852 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000854 }
855 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
856 PyErr_SetString(PyExc_TypeError,
857 "complex() second arg can't be a string");
858 return NULL;
859 }
Tim Peters2400fa42001-09-12 19:12:49 +0000860
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000861 /* XXX Hack to support classes with __complex__ method */
862 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000863 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000864 if (complexstr == NULL)
865 return NULL;
866 }
867 f = PyObject_GetAttr(r, complexstr);
868 if (f == NULL)
869 PyErr_Clear();
870 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000871 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000872 if (args == NULL)
873 return NULL;
874 r = PyEval_CallObject(f, args);
875 Py_DECREF(args);
876 Py_DECREF(f);
877 if (r == NULL)
878 return NULL;
879 own_r = 1;
880 }
Tim Peters2400fa42001-09-12 19:12:49 +0000881 nbr = r->ob_type->tp_as_number;
882 if (i != NULL)
883 nbi = i->ob_type->tp_as_number;
884 if (nbr == NULL || nbr->nb_float == NULL ||
885 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000886 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000887 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000888 if (own_r) {
889 Py_DECREF(r);
890 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 return NULL;
892 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000893
894 /* If we get this far, then the "real" and "imag" parts should
895 both be treated as numbers, and the constructor should return a
896 complex number equal to (real + imag*1j).
897
898 Note that we do NOT assume the input to already be in canonical
899 form; the "real" and "imag" parts might themselves be complex
900 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000901 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000902 /* Note that if r is of a complex subtype, we're only
903 retaining its real & imag parts here, and the return
904 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905 cr = ((PyComplexObject*)r)->cval;
906 if (own_r) {
907 Py_DECREF(r);
908 }
909 }
910 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000911 /* The "real" part really is entirely real, and contributes
912 nothing in the imaginary direction.
913 Just treat it as a double. */
914 cr.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000915 tmp = PyNumber_Float(r);
916 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000917 /* r was a newly created complex number, rather
918 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000919 Py_DECREF(r);
920 }
921 if (tmp == NULL)
922 return NULL;
923 if (!PyFloat_Check(tmp)) {
924 PyErr_SetString(PyExc_TypeError,
925 "float(r) didn't return a float");
926 Py_DECREF(tmp);
927 return NULL;
928 }
929 cr.real = PyFloat_AsDouble(tmp);
930 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931 }
932 if (i == NULL) {
933 ci.real = 0.0;
934 ci.imag = 0.0;
935 }
936 else if (PyComplex_Check(i))
937 ci = ((PyComplexObject*)i)->cval;
938 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000939 /* The "imag" part really is entirely imaginary, and
940 contributes nothing in the real direction.
941 Just treat it as a double. */
942 ci.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000943 tmp = (*nbi->nb_float)(i);
944 if (tmp == NULL)
945 return NULL;
946 ci.real = PyFloat_AsDouble(tmp);
947 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000949 /* If the input was in canonical form, then the "real" and "imag"
950 parts are real numbers, so that ci.real and cr.imag are zero.
951 We need this correction in case they were not real numbers. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000952 cr.real -= ci.imag;
953 cr.imag += ci.real;
954 return complex_subtype_from_c_complex(type, cr);
955}
956
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000957PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000958"complex(real[, imag]) -> complex number\n"
959"\n"
960"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000961"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000962
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000964 (binaryfunc)complex_add, /* nb_add */
965 (binaryfunc)complex_sub, /* nb_subtract */
966 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000967 (binaryfunc)complex_remainder, /* nb_remainder */
968 (binaryfunc)complex_divmod, /* nb_divmod */
969 (ternaryfunc)complex_pow, /* nb_power */
970 (unaryfunc)complex_neg, /* nb_negative */
971 (unaryfunc)complex_pos, /* nb_positive */
972 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +0000973 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000974 0, /* nb_invert */
975 0, /* nb_lshift */
976 0, /* nb_rshift */
977 0, /* nb_and */
978 0, /* nb_xor */
979 0, /* nb_or */
Neal Norwitz4886cc32006-08-21 17:06:07 +0000980 (coercion)0, /* nb_coerce */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000981 complex_int, /* nb_int */
982 complex_long, /* nb_long */
983 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000984 0, /* nb_oct */
985 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000986 0, /* nb_inplace_add */
987 0, /* nb_inplace_subtract */
988 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +0000989 0, /* nb_inplace_remainder */
990 0, /* nb_inplace_power */
991 0, /* nb_inplace_lshift */
992 0, /* nb_inplace_rshift */
993 0, /* nb_inplace_and */
994 0, /* nb_inplace_xor */
995 0, /* nb_inplace_or */
996 (binaryfunc)complex_int_div, /* nb_floor_divide */
997 (binaryfunc)complex_div, /* nb_true_divide */
998 0, /* nb_inplace_floor_divide */
999 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001000};
1001
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001003 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001004 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001005 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001006 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001007 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001008 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001010 0, /* tp_setattr */
1011 0, /* tp_compare */
1012 (reprfunc)complex_repr, /* tp_repr */
1013 &complex_as_number, /* tp_as_number */
1014 0, /* tp_as_sequence */
1015 0, /* tp_as_mapping */
1016 (hashfunc)complex_hash, /* tp_hash */
1017 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001018 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001019 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001020 0, /* tp_setattro */
1021 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001022 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1023 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001024 0, /* tp_traverse */
1025 0, /* tp_clear */
1026 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001027 0, /* tp_weaklistoffset */
1028 0, /* tp_iter */
1029 0, /* tp_iternext */
1030 complex_methods, /* tp_methods */
1031 complex_members, /* tp_members */
1032 0, /* tp_getset */
1033 0, /* tp_base */
1034 0, /* tp_dict */
1035 0, /* tp_descr_get */
1036 0, /* tp_descr_set */
1037 0, /* tp_dictoffset */
1038 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001039 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001040 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001041 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001042};
1043
1044#endif