blob: c6e33433cff2a6608d6322552f7ed29b690ec8f2 [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 Rossumcf3d1081996-01-12 01:21:14 +0000255 if (PyComplex_Check(op)) {
256 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000257 }
258 else {
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000259 cv.real = PyFloat_AsDouble(op);
260 cv.imag = 0.;
261 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000262 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000263}
264
Guido van Rossumf9fca921996-01-12 00:47:05 +0000265static void
Fred Drake4288c802000-07-09 04:36:04 +0000266complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000267{
Guido van Rossum9475a232001-10-05 20:51:39 +0000268 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000269}
270
271
Guido van Rossum363078a1996-05-24 20:45:01 +0000272static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000273complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000275 char format[32];
276 if (v->cval.real == 0.) {
277 PyOS_snprintf(format, 32, "%%.%ig", precision);
278 PyOS_ascii_formatd(buf, bufsz, format, v->cval.imag);
279 strncat(buf, "j", bufsz);
280 } else {
281 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000282 /* Format imaginary part with sign, real part without */
Martin v. Löwis737ea822004-06-08 18:52:54 +0000283 PyOS_snprintf(format, 32, "%%.%ig", precision);
284 PyOS_ascii_formatd(re, 64, format, v->cval.real);
Georg Brandlc404ff22005-09-16 06:42:26 +0000285 PyOS_snprintf(format, 32, "%%+.%ig", precision);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000286 PyOS_ascii_formatd(im, 64, format, v->cval.imag);
Georg Brandlc404ff22005-09-16 06:42:26 +0000287 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000288 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000289}
290
291static int
Fred Drake4288c802000-07-09 04:36:04 +0000292complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000293{
294 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000295 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000296 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000297 fputs(buf, fp);
298 return 0;
299}
300
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000302complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000303{
304 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000305 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000306 return PyString_FromString(buf);
307}
308
309static PyObject *
310complex_str(PyComplexObject *v)
311{
312 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000313 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000315}
316
Guido van Rossumf9fca921996-01-12 00:47:05 +0000317static long
Fred Drake4288c802000-07-09 04:36:04 +0000318complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000319{
Tim Peters39dce292000-08-15 03:34:48 +0000320 long hashreal, hashimag, combined;
321 hashreal = _Py_HashDouble(v->cval.real);
322 if (hashreal == -1)
323 return -1;
324 hashimag = _Py_HashDouble(v->cval.imag);
325 if (hashimag == -1)
326 return -1;
327 /* Note: if the imaginary part is 0, hashimag is 0 now,
328 * so the following returns hashreal unchanged. This is
329 * important because numbers of different types that
330 * compare equal must have the same hash value, so that
331 * hash(x + 0*j) must equal hash(x).
332 */
333 combined = hashreal + 1000003 * hashimag;
334 if (combined == -1)
335 combined = -2;
336 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000337}
338
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000339/* This macro may return! */
340#define TO_COMPLEX(obj, c) \
341 if (PyComplex_Check(obj)) \
342 c = ((PyComplexObject *)(obj))->cval; \
343 else if (to_complex(&(obj), &(c)) < 0) \
344 return (obj)
345
346static int
347to_complex(PyObject **pobj, Py_complex *pc)
348{
349 PyObject *obj = *pobj;
350
351 pc->real = pc->imag = 0.0;
352 if (PyInt_Check(obj)) {
353 pc->real = PyInt_AS_LONG(obj);
354 return 0;
355 }
356 if (PyLong_Check(obj)) {
357 pc->real = PyLong_AsDouble(obj);
358 if (pc->real == -1.0 && PyErr_Occurred()) {
359 *pobj = NULL;
360 return -1;
361 }
362 return 0;
363 }
364 if (PyFloat_Check(obj)) {
365 pc->real = PyFloat_AsDouble(obj);
366 return 0;
367 }
368 Py_INCREF(Py_NotImplemented);
369 *pobj = Py_NotImplemented;
370 return -1;
371}
372
373
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000375complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000376{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000377 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000378 Py_complex a, b;
379 TO_COMPLEX(v, a);
380 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000381 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000382 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000383 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000385}
386
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000388complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000389{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000390 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000391 Py_complex a, b;
392 TO_COMPLEX(v, a);
393 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000394 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000395 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000396 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000398}
399
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000401complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000402{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000403 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000404 Py_complex a, b;
405 TO_COMPLEX(v, a);
406 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000407 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000408 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000409 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000411}
412
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000414complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000415{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000416 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000417 Py_complex a, b;
418 TO_COMPLEX(v, a);
419 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000420 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000421 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000422 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000423 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000424 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000426 return NULL;
427 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000429}
430
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000432complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000433{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000434 Py_complex div, mod;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000435 Py_complex a, b;
436 TO_COMPLEX(v, a);
437 TO_COMPLEX(w, b);
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000438
439 if (PyErr_Warn(PyExc_DeprecationWarning,
440 "complex divmod(), // and % are deprecated") < 0)
441 return NULL;
442
Guido van Rossum96783941997-05-20 18:21:34 +0000443 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000444 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000445 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000447 return NULL;
448 }
449 div.real = floor(div.real); /* Use the floor of the real part. */
450 div.imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000451 mod = c_diff(a, c_prod(b, div));
Guido van Rossum3be12e91996-09-12 20:56:18 +0000452
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000454}
455
Guido van Rossumee09fc11996-09-11 13:55:55 +0000456
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000458complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000459{
460 Py_complex div, mod;
461 PyObject *d, *m, *z;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000462 Py_complex a, b;
463 TO_COMPLEX(v, a);
464 TO_COMPLEX(w, b);
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000465
466 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000467 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000468 return NULL;
469
Guido van Rossum96783941997-05-20 18:21:34 +0000470 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000471 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000472 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000474 return NULL;
475 }
476 div.real = floor(div.real); /* Use the floor of the real part. */
477 div.imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000478 mod = c_diff(a, c_prod(b, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 d = PyComplex_FromCComplex(div);
480 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000481 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000482 Py_XDECREF(d);
483 Py_XDECREF(m);
484 return z;
485}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000488complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000489{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000490 Py_complex p;
491 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000492 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000493 Py_complex a, b;
494 TO_COMPLEX(v, a);
495 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000496
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000497 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000499 return NULL;
500 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000501 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000502 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000503 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000504 int_exponent = (long)exponent.real;
505 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000506 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000507 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000508 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509
Guido van Rossum45b83911997-03-14 04:32:50 +0000510 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000511 Py_ADJUST_ERANGE2(p.real, p.imag);
512 if (errno == EDOM) {
513 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000515 return NULL;
516 }
Tim Petersbab22be2002-03-22 02:48:46 +0000517 else if (errno == ERANGE) {
518 PyErr_SetString(PyExc_OverflowError,
519 "complex exponentiaion");
520 return NULL;
521 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000523}
524
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000526complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000527{
528 PyObject *t, *r;
529
530 t = complex_divmod(v, w);
531 if (t != NULL) {
532 r = PyTuple_GET_ITEM(t, 0);
533 Py_INCREF(r);
534 Py_DECREF(t);
535 return r;
536 }
537 return NULL;
538}
539
540static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000541complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000542{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000543 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000544 neg.real = -v->cval.real;
545 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 return PyComplex_FromCComplex(neg);
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_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000551{
Tim Peters2400fa42001-09-12 19:12:49 +0000552 if (PyComplex_CheckExact(v)) {
553 Py_INCREF(v);
554 return (PyObject *)v;
555 }
556 else
557 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000558}
559
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000561complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000562{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000563 double result;
564 PyFPE_START_PROTECT("complex_abs", return 0)
565 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000566 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000568}
569
570static int
Fred Drake4288c802000-07-09 04:36:04 +0000571complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000572{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000573 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000574}
575
576static int
Fred Drake4288c802000-07-09 04:36:04 +0000577complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000578{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000579 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000580 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 if (PyInt_Check(*pw)) {
582 cval.real = (double)PyInt_AsLong(*pw);
583 *pw = PyComplex_FromCComplex(cval);
584 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000585 return 0;
586 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587 else if (PyLong_Check(*pw)) {
588 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000589 if (cval.real == -1.0 && PyErr_Occurred())
590 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000591 *pw = PyComplex_FromCComplex(cval);
592 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000593 return 0;
594 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 else if (PyFloat_Check(*pw)) {
596 cval.real = PyFloat_AsDouble(*pw);
597 *pw = PyComplex_FromCComplex(cval);
598 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000599 return 0;
600 }
Guido van Rossum63805962001-09-19 01:13:10 +0000601 else if (PyComplex_Check(*pw)) {
602 Py_INCREF(*pv);
603 Py_INCREF(*pw);
604 return 0;
605 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000606 return 1; /* Can't do it */
607}
608
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000610complex_richcompare(PyObject *v, PyObject *w, int op)
611{
612 int c;
613 Py_complex i, j;
614 PyObject *res;
615
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000616 c = PyNumber_CoerceEx(&v, &w);
617 if (c < 0)
618 return NULL;
619 if (c > 0) {
620 Py_INCREF(Py_NotImplemented);
621 return Py_NotImplemented;
622 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000623 /* Make sure both arguments are complex. */
624 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000625 Py_DECREF(v);
626 Py_DECREF(w);
627 Py_INCREF(Py_NotImplemented);
628 return Py_NotImplemented;
629 }
630
631 i = ((PyComplexObject *)v)->cval;
632 j = ((PyComplexObject *)w)->cval;
633 Py_DECREF(v);
634 Py_DECREF(w);
635
Guido van Rossum22056422001-09-24 17:52:04 +0000636 if (op != Py_EQ && op != Py_NE) {
637 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000638 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000639 return NULL;
640 }
641
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000642 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
643 res = Py_True;
644 else
645 res = Py_False;
646
647 Py_INCREF(res);
648 return res;
649}
650
651static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000652complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000653{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000654 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000655 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000656 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000657}
658
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000660complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000663 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000664 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000665}
666
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000667static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000668complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000669{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000670 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000671 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000672 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000673}
674
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000675static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000676complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000677{
Guido van Rossum926518b1996-08-19 19:30:45 +0000678 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000679 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000680 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000682}
683
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000684static PyObject *
685complex_getnewargs(PyComplexObject *v)
686{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000687 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000688}
689
Guido van Rossumf9fca921996-01-12 00:47:05 +0000690static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000691 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000692 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000693 {NULL, NULL} /* sentinel */
694};
695
Guido van Rossum6f799372001-09-20 20:46:19 +0000696static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000697 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000698 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000699 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000700 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000701 {0},
702};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000703
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000704static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000705complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000706{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000707 const char *s, *start;
708 char *end;
709 double x=0.0, y=0.0, z;
710 int got_re=0, got_im=0, done=0;
711 int digit_or_dot;
712 int sw_error=0;
713 int sign;
714 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000715#ifdef Py_USING_UNICODE
716 char s_buffer[256];
717#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000718 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000719
720 if (PyString_Check(v)) {
721 s = PyString_AS_STRING(v);
722 len = PyString_GET_SIZE(v);
723 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000724#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000725 else if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000726 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000727 PyErr_SetString(PyExc_ValueError,
728 "complex() literal too large to convert");
729 return NULL;
730 }
731 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
732 PyUnicode_GET_SIZE(v),
733 s_buffer,
734 NULL))
735 return NULL;
736 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000737 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000738 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000739#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000740 else if (PyObject_AsCharBuffer(v, &s, &len)) {
741 PyErr_SetString(PyExc_TypeError,
742 "complex() arg is not a string");
743 return NULL;
744 }
745
746 /* position on first nonblank */
747 start = s;
748 while (*s && isspace(Py_CHARMASK(*s)))
749 s++;
750 if (s[0] == '\0') {
751 PyErr_SetString(PyExc_ValueError,
752 "complex() arg is an empty string");
753 return NULL;
754 }
755
756 z = -1.0;
757 sign = 1;
758 do {
759
760 switch (*s) {
761
762 case '\0':
763 if (s-start != len) {
764 PyErr_SetString(
765 PyExc_ValueError,
766 "complex() arg contains a null byte");
767 return NULL;
768 }
769 if(!done) sw_error=1;
770 break;
771
772 case '-':
773 sign = -1;
774 /* Fallthrough */
775 case '+':
776 if (done) sw_error=1;
777 s++;
778 if ( *s=='\0'||*s=='+'||*s=='-' ||
779 isspace(Py_CHARMASK(*s)) ) sw_error=1;
780 break;
781
782 case 'J':
783 case 'j':
784 if (got_im || done) {
785 sw_error = 1;
786 break;
787 }
788 if (z<0.0) {
789 y=sign;
790 }
791 else{
792 y=sign*z;
793 }
794 got_im=1;
795 s++;
796 if (*s!='+' && *s!='-' )
797 done=1;
798 break;
799
800 default:
801 if (isspace(Py_CHARMASK(*s))) {
802 while (*s && isspace(Py_CHARMASK(*s)))
803 s++;
804 if (s[0] != '\0')
805 sw_error=1;
806 else
807 done = 1;
808 break;
809 }
810 digit_or_dot =
811 (*s=='.' || isdigit(Py_CHARMASK(*s)));
812 if (done||!digit_or_dot) {
813 sw_error=1;
814 break;
815 }
816 errno = 0;
817 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000818 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 PyFPE_END_PROTECT(z)
820 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000821 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000822 "float() out of range: %.150s", s);
823 PyErr_SetString(
824 PyExc_ValueError,
825 buffer);
826 return NULL;
827 }
828 s=end;
829 if (*s=='J' || *s=='j') {
830
831 break;
832 }
833 if (got_re) {
834 sw_error=1;
835 break;
836 }
837
838 /* accept a real part */
839 x=sign*z;
840 got_re=1;
841 if (got_im) done=1;
842 z = -1.0;
843 sign = 1;
844 break;
845
846 } /* end of switch */
847
Tim Peters077f2712002-04-14 22:04:03 +0000848 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000849
850 if (sw_error) {
851 PyErr_SetString(PyExc_ValueError,
852 "complex() arg is a malformed string");
853 return NULL;
854 }
855
856 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000857}
858
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859static PyObject *
860complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
861{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000862 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863 PyNumberMethods *nbr, *nbi = NULL;
864 Py_complex cr, ci;
865 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000866 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000867 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000868
869 r = Py_False;
870 i = NULL;
871 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
872 &r, &i))
873 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000874
Walter Dörwald5ecd6c42003-06-17 20:22:24 +0000875 /* Special-case for single argument that is already complex */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000876 if (PyComplex_CheckExact(r) && i == NULL &&
877 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000878 /* Note that we can't know whether it's safe to return
879 a complex *subclass* instance as-is, hence the restriction
880 to exact complexes here. */
881 Py_INCREF(r);
882 return r;
883 }
Fred Drake526c7a02001-12-13 19:52:22 +0000884 if (PyString_Check(r) || PyUnicode_Check(r)) {
885 if (i != NULL) {
886 PyErr_SetString(PyExc_TypeError,
887 "complex() can't take second arg"
888 " if first is a string");
889 return NULL;
890 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000892 }
893 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
894 PyErr_SetString(PyExc_TypeError,
895 "complex() second arg can't be a string");
896 return NULL;
897 }
Tim Peters2400fa42001-09-12 19:12:49 +0000898
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000899 /* XXX Hack to support classes with __complex__ method */
900 if (complexstr == NULL) {
901 complexstr = PyString_InternFromString("__complex__");
902 if (complexstr == NULL)
903 return NULL;
904 }
905 f = PyObject_GetAttr(r, complexstr);
906 if (f == NULL)
907 PyErr_Clear();
908 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000909 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000910 if (args == NULL)
911 return NULL;
912 r = PyEval_CallObject(f, args);
913 Py_DECREF(args);
914 Py_DECREF(f);
915 if (r == NULL)
916 return NULL;
917 own_r = 1;
918 }
Tim Peters2400fa42001-09-12 19:12:49 +0000919 nbr = r->ob_type->tp_as_number;
920 if (i != NULL)
921 nbi = i->ob_type->tp_as_number;
922 if (nbr == NULL || nbr->nb_float == NULL ||
923 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000924 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000925 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000926 if (own_r) {
927 Py_DECREF(r);
928 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000929 return NULL;
930 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000932 /* Note that if r is of a complex subtype, we're only
933 retaining its real & imag parts here, and the return
934 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000935 cr = ((PyComplexObject*)r)->cval;
936 if (own_r) {
937 Py_DECREF(r);
938 }
939 }
940 else {
941 tmp = PyNumber_Float(r);
942 if (own_r) {
943 Py_DECREF(r);
944 }
945 if (tmp == NULL)
946 return NULL;
947 if (!PyFloat_Check(tmp)) {
948 PyErr_SetString(PyExc_TypeError,
949 "float(r) didn't return a float");
950 Py_DECREF(tmp);
951 return NULL;
952 }
953 cr.real = PyFloat_AsDouble(tmp);
954 Py_DECREF(tmp);
955 cr.imag = 0.0;
956 }
957 if (i == NULL) {
958 ci.real = 0.0;
959 ci.imag = 0.0;
960 }
961 else if (PyComplex_Check(i))
962 ci = ((PyComplexObject*)i)->cval;
963 else {
964 tmp = (*nbi->nb_float)(i);
965 if (tmp == NULL)
966 return NULL;
967 ci.real = PyFloat_AsDouble(tmp);
968 Py_DECREF(tmp);
969 ci.imag = 0.;
970 }
971 cr.real -= ci.imag;
972 cr.imag += ci.real;
973 return complex_subtype_from_c_complex(type, cr);
974}
975
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000976PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000977"complex(real[, imag]) -> complex number\n"
978"\n"
979"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000980"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000981
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000983 (binaryfunc)complex_add, /* nb_add */
984 (binaryfunc)complex_sub, /* nb_subtract */
985 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000986 (binaryfunc)complex_remainder, /* nb_remainder */
987 (binaryfunc)complex_divmod, /* nb_divmod */
988 (ternaryfunc)complex_pow, /* nb_power */
989 (unaryfunc)complex_neg, /* nb_negative */
990 (unaryfunc)complex_pos, /* nb_positive */
991 (unaryfunc)complex_abs, /* nb_absolute */
992 (inquiry)complex_nonzero, /* nb_nonzero */
993 0, /* nb_invert */
994 0, /* nb_lshift */
995 0, /* nb_rshift */
996 0, /* nb_and */
997 0, /* nb_xor */
998 0, /* nb_or */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000999 complex_coerce, /* nb_coerce */
1000 complex_int, /* nb_int */
1001 complex_long, /* nb_long */
1002 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001003 0, /* nb_oct */
1004 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001005 0, /* nb_inplace_add */
1006 0, /* nb_inplace_subtract */
1007 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +00001008 0, /* nb_inplace_remainder */
1009 0, /* nb_inplace_power */
1010 0, /* nb_inplace_lshift */
1011 0, /* nb_inplace_rshift */
1012 0, /* nb_inplace_and */
1013 0, /* nb_inplace_xor */
1014 0, /* nb_inplace_or */
1015 (binaryfunc)complex_int_div, /* nb_floor_divide */
1016 (binaryfunc)complex_div, /* nb_true_divide */
1017 0, /* nb_inplace_floor_divide */
1018 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001019};
1020
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001021PyTypeObject PyComplex_Type = {
1022 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001023 0,
1024 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001025 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001026 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001027 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001028 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001030 0, /* tp_setattr */
1031 0, /* tp_compare */
1032 (reprfunc)complex_repr, /* tp_repr */
1033 &complex_as_number, /* tp_as_number */
1034 0, /* tp_as_sequence */
1035 0, /* tp_as_mapping */
1036 (hashfunc)complex_hash, /* tp_hash */
1037 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001038 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001040 0, /* tp_setattro */
1041 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001042 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1043 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001044 0, /* tp_traverse */
1045 0, /* tp_clear */
1046 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001047 0, /* tp_weaklistoffset */
1048 0, /* tp_iter */
1049 0, /* tp_iternext */
1050 complex_methods, /* tp_methods */
1051 complex_members, /* tp_members */
1052 0, /* tp_getset */
1053 0, /* tp_base */
1054 0, /* tp_dict */
1055 0, /* tp_descr_get */
1056 0, /* tp_descr_set */
1057 0, /* tp_dictoffset */
1058 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001059 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001060 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001061 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001062};
1063
1064#endif