blob: 253f7149259febcf5f82f826103a238fe99e6bd9 [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
652 if (PyString_Check(v)) {
653 s = PyString_AS_STRING(v);
654 len = PyString_GET_SIZE(v);
655 }
656 else if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000657 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000658 PyErr_SetString(PyExc_ValueError,
659 "complex() literal too large to convert");
660 return NULL;
661 }
662 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
663 PyUnicode_GET_SIZE(v),
664 s_buffer,
665 NULL))
666 return NULL;
667 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000668 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000669 }
670 else if (PyObject_AsCharBuffer(v, &s, &len)) {
671 PyErr_SetString(PyExc_TypeError,
672 "complex() arg is not a string");
673 return NULL;
674 }
675
676 /* position on first nonblank */
677 start = s;
678 while (*s && isspace(Py_CHARMASK(*s)))
679 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000680 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000681 PyErr_SetString(PyExc_ValueError,
682 "complex() arg is an empty string");
683 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000684 }
685 if (s[0] == '(') {
686 /* Skip over possible bracket from repr(). */
687 got_bracket = 1;
688 s++;
689 while (*s && isspace(Py_CHARMASK(*s)))
690 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000691 }
692
693 z = -1.0;
694 sign = 1;
695 do {
696
697 switch (*s) {
698
699 case '\0':
700 if (s-start != len) {
701 PyErr_SetString(
702 PyExc_ValueError,
703 "complex() arg contains a null byte");
704 return NULL;
705 }
706 if(!done) sw_error=1;
707 break;
708
Guido van Rossumd8faa362007-04-27 19:54:29 +0000709 case ')':
710 if (!got_bracket || !(got_re || got_im)) {
711 sw_error=1;
712 break;
713 }
714 got_bracket=0;
715 done=1;
716 s++;
717 while (*s && isspace(Py_CHARMASK(*s)))
718 s++;
719 if (*s) sw_error=1;
720 break;
721
Tim Peters6d6c1a32001-08-02 04:15:00 +0000722 case '-':
723 sign = -1;
724 /* Fallthrough */
725 case '+':
726 if (done) sw_error=1;
727 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000728 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000729 isspace(Py_CHARMASK(*s)) ) sw_error=1;
730 break;
731
732 case 'J':
733 case 'j':
734 if (got_im || done) {
735 sw_error = 1;
736 break;
737 }
738 if (z<0.0) {
739 y=sign;
740 }
741 else{
742 y=sign*z;
743 }
744 got_im=1;
745 s++;
746 if (*s!='+' && *s!='-' )
747 done=1;
748 break;
749
750 default:
751 if (isspace(Py_CHARMASK(*s))) {
752 while (*s && isspace(Py_CHARMASK(*s)))
753 s++;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000754 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000755 sw_error=1;
756 else
757 done = 1;
758 break;
759 }
760 digit_or_dot =
761 (*s=='.' || isdigit(Py_CHARMASK(*s)));
762 if (done||!digit_or_dot) {
763 sw_error=1;
764 break;
765 }
766 errno = 0;
767 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000768 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000769 PyFPE_END_PROTECT(z)
770 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000771 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000772 "float() out of range: %.150s", s);
773 PyErr_SetString(
774 PyExc_ValueError,
775 buffer);
776 return NULL;
777 }
778 s=end;
779 if (*s=='J' || *s=='j') {
780
781 break;
782 }
783 if (got_re) {
784 sw_error=1;
785 break;
786 }
787
788 /* accept a real part */
789 x=sign*z;
790 got_re=1;
791 if (got_im) done=1;
792 z = -1.0;
793 sign = 1;
794 break;
795
796 } /* end of switch */
797
Tim Peters077f2712002-04-14 22:04:03 +0000798 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799
Guido van Rossumd8faa362007-04-27 19:54:29 +0000800 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 PyErr_SetString(PyExc_ValueError,
802 "complex() arg is a malformed string");
803 return NULL;
804 }
805
806 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000807}
808
Tim Peters6d6c1a32001-08-02 04:15:00 +0000809static PyObject *
810complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
811{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000812 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813 PyNumberMethods *nbr, *nbi = NULL;
814 Py_complex cr, ci;
815 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000816 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000817 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818
819 r = Py_False;
820 i = NULL;
821 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
822 &r, &i))
823 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000824
Guido van Rossumd8faa362007-04-27 19:54:29 +0000825 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000826 if (PyComplex_CheckExact(r) && i == NULL &&
827 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000828 /* Note that we can't know whether it's safe to return
829 a complex *subclass* instance as-is, hence the restriction
Guido van Rossumd8faa362007-04-27 19:54:29 +0000830 to exact complexes here. If either the input or the
831 output is a complex subclass, it will be handled below
832 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000833 Py_INCREF(r);
834 return r;
835 }
Fred Drake526c7a02001-12-13 19:52:22 +0000836 if (PyString_Check(r) || PyUnicode_Check(r)) {
837 if (i != NULL) {
838 PyErr_SetString(PyExc_TypeError,
839 "complex() can't take second arg"
840 " if first is a string");
841 return NULL;
842 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000844 }
845 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
846 PyErr_SetString(PyExc_TypeError,
847 "complex() second arg can't be a string");
848 return NULL;
849 }
Tim Peters2400fa42001-09-12 19:12:49 +0000850
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000851 /* XXX Hack to support classes with __complex__ method */
852 if (complexstr == NULL) {
Martin v. Löwis5b222132007-06-10 09:51:05 +0000853 complexstr = PyUnicode_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000854 if (complexstr == NULL)
855 return NULL;
856 }
857 f = PyObject_GetAttr(r, complexstr);
858 if (f == NULL)
859 PyErr_Clear();
860 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000861 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000862 if (args == NULL)
863 return NULL;
864 r = PyEval_CallObject(f, args);
865 Py_DECREF(args);
866 Py_DECREF(f);
867 if (r == NULL)
868 return NULL;
869 own_r = 1;
870 }
Tim Peters2400fa42001-09-12 19:12:49 +0000871 nbr = r->ob_type->tp_as_number;
872 if (i != NULL)
873 nbi = i->ob_type->tp_as_number;
874 if (nbr == NULL || nbr->nb_float == NULL ||
875 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000877 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000878 if (own_r) {
879 Py_DECREF(r);
880 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000881 return NULL;
882 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000883
884 /* If we get this far, then the "real" and "imag" parts should
885 both be treated as numbers, and the constructor should return a
886 complex number equal to (real + imag*1j).
887
888 Note that we do NOT assume the input to already be in canonical
889 form; the "real" and "imag" parts might themselves be complex
890 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000892 /* Note that if r is of a complex subtype, we're only
893 retaining its real & imag parts here, and the return
894 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000895 cr = ((PyComplexObject*)r)->cval;
896 if (own_r) {
897 Py_DECREF(r);
898 }
899 }
900 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000901 /* The "real" part really is entirely real, and contributes
902 nothing in the imaginary direction.
903 Just treat it as a double. */
904 cr.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905 tmp = PyNumber_Float(r);
906 if (own_r) {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000907 /* r was a newly created complex number, rather
908 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000909 Py_DECREF(r);
910 }
911 if (tmp == NULL)
912 return NULL;
913 if (!PyFloat_Check(tmp)) {
914 PyErr_SetString(PyExc_TypeError,
915 "float(r) didn't return a float");
916 Py_DECREF(tmp);
917 return NULL;
918 }
919 cr.real = PyFloat_AsDouble(tmp);
920 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000921 }
922 if (i == NULL) {
923 ci.real = 0.0;
924 ci.imag = 0.0;
925 }
926 else if (PyComplex_Check(i))
927 ci = ((PyComplexObject*)i)->cval;
928 else {
Guido van Rossumd8faa362007-04-27 19:54:29 +0000929 /* The "imag" part really is entirely imaginary, and
930 contributes nothing in the real direction.
931 Just treat it as a double. */
932 ci.imag = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000933 tmp = (*nbi->nb_float)(i);
934 if (tmp == NULL)
935 return NULL;
936 ci.real = PyFloat_AsDouble(tmp);
937 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000938 }
Guido van Rossumd8faa362007-04-27 19:54:29 +0000939 /* If the input was in canonical form, then the "real" and "imag"
940 parts are real numbers, so that ci.real and cr.imag are zero.
941 We need this correction in case they were not real numbers. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000942 cr.real -= ci.imag;
943 cr.imag += ci.real;
944 return complex_subtype_from_c_complex(type, cr);
945}
946
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000947PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000948"complex(real[, imag]) -> complex number\n"
949"\n"
950"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000951"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000952
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000954 (binaryfunc)complex_add, /* nb_add */
955 (binaryfunc)complex_sub, /* nb_subtract */
956 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000957 (binaryfunc)complex_remainder, /* nb_remainder */
958 (binaryfunc)complex_divmod, /* nb_divmod */
959 (ternaryfunc)complex_pow, /* nb_power */
960 (unaryfunc)complex_neg, /* nb_negative */
961 (unaryfunc)complex_pos, /* nb_positive */
962 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +0000963 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000964 0, /* nb_invert */
965 0, /* nb_lshift */
966 0, /* nb_rshift */
967 0, /* nb_and */
968 0, /* nb_xor */
969 0, /* nb_or */
Neal Norwitz4886cc32006-08-21 17:06:07 +0000970 (coercion)0, /* nb_coerce */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000971 complex_int, /* nb_int */
972 complex_long, /* nb_long */
973 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000974 0, /* nb_oct */
975 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000976 0, /* nb_inplace_add */
977 0, /* nb_inplace_subtract */
978 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +0000979 0, /* nb_inplace_remainder */
980 0, /* nb_inplace_power */
981 0, /* nb_inplace_lshift */
982 0, /* nb_inplace_rshift */
983 0, /* nb_inplace_and */
984 0, /* nb_inplace_xor */
985 0, /* nb_inplace_or */
986 (binaryfunc)complex_int_div, /* nb_floor_divide */
987 (binaryfunc)complex_div, /* nb_true_divide */
988 0, /* nb_inplace_floor_divide */
989 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000990};
991
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000992PyTypeObject PyComplex_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000993 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000994 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000996 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000997 complex_dealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +0000998 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000999 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001000 0, /* tp_setattr */
1001 0, /* tp_compare */
1002 (reprfunc)complex_repr, /* tp_repr */
1003 &complex_as_number, /* tp_as_number */
1004 0, /* tp_as_sequence */
1005 0, /* tp_as_mapping */
1006 (hashfunc)complex_hash, /* tp_hash */
1007 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001008 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001010 0, /* tp_setattro */
1011 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1013 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001014 0, /* tp_traverse */
1015 0, /* tp_clear */
1016 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 0, /* tp_weaklistoffset */
1018 0, /* tp_iter */
1019 0, /* tp_iternext */
1020 complex_methods, /* tp_methods */
1021 complex_members, /* tp_members */
1022 0, /* tp_getset */
1023 0, /* tp_base */
1024 0, /* tp_dict */
1025 0, /* tp_descr_get */
1026 0, /* tp_descr_set */
1027 0, /* tp_dictoffset */
1028 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001029 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001031 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001032};
1033
1034#endif