blob: fa493d76e88f0ae7883254fe28508a3203f70ff3 [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
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000331complex_repr(PyComplexObject *v)
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, PREC_REPR);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000335 return PyUnicode_FromString(buf);
Tim Peters70695122001-03-11 08:37:29 +0000336}
337
338static PyObject *
339complex_str(PyComplexObject *v)
340{
341 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000342 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Walter Dörwald7696ed72007-05-31 15:51:35 +0000343 return PyUnicode_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000344}
345
Guido van Rossumf9fca921996-01-12 00:47:05 +0000346static long
Fred Drake4288c802000-07-09 04:36:04 +0000347complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000348{
Tim Peters39dce292000-08-15 03:34:48 +0000349 long hashreal, hashimag, combined;
350 hashreal = _Py_HashDouble(v->cval.real);
351 if (hashreal == -1)
352 return -1;
353 hashimag = _Py_HashDouble(v->cval.imag);
354 if (hashimag == -1)
355 return -1;
356 /* Note: if the imaginary part is 0, hashimag is 0 now,
357 * so the following returns hashreal unchanged. This is
358 * important because numbers of different types that
359 * compare equal must have the same hash value, so that
360 * hash(x + 0*j) must equal hash(x).
361 */
362 combined = hashreal + 1000003 * hashimag;
363 if (combined == -1)
364 combined = -2;
365 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366}
367
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000368/* This macro may return! */
369#define TO_COMPLEX(obj, c) \
370 if (PyComplex_Check(obj)) \
371 c = ((PyComplexObject *)(obj))->cval; \
372 else if (to_complex(&(obj), &(c)) < 0) \
373 return (obj)
374
375static int
376to_complex(PyObject **pobj, Py_complex *pc)
377{
378 PyObject *obj = *pobj;
379
380 pc->real = pc->imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000381 if (PyLong_Check(obj)) {
382 pc->real = PyLong_AsDouble(obj);
383 if (pc->real == -1.0 && PyErr_Occurred()) {
384 *pobj = NULL;
385 return -1;
386 }
387 return 0;
388 }
389 if (PyFloat_Check(obj)) {
390 pc->real = PyFloat_AsDouble(obj);
391 return 0;
392 }
393 Py_INCREF(Py_NotImplemented);
394 *pobj = Py_NotImplemented;
395 return -1;
396}
397
398
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000400complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000401{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000402 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000403 Py_complex a, b;
404 TO_COMPLEX(v, a);
405 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000406 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000407 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000408 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000410}
411
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000413complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000414{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000415 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000416 Py_complex a, b;
417 TO_COMPLEX(v, a);
418 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000419 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000420 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000421 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000423}
424
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000426complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000427{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000428 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000429 Py_complex a, b;
430 TO_COMPLEX(v, a);
431 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000432 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000433 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000434 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000436}
437
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000439complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000440{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000441 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000442 Py_complex a, b;
443 TO_COMPLEX(v, a);
444 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000445 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000446 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000447 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000448 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000449 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000451 return NULL;
452 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000454}
455
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000456static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000457complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000458{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000459 PyErr_SetString(PyExc_TypeError,
460 "can't mod complex numbers.");
461 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000462}
463
Guido van Rossumee09fc11996-09-11 13:55:55 +0000464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000466complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000467{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000468 PyErr_SetString(PyExc_TypeError,
469 "can't take floor or mod of complex number.");
470 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000471}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000472
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000474complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000475{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000476 Py_complex p;
477 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000478 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000479 Py_complex a, b;
480 TO_COMPLEX(v, a);
481 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000482
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000483 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000485 return NULL;
486 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000487 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000488 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000489 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000490 int_exponent = (long)exponent.real;
491 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000492 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000493 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000494 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000495
Guido van Rossum45b83911997-03-14 04:32:50 +0000496 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000497 Py_ADJUST_ERANGE2(p.real, p.imag);
498 if (errno == EDOM) {
499 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000501 return NULL;
502 }
Tim Petersbab22be2002-03-22 02:48:46 +0000503 else if (errno == ERANGE) {
504 PyErr_SetString(PyExc_OverflowError,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000505 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000506 return NULL;
507 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509}
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000512complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000513{
Guido van Rossum46334cd2007-08-01 17:43:15 +0000514 PyErr_SetString(PyExc_TypeError,
515 "can't take floor of complex number.");
Guido van Rossum4668b002001-08-08 05:00:18 +0000516 return NULL;
517}
518
519static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000520complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000521{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000522 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000523 neg.real = -v->cval.real;
524 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000526}
527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000529complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000530{
Tim Peters2400fa42001-09-12 19:12:49 +0000531 if (PyComplex_CheckExact(v)) {
532 Py_INCREF(v);
533 return (PyObject *)v;
534 }
535 else
536 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000537}
538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000540complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000541{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000542 double result;
543 PyFPE_START_PROTECT("complex_abs", return 0)
544 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000545 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000547}
548
549static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000550complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000551{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000552 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000553}
554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000556complex_richcompare(PyObject *v, PyObject *w, int op)
557{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000558 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000559 Py_complex i, j;
560 TO_COMPLEX(v, i);
561 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000562
Guido van Rossum22056422001-09-24 17:52:04 +0000563 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000564 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000565 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000566 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000567 return NULL;
568 }
569
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000570 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
571 res = Py_True;
572 else
573 res = Py_False;
574
575 Py_INCREF(res);
576 return res;
577}
578
579static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000580complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000581{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000583 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000584 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000585}
586
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000588complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000589{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000591 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000592 return NULL;
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_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000597{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000599 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000600 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000601}
602
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000604complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000605{
Guido van Rossum926518b1996-08-19 19:30:45 +0000606 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000608 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000610}
611
Guido van Rossum46334cd2007-08-01 17:43:15 +0000612PyDoc_STRVAR(complex_conjugate_doc,
613"complex.conjugate() -> complex\n"
614"\n"
615"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
616
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000617static PyObject *
618complex_getnewargs(PyComplexObject *v)
619{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000620 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000621}
622
Guido van Rossumf9fca921996-01-12 00:47:05 +0000623static PyMethodDef complex_methods[] = {
Guido van Rossum46334cd2007-08-01 17:43:15 +0000624 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
625 complex_conjugate_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000626 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000627 {NULL, NULL} /* sentinel */
628};
629
Guido van Rossum6f799372001-09-20 20:46:19 +0000630static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000631 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000632 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000633 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000634 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000635 {0},
636};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000640{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000641 const char *s, *start;
642 char *end;
643 double x=0.0, y=0.0, z;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000644 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000645 int digit_or_dot;
646 int sw_error=0;
647 int sign;
648 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000649 char s_buffer[256];
Martin v. Löwis18e16552006-02-15 17:27:45 +0000650 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000651
Neal Norwitzed2b7392007-08-26 04:51:10 +0000652 if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000653 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000654 PyErr_SetString(PyExc_ValueError,
655 "complex() literal too large to convert");
656 return NULL;
657 }
658 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
659 PyUnicode_GET_SIZE(v),
660 s_buffer,
661 NULL))
662 return NULL;
663 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000664 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665 }
666 else if (PyObject_AsCharBuffer(v, &s, &len)) {
667 PyErr_SetString(PyExc_TypeError,
668 "complex() arg is not a string");
669 return NULL;
670 }
671
672 /* position on first nonblank */
673 start = s;
674 while (*s && isspace(Py_CHARMASK(*s)))
675 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000676 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000677 PyErr_SetString(PyExc_ValueError,
678 "complex() arg is an empty string");
679 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000680 }
681 if (s[0] == '(') {
682 /* Skip over possible bracket from repr(). */
683 got_bracket = 1;
684 s++;
685 while (*s && isspace(Py_CHARMASK(*s)))
686 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000687 }
688
689 z = -1.0;
690 sign = 1;
691 do {
692
693 switch (*s) {
694
695 case '\0':
696 if (s-start != len) {
697 PyErr_SetString(
698 PyExc_ValueError,
699 "complex() arg contains a null byte");
700 return NULL;
701 }
702 if(!done) sw_error=1;
703 break;
704
Guido van Rossumd8faa362007-04-27 19:54:29 +0000705 case ')':
706 if (!got_bracket || !(got_re || got_im)) {
707 sw_error=1;
708 break;
709 }
710 got_bracket=0;
711 done=1;
712 s++;
713 while (*s && isspace(Py_CHARMASK(*s)))
714 s++;
715 if (*s) sw_error=1;
716 break;
717
Tim Peters6d6c1a32001-08-02 04:15:00 +0000718 case '-':
719 sign = -1;
720 /* Fallthrough */
721 case '+':
722 if (done) sw_error=1;
723 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000724 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000725 isspace(Py_CHARMASK(*s)) ) sw_error=1;
726 break;
727
728 case 'J':
729 case 'j':
730 if (got_im || done) {
731 sw_error = 1;
732 break;
733 }
734 if (z<0.0) {
735 y=sign;
736 }
737 else{
738 y=sign*z;
739 }
740 got_im=1;
741 s++;
742 if (*s!='+' && *s!='-' )
743 done=1;
744 break;
745
746 default:
747 if (isspace(Py_CHARMASK(*s))) {
748 while (*s && isspace(Py_CHARMASK(*s)))
749 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000750 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000751 sw_error=1;
752 else
753 done = 1;
754 break;
755 }
756 digit_or_dot =
757 (*s=='.' || isdigit(Py_CHARMASK(*s)));
758 if (done||!digit_or_dot) {
759 sw_error=1;
760 break;
761 }
762 errno = 0;
763 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000764 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000765 PyFPE_END_PROTECT(z)
766 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000767 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000768 "float() out of range: %.150s", s);
769 PyErr_SetString(
770 PyExc_ValueError,
771 buffer);
772 return NULL;
773 }
774 s=end;
775 if (*s=='J' || *s=='j') {
776
777 break;
778 }
779 if (got_re) {
780 sw_error=1;
781 break;
782 }
783
784 /* accept a real part */
785 x=sign*z;
786 got_re=1;
787 if (got_im) done=1;
788 z = -1.0;
789 sign = 1;
790 break;
791
792 } /* end of switch */
793
Tim Peters077f2712002-04-14 22:04:03 +0000794 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795
Guido van Rossumd8faa362007-04-27 19:54:29 +0000796 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000797 PyErr_SetString(PyExc_ValueError,
798 "complex() arg is a malformed string");
799 return NULL;
800 }
801
802 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000803}
804
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805static PyObject *
806complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
807{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000808 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000809 PyNumberMethods *nbr, *nbi = NULL;
810 Py_complex cr, ci;
811 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000812 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000813 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814
815 r = Py_False;
816 i = NULL;
817 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
818 &r, &i))
819 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000820
Guido van Rossumd8faa362007-04-27 19:54:29 +0000821 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000822 if (PyComplex_CheckExact(r) && i == NULL &&
823 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000824 /* Note that we can't know whether it's safe to return
825 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000826 to exact complexes here. If either the input or the
827 output is a complex subclass, it will be handled below
828 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000829 Py_INCREF(r);
830 return r;
831 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000832 if (PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000833 if (i != NULL) {
834 PyErr_SetString(PyExc_TypeError,
835 "complex() can't take second arg"
836 " if first is a string");
837 return NULL;
838 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000840 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000841 if (i != NULL && PyUnicode_Check(i)) {
Fred Drake526c7a02001-12-13 19:52:22 +0000842 PyErr_SetString(PyExc_TypeError,
843 "complex() second arg can't be a string");
844 return NULL;
845 }
Tim Peters2400fa42001-09-12 19:12:49 +0000846
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000847 /* XXX Hack to support classes with __complex__ method */
848 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000849 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000850 if (complexstr == NULL)
851 return NULL;
852 }
853 f = PyObject_GetAttr(r, complexstr);
854 if (f == NULL)
855 PyErr_Clear();
856 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000857 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000858 if (args == NULL)
859 return NULL;
860 r = PyEval_CallObject(f, args);
861 Py_DECREF(args);
862 Py_DECREF(f);
863 if (r == NULL)
864 return NULL;
865 own_r = 1;
866 }
Tim Peters2400fa42001-09-12 19:12:49 +0000867 nbr = r->ob_type->tp_as_number;
868 if (i != NULL)
869 nbi = i->ob_type->tp_as_number;
870 if (nbr == NULL || nbr->nb_float == NULL ||
871 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000873 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000874 if (own_r) {
875 Py_DECREF(r);
876 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000877 return NULL;
878 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000879
880 /* If we get this far, then the "real" and "imag" parts should
881 both be treated as numbers, and the constructor should return a
882 complex number equal to (real + imag*1j).
883
884 Note that we do NOT assume the input to already be in canonical
885 form; the "real" and "imag" parts might themselves be complex
886 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000888 /* Note that if r is of a complex subtype, we're only
889 retaining its real & imag parts here, and the return
890 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 cr = ((PyComplexObject*)r)->cval;
892 if (own_r) {
893 Py_DECREF(r);
894 }
895 }
896 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000897 /* The "real" part really is entirely real, and contributes
898 nothing in the imaginary direction.
899 Just treat it as a double. */
900 cr.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000901 tmp = PyNumber_Float(r);
902 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000903 /* r was a newly created complex number, rather
904 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905 Py_DECREF(r);
906 }
907 if (tmp == NULL)
908 return NULL;
909 if (!PyFloat_Check(tmp)) {
910 PyErr_SetString(PyExc_TypeError,
911 "float(r) didn't return a float");
912 Py_DECREF(tmp);
913 return NULL;
914 }
915 cr.real = PyFloat_AsDouble(tmp);
916 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000917 }
918 if (i == NULL) {
919 ci.real = 0.0;
920 ci.imag = 0.0;
921 }
922 else if (PyComplex_Check(i))
923 ci = ((PyComplexObject*)i)->cval;
924 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000925 /* The "imag" part really is entirely imaginary, and
926 contributes nothing in the real direction.
927 Just treat it as a double. */
928 ci.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000929 tmp = (*nbi->nb_float)(i);
930 if (tmp == NULL)
931 return NULL;
932 ci.real = PyFloat_AsDouble(tmp);
933 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000934 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000935 /* If the input was in canonical form, then the "real" and "imag"
936 parts are real numbers, so that ci.real and cr.imag are zero.
937 We need this correction in case they were not real numbers. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000938 cr.real -= ci.imag;
939 cr.imag += ci.real;
940 return complex_subtype_from_c_complex(type, cr);
941}
942
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000943PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000944"complex(real[, imag]) -> complex number\n"
945"\n"
946"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000947"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000949static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000950 (binaryfunc)complex_add, /* nb_add */
951 (binaryfunc)complex_sub, /* nb_subtract */
952 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000953 (binaryfunc)complex_remainder, /* nb_remainder */
954 (binaryfunc)complex_divmod, /* nb_divmod */
955 (ternaryfunc)complex_pow, /* nb_power */
956 (unaryfunc)complex_neg, /* nb_negative */
957 (unaryfunc)complex_pos, /* nb_positive */
958 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +0000959 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000960 0, /* nb_invert */
961 0, /* nb_lshift */
962 0, /* nb_rshift */
963 0, /* nb_and */
964 0, /* nb_xor */
965 0, /* nb_or */
Neal Norwitz4886cc32006-08-21 17:06:07 +0000966 (coercion)0, /* nb_coerce */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000967 complex_int, /* nb_int */
968 complex_long, /* nb_long */
969 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000970 0, /* nb_oct */
971 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000972 0, /* nb_inplace_add */
973 0, /* nb_inplace_subtract */
974 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +0000975 0, /* nb_inplace_remainder */
976 0, /* nb_inplace_power */
977 0, /* nb_inplace_lshift */
978 0, /* nb_inplace_rshift */
979 0, /* nb_inplace_and */
980 0, /* nb_inplace_xor */
981 0, /* nb_inplace_or */
982 (binaryfunc)complex_int_div, /* nb_floor_divide */
983 (binaryfunc)complex_div, /* nb_true_divide */
984 0, /* nb_inplace_floor_divide */
985 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000986};
987
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000988PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000989 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000990 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000992 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000993 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +0000994 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000996 0, /* tp_setattr */
997 0, /* tp_compare */
998 (reprfunc)complex_repr, /* tp_repr */
999 &complex_as_number, /* tp_as_number */
1000 0, /* tp_as_sequence */
1001 0, /* tp_as_mapping */
1002 (hashfunc)complex_hash, /* tp_hash */
1003 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001004 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001005 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001006 0, /* tp_setattro */
1007 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1009 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001010 0, /* tp_traverse */
1011 0, /* tp_clear */
1012 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 0, /* tp_weaklistoffset */
1014 0, /* tp_iter */
1015 0, /* tp_iternext */
1016 complex_methods, /* tp_methods */
1017 complex_members, /* tp_members */
1018 0, /* tp_getset */
1019 0, /* tp_base */
1020 0, /* tp_dict */
1021 0, /* tp_descr_get */
1022 0, /* tp_descr_set */
1023 0, /* tp_dictoffset */
1024 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001025 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001027 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001028};
1029
1030#endif