blob: 8e1f4d73a1d760a9e54c79f747fb21bcb5d5c15c [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.) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
278 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
279 strncat(buf, "j", 1);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000280 } else {
281 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000282 /* Format imaginary part with sign, real part without */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
284 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
285 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
286 PyOS_ascii_formatd(im, sizeof(im), 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;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000352 if (PyLong_Check(obj)) {
353 pc->real = PyLong_AsDouble(obj);
354 if (pc->real == -1.0 && PyErr_Occurred()) {
355 *pobj = NULL;
356 return -1;
357 }
358 return 0;
359 }
360 if (PyFloat_Check(obj)) {
361 pc->real = PyFloat_AsDouble(obj);
362 return 0;
363 }
364 Py_INCREF(Py_NotImplemented);
365 *pobj = Py_NotImplemented;
366 return -1;
367}
368
369
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000371complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000372{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000373 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000374 Py_complex a, b;
375 TO_COMPLEX(v, a);
376 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000377 PyFPE_START_PROTECT("complex_add", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000378 result = c_sum(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000379 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000381}
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000384complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000385{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000386 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000387 Py_complex a, b;
388 TO_COMPLEX(v, a);
389 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000390 PyFPE_START_PROTECT("complex_sub", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000391 result = c_diff(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000392 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000394}
395
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000397complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000398{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000399 Py_complex result;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000400 Py_complex a, b;
401 TO_COMPLEX(v, a);
402 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000403 PyFPE_START_PROTECT("complex_mul", return 0)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000404 result = c_prod(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000405 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000407}
408
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000410complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000411{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000412 Py_complex quot;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000413 Py_complex a, b;
414 TO_COMPLEX(v, a);
415 TO_COMPLEX(w, b);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000416 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000417 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000418 quot = c_quot(a, b);
Guido van Rossum45b83911997-03-14 04:32:50 +0000419 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000420 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000422 return NULL;
423 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000425}
426
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000428complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000429{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000430 Py_complex div, mod;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000431 Py_complex a, b;
432 TO_COMPLEX(v, a);
433 TO_COMPLEX(w, b);
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000434
435 if (PyErr_Warn(PyExc_DeprecationWarning,
436 "complex divmod(), // and % are deprecated") < 0)
437 return NULL;
438
Guido van Rossum96783941997-05-20 18:21:34 +0000439 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000440 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000441 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000443 return NULL;
444 }
445 div.real = floor(div.real); /* Use the floor of the real part. */
446 div.imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000447 mod = c_diff(a, c_prod(b, div));
Guido van Rossum3be12e91996-09-12 20:56:18 +0000448
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000450}
451
Guido van Rossumee09fc11996-09-11 13:55:55 +0000452
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000454complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000455{
456 Py_complex div, mod;
457 PyObject *d, *m, *z;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000458 Py_complex a, b;
459 TO_COMPLEX(v, a);
460 TO_COMPLEX(w, b);
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000461
462 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000463 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000464 return NULL;
465
Guido van Rossum96783941997-05-20 18:21:34 +0000466 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000467 div = c_quot(a, b); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000468 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000470 return NULL;
471 }
472 div.real = floor(div.real); /* Use the floor of the real part. */
473 div.imag = 0.0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000474 mod = c_diff(a, c_prod(b, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 d = PyComplex_FromCComplex(div);
476 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000477 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000478 Py_XDECREF(d);
479 Py_XDECREF(m);
480 return z;
481}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000482
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000484complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000485{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000486 Py_complex p;
487 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000488 long int_exponent;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000489 Py_complex a, b;
490 TO_COMPLEX(v, a);
491 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000492
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000493 if (z != Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000495 return NULL;
496 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000497 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000498 errno = 0;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000499 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000500 int_exponent = (long)exponent.real;
501 if (exponent.imag == 0. && exponent.real == int_exponent)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000502 p = c_powi(a, int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000503 else
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000504 p = c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000505
Guido van Rossum45b83911997-03-14 04:32:50 +0000506 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000507 Py_ADJUST_ERANGE2(p.real, p.imag);
508 if (errno == EDOM) {
509 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000511 return NULL;
512 }
Tim Petersbab22be2002-03-22 02:48:46 +0000513 else if (errno == ERANGE) {
514 PyErr_SetString(PyExc_OverflowError,
515 "complex exponentiaion");
516 return NULL;
517 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000519}
520
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000522complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000523{
524 PyObject *t, *r;
525
526 t = complex_divmod(v, w);
527 if (t != NULL) {
528 r = PyTuple_GET_ITEM(t, 0);
529 Py_INCREF(r);
530 Py_DECREF(t);
531 return r;
532 }
533 return NULL;
534}
535
536static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000537complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000538{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000539 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000540 neg.real = -v->cval.real;
541 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000543}
544
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000546complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000547{
Tim Peters2400fa42001-09-12 19:12:49 +0000548 if (PyComplex_CheckExact(v)) {
549 Py_INCREF(v);
550 return (PyObject *)v;
551 }
552 else
553 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000554}
555
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000557complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000558{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000559 double result;
560 PyFPE_START_PROTECT("complex_abs", return 0)
561 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000562 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000564}
565
566static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000567complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000568{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000569 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000570}
571
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000573complex_richcompare(PyObject *v, PyObject *w, int op)
574{
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000575 PyObject *res;
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000576 Py_complex i, j;
577 TO_COMPLEX(v, i);
578 TO_COMPLEX(w, j);
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000579
Guido van Rossum22056422001-09-24 17:52:04 +0000580 if (op != Py_EQ && op != Py_NE) {
Guido van Rossum18a67ba2006-08-21 18:27:07 +0000581 /* XXX Should eventually return NotImplemented */
Guido van Rossum22056422001-09-24 17:52:04 +0000582 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000583 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000584 return NULL;
585 }
586
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000587 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
588 res = Py_True;
589 else
590 res = Py_False;
591
592 Py_INCREF(res);
593 return res;
594}
595
596static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000597complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000598{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000600 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000601 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000602}
603
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000604static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000605complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000606{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000607 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000608 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000609 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000610}
611
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000613complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000614{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000616 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000617 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000618}
619
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000621complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000622{
Guido van Rossum926518b1996-08-19 19:30:45 +0000623 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000625 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000627}
628
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000629static PyObject *
630complex_getnewargs(PyComplexObject *v)
631{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000632 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000633}
634
Guido van Rossumf9fca921996-01-12 00:47:05 +0000635static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000636 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000637 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000638 {NULL, NULL} /* sentinel */
639};
640
Guido van Rossum6f799372001-09-20 20:46:19 +0000641static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000642 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000643 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000644 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000645 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000646 {0},
647};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000648
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000650complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000651{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000652 const char *s, *start;
653 char *end;
654 double x=0.0, y=0.0, z;
655 int got_re=0, got_im=0, done=0;
656 int digit_or_dot;
657 int sw_error=0;
658 int sign;
659 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000660#ifdef Py_USING_UNICODE
661 char s_buffer[256];
662#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000664
665 if (PyString_Check(v)) {
666 s = PyString_AS_STRING(v);
667 len = PyString_GET_SIZE(v);
668 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000669#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000670 else if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000671 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000672 PyErr_SetString(PyExc_ValueError,
673 "complex() literal too large to convert");
674 return NULL;
675 }
676 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
677 PyUnicode_GET_SIZE(v),
678 s_buffer,
679 NULL))
680 return NULL;
681 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000682 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000683 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000684#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685 else if (PyObject_AsCharBuffer(v, &s, &len)) {
686 PyErr_SetString(PyExc_TypeError,
687 "complex() arg is not a string");
688 return NULL;
689 }
690
691 /* position on first nonblank */
692 start = s;
693 while (*s && isspace(Py_CHARMASK(*s)))
694 s++;
695 if (s[0] == '\0') {
696 PyErr_SetString(PyExc_ValueError,
697 "complex() arg is an empty string");
698 return NULL;
699 }
700
701 z = -1.0;
702 sign = 1;
703 do {
704
705 switch (*s) {
706
707 case '\0':
708 if (s-start != len) {
709 PyErr_SetString(
710 PyExc_ValueError,
711 "complex() arg contains a null byte");
712 return NULL;
713 }
714 if(!done) sw_error=1;
715 break;
716
717 case '-':
718 sign = -1;
719 /* Fallthrough */
720 case '+':
721 if (done) sw_error=1;
722 s++;
723 if ( *s=='\0'||*s=='+'||*s=='-' ||
724 isspace(Py_CHARMASK(*s)) ) sw_error=1;
725 break;
726
727 case 'J':
728 case 'j':
729 if (got_im || done) {
730 sw_error = 1;
731 break;
732 }
733 if (z<0.0) {
734 y=sign;
735 }
736 else{
737 y=sign*z;
738 }
739 got_im=1;
740 s++;
741 if (*s!='+' && *s!='-' )
742 done=1;
743 break;
744
745 default:
746 if (isspace(Py_CHARMASK(*s))) {
747 while (*s && isspace(Py_CHARMASK(*s)))
748 s++;
749 if (s[0] != '\0')
750 sw_error=1;
751 else
752 done = 1;
753 break;
754 }
755 digit_or_dot =
756 (*s=='.' || isdigit(Py_CHARMASK(*s)));
757 if (done||!digit_or_dot) {
758 sw_error=1;
759 break;
760 }
761 errno = 0;
762 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000763 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000764 PyFPE_END_PROTECT(z)
765 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000766 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000767 "float() out of range: %.150s", s);
768 PyErr_SetString(
769 PyExc_ValueError,
770 buffer);
771 return NULL;
772 }
773 s=end;
774 if (*s=='J' || *s=='j') {
775
776 break;
777 }
778 if (got_re) {
779 sw_error=1;
780 break;
781 }
782
783 /* accept a real part */
784 x=sign*z;
785 got_re=1;
786 if (got_im) done=1;
787 z = -1.0;
788 sign = 1;
789 break;
790
791 } /* end of switch */
792
Tim Peters077f2712002-04-14 22:04:03 +0000793 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794
795 if (sw_error) {
796 PyErr_SetString(PyExc_ValueError,
797 "complex() arg is a malformed string");
798 return NULL;
799 }
800
801 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000802}
803
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804static PyObject *
805complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
806{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000807 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000808 PyNumberMethods *nbr, *nbi = NULL;
809 Py_complex cr, ci;
810 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000811 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000812 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813
814 r = Py_False;
815 i = NULL;
816 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
817 &r, &i))
818 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000819
Walter Dörwald5ecd6c42003-06-17 20:22:24 +0000820 /* Special-case for single argument that is already complex */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000821 if (PyComplex_CheckExact(r) && i == NULL &&
822 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000823 /* Note that we can't know whether it's safe to return
824 a complex *subclass* instance as-is, hence the restriction
825 to exact complexes here. */
826 Py_INCREF(r);
827 return r;
828 }
Fred Drake526c7a02001-12-13 19:52:22 +0000829 if (PyString_Check(r) || PyUnicode_Check(r)) {
830 if (i != NULL) {
831 PyErr_SetString(PyExc_TypeError,
832 "complex() can't take second arg"
833 " if first is a string");
834 return NULL;
835 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000836 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000837 }
838 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
839 PyErr_SetString(PyExc_TypeError,
840 "complex() second arg can't be a string");
841 return NULL;
842 }
Tim Peters2400fa42001-09-12 19:12:49 +0000843
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000844 /* XXX Hack to support classes with __complex__ method */
845 if (complexstr == NULL) {
846 complexstr = PyString_InternFromString("__complex__");
847 if (complexstr == NULL)
848 return NULL;
849 }
850 f = PyObject_GetAttr(r, complexstr);
851 if (f == NULL)
852 PyErr_Clear();
853 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000854 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000855 if (args == NULL)
856 return NULL;
857 r = PyEval_CallObject(f, args);
858 Py_DECREF(args);
859 Py_DECREF(f);
860 if (r == NULL)
861 return NULL;
862 own_r = 1;
863 }
Tim Peters2400fa42001-09-12 19:12:49 +0000864 nbr = r->ob_type->tp_as_number;
865 if (i != NULL)
866 nbi = i->ob_type->tp_as_number;
867 if (nbr == NULL || nbr->nb_float == NULL ||
868 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000869 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000870 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000871 if (own_r) {
872 Py_DECREF(r);
873 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874 return NULL;
875 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000877 /* Note that if r is of a complex subtype, we're only
878 retaining its real & imag parts here, and the return
879 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000880 cr = ((PyComplexObject*)r)->cval;
881 if (own_r) {
882 Py_DECREF(r);
883 }
884 }
885 else {
886 tmp = PyNumber_Float(r);
887 if (own_r) {
888 Py_DECREF(r);
889 }
890 if (tmp == NULL)
891 return NULL;
892 if (!PyFloat_Check(tmp)) {
893 PyErr_SetString(PyExc_TypeError,
894 "float(r) didn't return a float");
895 Py_DECREF(tmp);
896 return NULL;
897 }
898 cr.real = PyFloat_AsDouble(tmp);
899 Py_DECREF(tmp);
900 cr.imag = 0.0;
901 }
902 if (i == NULL) {
903 ci.real = 0.0;
904 ci.imag = 0.0;
905 }
906 else if (PyComplex_Check(i))
907 ci = ((PyComplexObject*)i)->cval;
908 else {
909 tmp = (*nbi->nb_float)(i);
910 if (tmp == NULL)
911 return NULL;
912 ci.real = PyFloat_AsDouble(tmp);
913 Py_DECREF(tmp);
914 ci.imag = 0.;
915 }
916 cr.real -= ci.imag;
917 cr.imag += ci.real;
918 return complex_subtype_from_c_complex(type, cr);
919}
920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000921PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000922"complex(real[, imag]) -> complex number\n"
923"\n"
924"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000925"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000926
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000927static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000928 (binaryfunc)complex_add, /* nb_add */
929 (binaryfunc)complex_sub, /* nb_subtract */
930 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000931 (binaryfunc)complex_remainder, /* nb_remainder */
932 (binaryfunc)complex_divmod, /* nb_divmod */
933 (ternaryfunc)complex_pow, /* nb_power */
934 (unaryfunc)complex_neg, /* nb_negative */
935 (unaryfunc)complex_pos, /* nb_positive */
936 (unaryfunc)complex_abs, /* nb_absolute */
Jack Diederich4dafcc42006-11-28 19:15:13 +0000937 (inquiry)complex_bool, /* nb_bool */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000938 0, /* nb_invert */
939 0, /* nb_lshift */
940 0, /* nb_rshift */
941 0, /* nb_and */
942 0, /* nb_xor */
943 0, /* nb_or */
Neal Norwitz4886cc32006-08-21 17:06:07 +0000944 (coercion)0, /* nb_coerce */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000945 complex_int, /* nb_int */
946 complex_long, /* nb_long */
947 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000948 0, /* nb_oct */
949 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000950 0, /* nb_inplace_add */
951 0, /* nb_inplace_subtract */
952 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +0000953 0, /* nb_inplace_remainder */
954 0, /* nb_inplace_power */
955 0, /* nb_inplace_lshift */
956 0, /* nb_inplace_rshift */
957 0, /* nb_inplace_and */
958 0, /* nb_inplace_xor */
959 0, /* nb_inplace_or */
960 (binaryfunc)complex_int_div, /* nb_floor_divide */
961 (binaryfunc)complex_div, /* nb_true_divide */
962 0, /* nb_inplace_floor_divide */
963 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000964};
965
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966PyTypeObject PyComplex_Type = {
967 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000968 0,
969 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000971 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000972 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000973 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000975 0, /* tp_setattr */
976 0, /* tp_compare */
977 (reprfunc)complex_repr, /* tp_repr */
978 &complex_as_number, /* tp_as_number */
979 0, /* tp_as_sequence */
980 0, /* tp_as_mapping */
981 (hashfunc)complex_hash, /* tp_hash */
982 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +0000983 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000985 0, /* tp_setattro */
986 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
988 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000989 0, /* tp_traverse */
990 0, /* tp_clear */
991 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000992 0, /* tp_weaklistoffset */
993 0, /* tp_iter */
994 0, /* tp_iternext */
995 complex_methods, /* tp_methods */
996 complex_members, /* tp_members */
997 0, /* tp_getset */
998 0, /* tp_base */
999 0, /* tp_dict */
1000 0, /* tp_descr_get */
1001 0, /* tp_descr_set */
1002 0, /* tp_dictoffset */
1003 0, /* tp_init */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001004 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001005 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001006 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001007};
1008
1009#endif