blob: 634a753cece2e565575f10af18f37a32d51f14d6 [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
Georg Brandl6b50c632006-06-01 08:27:32 +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;
Georg Brandl2b869942007-03-17 16:08:45 +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 }
Georg Brandl2b869942007-03-17 16:08:45 +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 if (PyInstance_Check(op)) {
270 /* this can go away in python 3000 */
271 if (PyObject_HasAttrString(op, "__complex__")) {
272 newop = PyObject_CallMethod(op, "__complex__", NULL);
273 if (!newop)
274 return cv;
275 }
276 /* else try __float__ */
277 } else {
278 PyObject *complexfunc;
279 if (!complex_str) {
280 if (!(complex_str = PyString_FromString("__complex__")))
281 return cv;
282 }
283 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
284 /* complexfunc is a borrowed reference */
285 if (complexfunc) {
286 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
287 if (!newop)
288 return cv;
289 }
290 }
291
292 if (newop) {
293 if (!PyComplex_Check(newop)) {
294 PyErr_SetString(PyExc_TypeError,
295 "__complex__ should return a complex object");
296 Py_DECREF(newop);
297 return cv;
298 }
299 cv = ((PyComplexObject *)newop)->cval;
300 Py_DECREF(newop);
301 return cv;
302 }
303 /* If neither of the above works, interpret op as a float giving the
304 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000305 else {
Georg Brandl2b869942007-03-17 16:08:45 +0000306 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000307 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000308 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000309 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000310}
311
Guido van Rossumf9fca921996-01-12 00:47:05 +0000312static void
Fred Drake4288c802000-07-09 04:36:04 +0000313complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000314{
Guido van Rossum9475a232001-10-05 20:51:39 +0000315 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000316}
317
318
Guido van Rossum363078a1996-05-24 20:45:01 +0000319static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000320complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000321{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000322 char format[32];
323 if (v->cval.real == 0.) {
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000324 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
325 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
326 strncat(buf, "j", 1);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000327 } else {
328 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000329 /* Format imaginary part with sign, real part without */
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000330 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
331 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
332 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
333 PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
Georg Brandlc404ff22005-09-16 06:42:26 +0000334 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000335 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000336}
337
338static int
Fred Drake4288c802000-07-09 04:36:04 +0000339complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000340{
341 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000342 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000343 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Brett Cannon01531592007-09-17 03:28:34 +0000344 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000345 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000346 Py_END_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000347 return 0;
348}
349
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000351complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000352{
353 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000354 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000355 return PyString_FromString(buf);
356}
357
358static PyObject *
359complex_str(PyComplexObject *v)
360{
361 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000362 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000364}
365
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366static long
Fred Drake4288c802000-07-09 04:36:04 +0000367complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000368{
Tim Peters39dce292000-08-15 03:34:48 +0000369 long hashreal, hashimag, combined;
370 hashreal = _Py_HashDouble(v->cval.real);
371 if (hashreal == -1)
372 return -1;
373 hashimag = _Py_HashDouble(v->cval.imag);
374 if (hashimag == -1)
375 return -1;
376 /* Note: if the imaginary part is 0, hashimag is 0 now,
377 * so the following returns hashreal unchanged. This is
378 * important because numbers of different types that
379 * compare equal must have the same hash value, so that
380 * hash(x + 0*j) must equal hash(x).
381 */
382 combined = hashreal + 1000003 * hashimag;
383 if (combined == -1)
384 combined = -2;
385 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000386}
387
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000389complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000390{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000391 Py_complex result;
392 PyFPE_START_PROTECT("complex_add", return 0)
393 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000394 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000396}
397
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000399complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000400{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000401 Py_complex result;
402 PyFPE_START_PROTECT("complex_sub", return 0)
403 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000404 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000406}
407
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000408static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000409complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000410{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000411 Py_complex result;
412 PyFPE_START_PROTECT("complex_mul", return 0)
413 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000414 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000416}
417
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000419complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000420{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000421 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000422 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000423 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000424 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000425 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000426 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000428 return NULL;
429 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000431}
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000434complex_classic_div(PyComplexObject *v, PyComplexObject *w)
435{
436 Py_complex quot;
437
Guido van Rossum1832de42001-09-04 03:51:09 +0000438 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000439 PyErr_Warn(PyExc_DeprecationWarning,
440 "classic complex division") < 0)
441 return NULL;
442
443 PyFPE_START_PROTECT("complex_classic_div", return 0)
444 errno = 0;
445 quot = c_quot(v->cval,w->cval);
446 PyFPE_END_PROTECT(quot)
447 if (errno == EDOM) {
448 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
449 return NULL;
450 }
451 return PyComplex_FromCComplex(quot);
452}
453
454static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000455complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000456{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000457 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000458
459 if (PyErr_Warn(PyExc_DeprecationWarning,
460 "complex divmod(), // and % are deprecated") < 0)
461 return NULL;
462
Guido van Rossum96783941997-05-20 18:21:34 +0000463 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000464 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000465 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000467 return NULL;
468 }
469 div.real = floor(div.real); /* Use the floor of the real part. */
470 div.imag = 0.0;
471 mod = c_diff(v->cval, c_prod(w->cval, div));
472
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000474}
475
Guido van Rossumee09fc11996-09-11 13:55:55 +0000476
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000478complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000479{
480 Py_complex div, mod;
481 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000482
483 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000484 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000485 return NULL;
486
Guido van Rossum96783941997-05-20 18:21:34 +0000487 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000488 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000489 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000491 return NULL;
492 }
493 div.real = floor(div.real); /* Use the floor of the real part. */
494 div.imag = 0.0;
495 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 d = PyComplex_FromCComplex(div);
497 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000498 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000499 Py_XDECREF(d);
500 Py_XDECREF(m);
501 return z;
502}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000503
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000505complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000506{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000507 Py_complex p;
508 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509 long int_exponent;
510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 if ((PyObject *)z!=Py_None) {
512 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000513 return NULL;
514 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000515 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000516 errno = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 exponent = ((PyComplexObject*)w)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000518 int_exponent = (long)exponent.real;
519 if (exponent.imag == 0. && exponent.real == int_exponent)
520 p = c_powi(v->cval,int_exponent);
521 else
522 p = c_pow(v->cval,exponent);
523
Guido van Rossum45b83911997-03-14 04:32:50 +0000524 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000525 Py_ADJUST_ERANGE2(p.real, p.imag);
526 if (errno == EDOM) {
527 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000529 return NULL;
530 }
Tim Petersbab22be2002-03-22 02:48:46 +0000531 else if (errno == ERANGE) {
532 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000533 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000534 return NULL;
535 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000537}
538
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000540complex_int_div(PyComplexObject *v, PyComplexObject *w)
541{
542 PyObject *t, *r;
543
544 t = complex_divmod(v, w);
545 if (t != NULL) {
546 r = PyTuple_GET_ITEM(t, 0);
547 Py_INCREF(r);
548 Py_DECREF(t);
549 return r;
550 }
551 return NULL;
552}
553
554static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000555complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000556{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000557 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000558 neg.real = -v->cval.real;
559 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000561}
562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000564complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000565{
Tim Peters2400fa42001-09-12 19:12:49 +0000566 if (PyComplex_CheckExact(v)) {
567 Py_INCREF(v);
568 return (PyObject *)v;
569 }
570 else
571 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000572}
573
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000575complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000576{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000577 double result;
578 PyFPE_START_PROTECT("complex_abs", return 0)
579 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000580 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000582}
583
584static int
Fred Drake4288c802000-07-09 04:36:04 +0000585complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000586{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000587 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000588}
589
590static int
Fred Drake4288c802000-07-09 04:36:04 +0000591complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000592{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000593 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000594 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 if (PyInt_Check(*pw)) {
596 cval.real = (double)PyInt_AsLong(*pw);
597 *pw = PyComplex_FromCComplex(cval);
598 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000599 return 0;
600 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601 else if (PyLong_Check(*pw)) {
602 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000603 if (cval.real == -1.0 && PyErr_Occurred())
604 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000605 *pw = PyComplex_FromCComplex(cval);
606 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000607 return 0;
608 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 else if (PyFloat_Check(*pw)) {
610 cval.real = PyFloat_AsDouble(*pw);
611 *pw = PyComplex_FromCComplex(cval);
612 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000613 return 0;
614 }
Guido van Rossum63805962001-09-19 01:13:10 +0000615 else if (PyComplex_Check(*pw)) {
616 Py_INCREF(*pv);
617 Py_INCREF(*pw);
618 return 0;
619 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000620 return 1; /* Can't do it */
621}
622
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000624complex_richcompare(PyObject *v, PyObject *w, int op)
625{
626 int c;
627 Py_complex i, j;
628 PyObject *res;
629
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000630 c = PyNumber_CoerceEx(&v, &w);
631 if (c < 0)
632 return NULL;
633 if (c > 0) {
634 Py_INCREF(Py_NotImplemented);
635 return Py_NotImplemented;
636 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000637 /* Make sure both arguments are complex. */
638 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000639 Py_DECREF(v);
640 Py_DECREF(w);
641 Py_INCREF(Py_NotImplemented);
642 return Py_NotImplemented;
643 }
644
645 i = ((PyComplexObject *)v)->cval;
646 j = ((PyComplexObject *)w)->cval;
647 Py_DECREF(v);
648 Py_DECREF(w);
649
Guido van Rossum22056422001-09-24 17:52:04 +0000650 if (op != Py_EQ && op != Py_NE) {
651 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000652 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000653 return NULL;
654 }
655
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000656 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
657 res = Py_True;
658 else
659 res = Py_False;
660
661 Py_INCREF(res);
662 return res;
663}
664
665static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000666complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000667{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000669 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000670 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000671}
672
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000673static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000674complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000675{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000676 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000677 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000678 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000679}
680
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000681static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000682complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000683{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000685 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000686 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000687}
688
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000690complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000691{
Guido van Rossum926518b1996-08-19 19:30:45 +0000692 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000693 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000694 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000695 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000696}
697
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000698static PyObject *
699complex_getnewargs(PyComplexObject *v)
700{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000701 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000702}
703
Guido van Rossumf9fca921996-01-12 00:47:05 +0000704static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000705 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000706 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000707 {NULL, NULL} /* sentinel */
708};
709
Guido van Rossum6f799372001-09-20 20:46:19 +0000710static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000711 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000712 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000713 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000714 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000715 {0},
716};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000717
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000718static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000719complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000720{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721 const char *s, *start;
722 char *end;
723 double x=0.0, y=0.0, z;
Collin Wintere38051d2007-03-09 20:33:07 +0000724 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000725 int digit_or_dot;
726 int sw_error=0;
727 int sign;
728 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000729#ifdef Py_USING_UNICODE
730 char s_buffer[256];
731#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000732 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000733
734 if (PyString_Check(v)) {
735 s = PyString_AS_STRING(v);
736 len = PyString_GET_SIZE(v);
737 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000738#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000739 else if (PyUnicode_Check(v)) {
Skip Montanaro429433b2006-04-18 00:35:43 +0000740 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000741 PyErr_SetString(PyExc_ValueError,
742 "complex() literal too large to convert");
743 return NULL;
744 }
745 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
746 PyUnicode_GET_SIZE(v),
747 s_buffer,
748 NULL))
749 return NULL;
750 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000751 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000752 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000753#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000754 else if (PyObject_AsCharBuffer(v, &s, &len)) {
755 PyErr_SetString(PyExc_TypeError,
756 "complex() arg is not a string");
757 return NULL;
758 }
759
760 /* position on first nonblank */
761 start = s;
762 while (*s && isspace(Py_CHARMASK(*s)))
763 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000764 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000765 PyErr_SetString(PyExc_ValueError,
766 "complex() arg is an empty string");
767 return NULL;
Collin Wintere38051d2007-03-09 20:33:07 +0000768 }
769 if (s[0] == '(') {
770 /* Skip over possible bracket from repr(). */
771 got_bracket = 1;
772 s++;
773 while (*s && isspace(Py_CHARMASK(*s)))
774 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000775 }
776
777 z = -1.0;
778 sign = 1;
779 do {
780
781 switch (*s) {
782
783 case '\0':
784 if (s-start != len) {
785 PyErr_SetString(
786 PyExc_ValueError,
787 "complex() arg contains a null byte");
788 return NULL;
789 }
790 if(!done) sw_error=1;
791 break;
792
Collin Wintere38051d2007-03-09 20:33:07 +0000793 case ')':
794 if (!got_bracket || !(got_re || got_im)) {
795 sw_error=1;
796 break;
797 }
798 got_bracket=0;
799 done=1;
800 s++;
801 while (*s && isspace(Py_CHARMASK(*s)))
802 s++;
803 if (*s) sw_error=1;
804 break;
805
Tim Peters6d6c1a32001-08-02 04:15:00 +0000806 case '-':
807 sign = -1;
808 /* Fallthrough */
809 case '+':
810 if (done) sw_error=1;
811 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000812 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813 isspace(Py_CHARMASK(*s)) ) sw_error=1;
814 break;
815
816 case 'J':
817 case 'j':
818 if (got_im || done) {
819 sw_error = 1;
820 break;
821 }
822 if (z<0.0) {
823 y=sign;
824 }
825 else{
826 y=sign*z;
827 }
828 got_im=1;
829 s++;
830 if (*s!='+' && *s!='-' )
831 done=1;
832 break;
833
834 default:
835 if (isspace(Py_CHARMASK(*s))) {
836 while (*s && isspace(Py_CHARMASK(*s)))
837 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000838 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839 sw_error=1;
840 else
841 done = 1;
842 break;
843 }
844 digit_or_dot =
845 (*s=='.' || isdigit(Py_CHARMASK(*s)));
846 if (done||!digit_or_dot) {
847 sw_error=1;
848 break;
849 }
850 errno = 0;
851 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000852 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853 PyFPE_END_PROTECT(z)
854 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000855 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000856 "float() out of range: %.150s", s);
857 PyErr_SetString(
858 PyExc_ValueError,
859 buffer);
860 return NULL;
861 }
862 s=end;
863 if (*s=='J' || *s=='j') {
864
865 break;
866 }
867 if (got_re) {
868 sw_error=1;
869 break;
870 }
871
872 /* accept a real part */
873 x=sign*z;
874 got_re=1;
875 if (got_im) done=1;
876 z = -1.0;
877 sign = 1;
878 break;
879
880 } /* end of switch */
881
Tim Peters077f2712002-04-14 22:04:03 +0000882 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883
Collin Wintere38051d2007-03-09 20:33:07 +0000884 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000885 PyErr_SetString(PyExc_ValueError,
886 "complex() arg is a malformed string");
887 return NULL;
888 }
889
890 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000891}
892
Tim Peters6d6c1a32001-08-02 04:15:00 +0000893static PyObject *
894complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
895{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000896 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000897 PyNumberMethods *nbr, *nbi = NULL;
898 Py_complex cr, ci;
899 int own_r = 0;
Guido van Rossum715ec182007-11-27 22:38:36 +0000900 int cr_is_complex = 0;
901 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000902 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000903 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000904
905 r = Py_False;
906 i = NULL;
907 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
908 &r, &i))
909 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000910
Georg Brandl8f032cb2007-03-13 07:57:51 +0000911 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000912 if (PyComplex_CheckExact(r) && i == NULL &&
913 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000914 /* Note that we can't know whether it's safe to return
915 a complex *subclass* instance as-is, hence the restriction
Georg Brandl8f032cb2007-03-13 07:57:51 +0000916 to exact complexes here. If either the input or the
917 output is a complex subclass, it will be handled below
918 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000919 Py_INCREF(r);
920 return r;
921 }
Fred Drake526c7a02001-12-13 19:52:22 +0000922 if (PyString_Check(r) || PyUnicode_Check(r)) {
923 if (i != NULL) {
924 PyErr_SetString(PyExc_TypeError,
925 "complex() can't take second arg"
926 " if first is a string");
927 return NULL;
928 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000929 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000930 }
931 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
932 PyErr_SetString(PyExc_TypeError,
933 "complex() second arg can't be a string");
934 return NULL;
935 }
Tim Peters2400fa42001-09-12 19:12:49 +0000936
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000937 /* XXX Hack to support classes with __complex__ method */
938 if (complexstr == NULL) {
939 complexstr = PyString_InternFromString("__complex__");
940 if (complexstr == NULL)
941 return NULL;
942 }
943 f = PyObject_GetAttr(r, complexstr);
944 if (f == NULL)
945 PyErr_Clear();
946 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000947 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000948 if (args == NULL)
949 return NULL;
950 r = PyEval_CallObject(f, args);
951 Py_DECREF(args);
952 Py_DECREF(f);
953 if (r == NULL)
954 return NULL;
955 own_r = 1;
956 }
Tim Peters2400fa42001-09-12 19:12:49 +0000957 nbr = r->ob_type->tp_as_number;
958 if (i != NULL)
959 nbi = i->ob_type->tp_as_number;
960 if (nbr == NULL || nbr->nb_float == NULL ||
961 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000962 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000963 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000964 if (own_r) {
965 Py_DECREF(r);
966 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000967 return NULL;
968 }
Georg Brandl8f032cb2007-03-13 07:57:51 +0000969
970 /* If we get this far, then the "real" and "imag" parts should
971 both be treated as numbers, and the constructor should return a
972 complex number equal to (real + imag*1j).
973
974 Note that we do NOT assume the input to already be in canonical
975 form; the "real" and "imag" parts might themselves be complex
976 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000977 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000978 /* Note that if r is of a complex subtype, we're only
979 retaining its real & imag parts here, and the return
980 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000981 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +0000982 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000983 if (own_r) {
984 Py_DECREF(r);
985 }
986 }
987 else {
Georg Brandl8f032cb2007-03-13 07:57:51 +0000988 /* The "real" part really is entirely real, and contributes
989 nothing in the imaginary direction.
990 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000991 tmp = PyNumber_Float(r);
992 if (own_r) {
Georg Brandl8f032cb2007-03-13 07:57:51 +0000993 /* r was a newly created complex number, rather
994 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995 Py_DECREF(r);
996 }
997 if (tmp == NULL)
998 return NULL;
999 if (!PyFloat_Check(tmp)) {
1000 PyErr_SetString(PyExc_TypeError,
1001 "float(r) didn't return a float");
1002 Py_DECREF(tmp);
1003 return NULL;
1004 }
1005 cr.real = PyFloat_AsDouble(tmp);
Guido van Rossume2272632007-12-03 22:02:10 +00001006 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001007 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008 }
1009 if (i == NULL) {
1010 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001011 }
Guido van Rossum715ec182007-11-27 22:38:36 +00001012 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001014 ci_is_complex = 1;
1015 } else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001016 /* The "imag" part really is entirely imaginary, and
1017 contributes nothing in the real direction.
1018 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001019 tmp = (*nbi->nb_float)(i);
1020 if (tmp == NULL)
1021 return NULL;
1022 ci.real = PyFloat_AsDouble(tmp);
1023 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001024 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001025 /* If the input was in canonical form, then the "real" and "imag"
Guido van Rossum715ec182007-11-27 22:38:36 +00001026 parts are real numbers, so that ci.imag and cr.imag are zero.
Georg Brandl8f032cb2007-03-13 07:57:51 +00001027 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001028
1029 if (ci_is_complex) {
1030 cr.real -= ci.imag;
1031 }
1032 if (cr_is_complex) {
1033 ci.real += cr.imag;
1034 }
1035 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036}
1037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001038PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001039"complex(real[, imag]) -> complex number\n"
1040"\n"
1041"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001042"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001043
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001044static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001045 (binaryfunc)complex_add, /* nb_add */
1046 (binaryfunc)complex_sub, /* nb_subtract */
1047 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +00001048 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001049 (binaryfunc)complex_remainder, /* nb_remainder */
1050 (binaryfunc)complex_divmod, /* nb_divmod */
1051 (ternaryfunc)complex_pow, /* nb_power */
1052 (unaryfunc)complex_neg, /* nb_negative */
1053 (unaryfunc)complex_pos, /* nb_positive */
1054 (unaryfunc)complex_abs, /* nb_absolute */
1055 (inquiry)complex_nonzero, /* nb_nonzero */
1056 0, /* nb_invert */
1057 0, /* nb_lshift */
1058 0, /* nb_rshift */
1059 0, /* nb_and */
1060 0, /* nb_xor */
1061 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +00001062 complex_coerce, /* nb_coerce */
1063 complex_int, /* nb_int */
1064 complex_long, /* nb_long */
1065 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001066 0, /* nb_oct */
1067 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001068 0, /* nb_inplace_add */
1069 0, /* nb_inplace_subtract */
1070 0, /* nb_inplace_multiply*/
1071 0, /* nb_inplace_divide */
1072 0, /* nb_inplace_remainder */
1073 0, /* nb_inplace_power */
1074 0, /* nb_inplace_lshift */
1075 0, /* nb_inplace_rshift */
1076 0, /* nb_inplace_and */
1077 0, /* nb_inplace_xor */
1078 0, /* nb_inplace_or */
1079 (binaryfunc)complex_int_div, /* nb_floor_divide */
1080 (binaryfunc)complex_div, /* nb_true_divide */
1081 0, /* nb_inplace_floor_divide */
1082 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001083};
1084
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001085PyTypeObject PyComplex_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001086 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001087 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001088 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001089 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001090 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001091 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001092 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001093 0, /* tp_setattr */
1094 0, /* tp_compare */
1095 (reprfunc)complex_repr, /* tp_repr */
1096 &complex_as_number, /* tp_as_number */
1097 0, /* tp_as_sequence */
1098 0, /* tp_as_mapping */
1099 (hashfunc)complex_hash, /* tp_hash */
1100 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001101 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001102 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001103 0, /* tp_setattro */
1104 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001105 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1106 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001107 0, /* tp_traverse */
1108 0, /* tp_clear */
1109 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001110 0, /* tp_weaklistoffset */
1111 0, /* tp_iter */
1112 0, /* tp_iternext */
1113 complex_methods, /* tp_methods */
1114 complex_members, /* tp_members */
1115 0, /* tp_getset */
1116 0, /* tp_base */
1117 0, /* tp_dict */
1118 0, /* tp_descr_get */
1119 0, /* tp_descr_set */
1120 0, /* tp_dictoffset */
1121 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001122 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001123 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001124 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001125};
1126
1127#endif