blob: 3bf37ee437f557604b695bc4b149b614df253506 [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
Serhiy Storchaka18b250f2017-03-19 08:51:07 +020011/*[clinic input]
12class complex "PyComplexObject *" "&PyComplex_Type"
13[clinic start generated code]*/
14/*[clinic end generated code: output=da39a3ee5e6b4b0d input=819e057d2d10f5ec]*/
15
16#include "clinic/complexobject.c.h"
17
Guido van Rossumf9fca921996-01-12 00:47:05 +000018/* elementary operations on complex numbers */
19
Guido van Rossum9e720e31996-07-21 02:31:35 +000020static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000021
Tim Peters0f336042001-03-18 08:21:57 +000022Py_complex
Antoine Pitrou1eee8e52014-07-07 18:49:30 -040023_Py_c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000025 Py_complex r;
26 r.real = a.real + b.real;
27 r.imag = a.imag + b.imag;
28 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000029}
30
Tim Peters0f336042001-03-18 08:21:57 +000031Py_complex
Antoine Pitrou1eee8e52014-07-07 18:49:30 -040032_Py_c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034 Py_complex r;
35 r.real = a.real - b.real;
36 r.imag = a.imag - b.imag;
37 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000038}
39
Tim Peters0f336042001-03-18 08:21:57 +000040Py_complex
Antoine Pitrou1eee8e52014-07-07 18:49:30 -040041_Py_c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 Py_complex r;
44 r.real = -a.real;
45 r.imag = -a.imag;
46 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000047}
48
Tim Peters0f336042001-03-18 08:21:57 +000049Py_complex
Antoine Pitrou1eee8e52014-07-07 18:49:30 -040050_Py_c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 Py_complex r;
53 r.real = a.real*b.real - a.imag*b.imag;
54 r.imag = a.real*b.imag + a.imag*b.real;
55 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000056}
57
Tim Peters0f336042001-03-18 08:21:57 +000058Py_complex
Antoine Pitrou1eee8e52014-07-07 18:49:30 -040059_Py_c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 /******************************************************************
62 This was the original algorithm. It's grossly prone to spurious
63 overflow and underflow errors. It also merrily divides by 0 despite
64 checking for that(!). The code still serves a doc purpose here, as
65 the algorithm following is a simple by-cases transformation of this
66 one:
Tim Peters0f336042001-03-18 08:21:57 +000067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 Py_complex r;
69 double d = b.real*b.real + b.imag*b.imag;
70 if (d == 0.)
71 errno = EDOM;
72 r.real = (a.real*b.real + a.imag*b.imag)/d;
73 r.imag = (a.imag*b.real - a.real*b.imag)/d;
74 return r;
75 ******************************************************************/
Tim Peters0f336042001-03-18 08:21:57 +000076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 /* This algorithm is better, and is pretty obvious: first divide the
78 * numerators and denominator by whichever of {b.real, b.imag} has
79 * larger magnitude. The earliest reference I found was to CACM
80 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
81 * University). As usual, though, we're still ignoring all IEEE
82 * endcases.
83 */
84 Py_complex r; /* the result */
85 const double abs_breal = b.real < 0 ? -b.real : b.real;
86 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
Tim Peters0f336042001-03-18 08:21:57 +000087
Antoine Pitrou9086f922014-10-10 23:49:32 +020088 if (abs_breal >= abs_bimag) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 /* divide tops and bottom by b.real */
90 if (abs_breal == 0.0) {
91 errno = EDOM;
92 r.real = r.imag = 0.0;
93 }
94 else {
95 const double ratio = b.imag / b.real;
96 const double denom = b.real + b.imag * ratio;
97 r.real = (a.real + a.imag * ratio) / denom;
98 r.imag = (a.imag - a.real * ratio) / denom;
99 }
100 }
Antoine Pitrou9086f922014-10-10 23:49:32 +0200101 else if (abs_bimag >= abs_breal) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 /* divide tops and bottom by b.imag */
103 const double ratio = b.real / b.imag;
104 const double denom = b.real * ratio + b.imag;
105 assert(b.imag != 0.0);
106 r.real = (a.real * ratio + a.imag) / denom;
107 r.imag = (a.imag * ratio - a.real) / denom;
108 }
Antoine Pitrou9086f922014-10-10 23:49:32 +0200109 else {
110 /* At least one of b.real or b.imag is a NaN */
111 r.real = r.imag = Py_NAN;
112 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000114}
115
Tim Peters0f336042001-03-18 08:21:57 +0000116Py_complex
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400117_Py_c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 Py_complex r;
120 double vabs,len,at,phase;
121 if (b.real == 0. && b.imag == 0.) {
122 r.real = 1.;
123 r.imag = 0.;
124 }
125 else if (a.real == 0. && a.imag == 0.) {
126 if (b.imag != 0. || b.real < 0.)
127 errno = EDOM;
128 r.real = 0.;
129 r.imag = 0.;
130 }
131 else {
132 vabs = hypot(a.real,a.imag);
133 len = pow(vabs,b.real);
134 at = atan2(a.imag, a.real);
135 phase = at*b.real;
136 if (b.imag != 0.0) {
137 len /= exp(at*b.imag);
138 phase += b.imag*log(vabs);
139 }
140 r.real = len*cos(phase);
141 r.imag = len*sin(phase);
142 }
143 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000144}
145
Tim Peters0f336042001-03-18 08:21:57 +0000146static Py_complex
147c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000148{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 Py_complex r, p;
150 long mask = 1;
151 r = c_1;
152 p = x;
153 while (mask > 0 && n >= mask) {
154 if (n & mask)
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400155 r = _Py_c_prod(r,p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 mask <<= 1;
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400157 p = _Py_c_prod(p,p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 }
159 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000160}
161
Tim Peters0f336042001-03-18 08:21:57 +0000162static Py_complex
163c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 if (n > 100 || n < -100) {
168 cn.real = (double) n;
169 cn.imag = 0.;
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400170 return _Py_c_pow(x,cn);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 }
172 else if (n > 0)
173 return c_powu(x,n);
174 else
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400175 return _Py_c_quot(c_1, c_powu(x,-n));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000176
177}
178
Christian Heimes53876d92008-04-19 00:31:39 +0000179double
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400180_Py_c_abs(Py_complex z)
Christian Heimes53876d92008-04-19 00:31:39 +0000181{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
183 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
186 /* C99 rules: if either the real or the imaginary part is an
187 infinity, return infinity, even if the other part is a
188 NaN. */
189 if (Py_IS_INFINITY(z.real)) {
190 result = fabs(z.real);
191 errno = 0;
192 return result;
193 }
194 if (Py_IS_INFINITY(z.imag)) {
195 result = fabs(z.imag);
196 errno = 0;
197 return result;
198 }
199 /* either the real or imaginary part is a NaN,
200 and neither is infinite. Result should be NaN. */
201 return Py_NAN;
202 }
203 result = hypot(z.real, z.imag);
204 if (!Py_IS_FINITE(result))
205 errno = ERANGE;
206 else
207 errno = 0;
208 return result;
Christian Heimes53876d92008-04-19 00:31:39 +0000209}
210
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211static PyObject *
212complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 PyObject *op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 op = type->tp_alloc(type, 0);
217 if (op != NULL)
218 ((PyComplexObject *)op)->cval = cval;
219 return op;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000220}
221
Guido van Rossumf9fca921996-01-12 00:47:05 +0000222PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000223PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000224{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200225 PyComplexObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 /* Inline PyObject_New */
228 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
229 if (op == NULL)
230 return PyErr_NoMemory();
Christian Heimesd3afe782013-12-04 09:27:47 +0100231 (void)PyObject_INIT(op, &PyComplex_Type);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 op->cval = cval;
233 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000234}
235
Tim Peters6d6c1a32001-08-02 04:15:00 +0000236static PyObject *
237complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 Py_complex c;
240 c.real = real;
241 c.imag = imag;
242 return complex_subtype_from_c_complex(type, c);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000243}
244
Guido van Rossumf9fca921996-01-12 00:47:05 +0000245PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000246PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 Py_complex c;
249 c.real = real;
250 c.imag = imag;
251 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000252}
253
254double
Fred Drake4288c802000-07-09 04:36:04 +0000255PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 if (PyComplex_Check(op)) {
258 return ((PyComplexObject *)op)->cval.real;
259 }
260 else {
261 return PyFloat_AsDouble(op);
262 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000263}
264
265double
Fred Drake4288c802000-07-09 04:36:04 +0000266PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 if (PyComplex_Check(op)) {
269 return ((PyComplexObject *)op)->cval.imag;
270 }
271 else {
272 return 0.0;
273 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274}
275
Benjamin Petersonaea44282010-01-04 01:10:28 +0000276static PyObject *
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200277try_complex_special_method(PyObject *op)
278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 PyObject *f;
Benjamin Petersonce798522012-01-22 11:24:29 -0500280 _Py_IDENTIFIER(__complex__);
Benjamin Petersonaea44282010-01-04 01:10:28 +0000281
Benjamin Petersonce798522012-01-22 11:24:29 -0500282 f = _PyObject_LookupSpecial(op, &PyId___complex__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 if (f) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100284 PyObject *res = _PyObject_CallNoArg(f);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 Py_DECREF(f);
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200286 if (!res || PyComplex_CheckExact(res)) {
287 return res;
288 }
289 if (!PyComplex_Check(res)) {
290 PyErr_Format(PyExc_TypeError,
291 "__complex__ returned non-complex (type %.200s)",
292 res->ob_type->tp_name);
293 Py_DECREF(res);
294 return NULL;
295 }
296 /* Issue #29894: warn if 'res' not of exact type complex. */
297 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
298 "__complex__ returned non-complex (type %.200s). "
299 "The ability to return an instance of a strict subclass of complex "
300 "is deprecated, and may be removed in a future version of Python.",
301 res->ob_type->tp_name)) {
Mark Dickinsond20fb822012-11-14 17:08:31 +0000302 Py_DECREF(res);
303 return NULL;
304 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 return res;
306 }
307 return NULL;
Benjamin Petersonaea44282010-01-04 01:10:28 +0000308}
309
Guido van Rossum9e720e31996-07-21 02:31:35 +0000310Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000311PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 Py_complex cv;
314 PyObject *newop = NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 assert(op);
317 /* If op is already of type PyComplex_Type, return its value */
318 if (PyComplex_Check(op)) {
319 return ((PyComplexObject *)op)->cval;
320 }
321 /* If not, use op's __complex__ method, if it exists */
Guido van Rossumd8faa362007-04-27 19:54:29 +0000322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 /* return -1 on failure */
324 cv.real = -1.;
325 cv.imag = 0.;
326
327 newop = try_complex_special_method(op);
328
329 if (newop) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 cv = ((PyComplexObject *)newop)->cval;
331 Py_DECREF(newop);
332 return cv;
333 }
334 else if (PyErr_Occurred()) {
335 return cv;
336 }
337 /* If neither of the above works, interpret op as a float giving the
338 real part of the result, and fill in the imaginary part as 0. */
339 else {
340 /* PyFloat_AsDouble will return -1 on failure */
341 cv.real = PyFloat_AsDouble(op);
342 return cv;
343 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000344}
345
Guido van Rossumf9fca921996-01-12 00:47:05 +0000346static void
Fred Drake4288c802000-07-09 04:36:04 +0000347complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000350}
351
Eric Smith0923d1d2009-04-16 20:16:10 +0000352static PyObject *
Eric Smith70099a12010-12-04 13:27:34 +0000353complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000354{
Eric Smith70099a12010-12-04 13:27:34 +0000355 int precision = 0;
356 char format_code = 'r';
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 PyObject *result = NULL;
Eric Smith0923d1d2009-04-16 20:16:10 +0000358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 /* If these are non-NULL, they'll need to be freed. */
360 char *pre = NULL;
361 char *im = NULL;
Eric Smith0923d1d2009-04-16 20:16:10 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 /* These do not need to be freed. re is either an alias
364 for pre or a pointer to a constant. lead and tail
365 are pointers to constants. */
366 char *re = NULL;
367 char *lead = "";
368 char *tail = "";
Eric Smith0923d1d2009-04-16 20:16:10 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
Eric Smith70099a12010-12-04 13:27:34 +0000371 /* Real part is +0: just output the imaginary part and do not
372 include parens. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 re = "";
374 im = PyOS_double_to_string(v->cval.imag, format_code,
375 precision, 0, NULL);
376 if (!im) {
377 PyErr_NoMemory();
378 goto done;
379 }
380 } else {
Eric Smith70099a12010-12-04 13:27:34 +0000381 /* Format imaginary part with sign, real part without. Include
382 parens in the result. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 pre = PyOS_double_to_string(v->cval.real, format_code,
384 precision, 0, NULL);
385 if (!pre) {
386 PyErr_NoMemory();
387 goto done;
388 }
389 re = pre;
Eric Smith0923d1d2009-04-16 20:16:10 +0000390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 im = PyOS_double_to_string(v->cval.imag, format_code,
392 precision, Py_DTSF_SIGN, NULL);
393 if (!im) {
394 PyErr_NoMemory();
395 goto done;
396 }
397 lead = "(";
398 tail = ")";
399 }
Victor Stinner6ced7c42011-03-21 18:15:42 +0100400 result = PyUnicode_FromFormat("%s%s%sj%s", lead, re, im, tail);
Mark Dickinsonad476da2009-04-23 19:14:16 +0000401 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 PyMem_Free(im);
403 PyMem_Free(pre);
Eric Smith0923d1d2009-04-16 20:16:10 +0000404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 return result;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000406}
407
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000408static Py_hash_t
Fred Drake4288c802000-07-09 04:36:04 +0000409complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000410{
Benjamin Peterson8035bc52010-10-23 16:20:50 +0000411 Py_uhash_t hashreal, hashimag, combined;
412 hashreal = (Py_uhash_t)_Py_HashDouble(v->cval.real);
413 if (hashreal == (Py_uhash_t)-1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 return -1;
Benjamin Peterson8035bc52010-10-23 16:20:50 +0000415 hashimag = (Py_uhash_t)_Py_HashDouble(v->cval.imag);
416 if (hashimag == (Py_uhash_t)-1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 return -1;
418 /* Note: if the imaginary part is 0, hashimag is 0 now,
419 * so the following returns hashreal unchanged. This is
420 * important because numbers of different types that
421 * compare equal must have the same hash value, so that
422 * hash(x + 0*j) must equal hash(x).
423 */
Mark Dickinsondc787d22010-05-23 13:33:13 +0000424 combined = hashreal + _PyHASH_IMAG * hashimag;
Benjamin Peterson8035bc52010-10-23 16:20:50 +0000425 if (combined == (Py_uhash_t)-1)
426 combined = (Py_uhash_t)-2;
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000427 return (Py_hash_t)combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000428}
429
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000430/* This macro may return! */
431#define TO_COMPLEX(obj, c) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 if (PyComplex_Check(obj)) \
433 c = ((PyComplexObject *)(obj))->cval; \
434 else if (to_complex(&(obj), &(c)) < 0) \
435 return (obj)
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000436
437static int
438to_complex(PyObject **pobj, Py_complex *pc)
439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 PyObject *obj = *pobj;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 pc->real = pc->imag = 0.0;
443 if (PyLong_Check(obj)) {
444 pc->real = PyLong_AsDouble(obj);
445 if (pc->real == -1.0 && PyErr_Occurred()) {
446 *pobj = NULL;
447 return -1;
448 }
449 return 0;
450 }
451 if (PyFloat_Check(obj)) {
452 pc->real = PyFloat_AsDouble(obj);
453 return 0;
454 }
455 Py_INCREF(Py_NotImplemented);
456 *pobj = Py_NotImplemented;
457 return -1;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000458}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000460
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000462complex_add(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 Py_complex result;
465 Py_complex a, b;
466 TO_COMPLEX(v, a);
467 TO_COMPLEX(w, b);
468 PyFPE_START_PROTECT("complex_add", return 0)
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400469 result = _Py_c_sum(a, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 PyFPE_END_PROTECT(result)
471 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000472}
473
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000475complex_sub(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 Py_complex result;
478 Py_complex a, b;
479 TO_COMPLEX(v, a);
480 TO_COMPLEX(w, b);
481 PyFPE_START_PROTECT("complex_sub", return 0)
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400482 result = _Py_c_diff(a, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 PyFPE_END_PROTECT(result)
484 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000485}
486
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000488complex_mul(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 Py_complex result;
491 Py_complex a, b;
492 TO_COMPLEX(v, a);
493 TO_COMPLEX(w, b);
494 PyFPE_START_PROTECT("complex_mul", return 0)
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400495 result = _Py_c_prod(a, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 PyFPE_END_PROTECT(result)
497 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000498}
499
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000501complex_div(PyObject *v, PyObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 Py_complex quot;
504 Py_complex a, b;
505 TO_COMPLEX(v, a);
506 TO_COMPLEX(w, b);
507 PyFPE_START_PROTECT("complex_div", return 0)
508 errno = 0;
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400509 quot = _Py_c_quot(a, b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 PyFPE_END_PROTECT(quot)
511 if (errno == EDOM) {
512 PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero");
513 return NULL;
514 }
515 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000516}
517
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000519complex_remainder(PyObject *v, PyObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 PyErr_SetString(PyExc_TypeError,
522 "can't mod complex numbers.");
523 return NULL;
Guido van Rossumee09fc11996-09-11 13:55:55 +0000524}
525
Guido van Rossumee09fc11996-09-11 13:55:55 +0000526
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000528complex_divmod(PyObject *v, PyObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyErr_SetString(PyExc_TypeError,
531 "can't take floor or mod of complex number.");
532 return NULL;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000533}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000534
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000536complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 Py_complex p;
539 Py_complex exponent;
540 long int_exponent;
541 Py_complex a, b;
542 TO_COMPLEX(v, a);
543 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 if (z != Py_None) {
546 PyErr_SetString(PyExc_ValueError, "complex modulo");
547 return NULL;
548 }
549 PyFPE_START_PROTECT("complex_pow", return 0)
550 errno = 0;
551 exponent = b;
552 int_exponent = (long)exponent.real;
553 if (exponent.imag == 0. && exponent.real == int_exponent)
554 p = c_powi(a, int_exponent);
555 else
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400556 p = _Py_c_pow(a, exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 PyFPE_END_PROTECT(p)
559 Py_ADJUST_ERANGE2(p.real, p.imag);
560 if (errno == EDOM) {
561 PyErr_SetString(PyExc_ZeroDivisionError,
562 "0.0 to a negative or complex power");
563 return NULL;
564 }
565 else if (errno == ERANGE) {
566 PyErr_SetString(PyExc_OverflowError,
567 "complex exponentiation");
568 return NULL;
569 }
570 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000571}
572
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000573static PyObject *
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +0000574complex_int_div(PyObject *v, PyObject *w)
Guido van Rossum4668b002001-08-08 05:00:18 +0000575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 PyErr_SetString(PyExc_TypeError,
577 "can't take floor of complex number.");
578 return NULL;
Guido van Rossum4668b002001-08-08 05:00:18 +0000579}
580
581static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000582complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 Py_complex neg;
585 neg.real = -v->cval.real;
586 neg.imag = -v->cval.imag;
587 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000588}
589
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000591complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 if (PyComplex_CheckExact(v)) {
594 Py_INCREF(v);
595 return (PyObject *)v;
596 }
597 else
598 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000599}
600
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000602complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 double result;
Christian Heimes53876d92008-04-19 00:31:39 +0000605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 PyFPE_START_PROTECT("complex_abs", return 0)
Antoine Pitrou1eee8e52014-07-07 18:49:30 -0400607 result = _Py_c_abs(v->cval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 PyFPE_END_PROTECT(result)
Christian Heimes53876d92008-04-19 00:31:39 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 if (errno == ERANGE) {
611 PyErr_SetString(PyExc_OverflowError,
612 "absolute value too large");
613 return NULL;
614 }
615 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000616}
617
618static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000619complex_bool(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000622}
623
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000625complex_richcompare(PyObject *v, PyObject *w, int op)
626{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 PyObject *res;
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000628 Py_complex i;
629 int equal;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 if (op != Py_EQ && op != Py_NE) {
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000632 goto Unimplemented;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 }
Guido van Rossum22056422001-09-24 17:52:04 +0000634
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000635 assert(PyComplex_Check(v));
636 TO_COMPLEX(v, i);
637
638 if (PyLong_Check(w)) {
639 /* Check for 0.0 imaginary part first to avoid the rich
640 * comparison when possible.
641 */
642 if (i.imag == 0.0) {
643 PyObject *j, *sub_res;
644 j = PyFloat_FromDouble(i.real);
645 if (j == NULL)
646 return NULL;
647
648 sub_res = PyObject_RichCompare(j, w, op);
649 Py_DECREF(j);
650 return sub_res;
651 }
652 else {
653 equal = 0;
654 }
655 }
656 else if (PyFloat_Check(w)) {
657 equal = (i.real == PyFloat_AsDouble(w) && i.imag == 0.0);
658 }
659 else if (PyComplex_Check(w)) {
660 Py_complex j;
661
662 TO_COMPLEX(w, j);
663 equal = (i.real == j.real && i.imag == j.imag);
664 }
665 else {
666 goto Unimplemented;
667 }
668
669 if (equal == (op == Py_EQ))
670 res = Py_True;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 else
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000672 res = Py_False;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 Py_INCREF(res);
675 return res;
Mark Dickinsoncc6a9822010-05-21 14:55:26 +0000676
677Unimplemented:
Brian Curtindfc80e32011-08-10 20:28:54 -0500678 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000679}
680
681static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000682complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 PyErr_SetString(PyExc_TypeError,
685 "can't convert complex to int");
686 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000687}
688
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000690complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 PyErr_SetString(PyExc_TypeError,
693 "can't convert complex to float");
694 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000695}
696
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000697static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000698complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 Py_complex c;
701 c = ((PyComplexObject *)self)->cval;
702 c.imag = -c.imag;
703 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000704}
705
Guido van Rossum46334cd2007-08-01 17:43:15 +0000706PyDoc_STRVAR(complex_conjugate_doc,
707"complex.conjugate() -> complex\n"
708"\n"
Ezio Melotti488d2442013-10-06 00:39:18 +0300709"Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
Guido van Rossum46334cd2007-08-01 17:43:15 +0000710
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000711static PyObject *
712complex_getnewargs(PyComplexObject *v)
713{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 Py_complex c = v->cval;
715 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000716}
717
Eric Smith58a42242009-04-30 01:00:33 +0000718PyDoc_STRVAR(complex__format__doc,
719"complex.__format__() -> str\n"
720"\n"
Ezio Melotti488d2442013-10-06 00:39:18 +0300721"Convert to a string according to format_spec.");
Eric Smith58a42242009-04-30 01:00:33 +0000722
723static PyObject *
724complex__format__(PyObject* self, PyObject* args)
725{
726 PyObject *format_spec;
Victor Stinnerd3f08822012-05-29 12:57:52 +0200727 _PyUnicodeWriter writer;
728 int ret;
Eric Smith58a42242009-04-30 01:00:33 +0000729
730 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
Victor Stinnerd3f08822012-05-29 12:57:52 +0200731 return NULL;
732
Victor Stinner8f674cc2013-04-17 23:02:17 +0200733 _PyUnicodeWriter_Init(&writer);
Victor Stinnerd3f08822012-05-29 12:57:52 +0200734 ret = _PyComplex_FormatAdvancedWriter(
735 &writer,
736 self,
737 format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
738 if (ret == -1) {
739 _PyUnicodeWriter_Dealloc(&writer);
740 return NULL;
741 }
742 return _PyUnicodeWriter_Finish(&writer);
Eric Smith58a42242009-04-30 01:00:33 +0000743}
744
Christian Heimes53876d92008-04-19 00:31:39 +0000745#if 0
746static PyObject *
747complex_is_finite(PyObject *self)
748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 Py_complex c;
750 c = ((PyComplexObject *)self)->cval;
751 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
752 Py_IS_FINITE(c.imag)));
Christian Heimes53876d92008-04-19 00:31:39 +0000753}
754
755PyDoc_STRVAR(complex_is_finite_doc,
756"complex.is_finite() -> bool\n"
757"\n"
758"Returns True if the real and the imaginary part is finite.");
759#endif
760
Guido van Rossumf9fca921996-01-12 00:47:05 +0000761static PyMethodDef complex_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
763 complex_conjugate_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000764#if 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
766 complex_is_finite_doc},
Christian Heimes53876d92008-04-19 00:31:39 +0000767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
769 {"__format__", (PyCFunction)complex__format__,
770 METH_VARARGS, complex__format__doc},
771 {NULL, NULL} /* sentinel */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000772};
773
Guido van Rossum6f799372001-09-20 20:46:19 +0000774static PyMemberDef complex_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
776 "the real part of a complex number"},
777 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
778 "the imaginary part of a complex number"},
779 {0},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000780};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000781
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -0700783complex_from_string_inner(const char *s, Py_ssize_t len, void *type)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 double x=0.0, y=0.0, z;
786 int got_bracket=0;
Brett Cannona721aba2016-09-09 14:57:09 -0700787 const char *start;
788 char *end;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 /* position on first nonblank */
791 start = s;
792 while (Py_ISSPACE(*s))
793 s++;
794 if (*s == '(') {
795 /* Skip over possible bracket from repr(). */
796 got_bracket = 1;
797 s++;
798 while (Py_ISSPACE(*s))
799 s++;
800 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 /* a valid complex string usually takes one of the three forms:
Mark Dickinson6649fa42009-04-24 13:25:20 +0000803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 <float> - real part only
805 <float>j - imaginary part only
806 <float><signed-float>j - real and imaginary parts
Mark Dickinson6649fa42009-04-24 13:25:20 +0000807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 where <float> represents any numeric string that's accepted by the
809 float constructor (including 'nan', 'inf', 'infinity', etc.), and
810 <signed-float> is any string of the form <float> whose first
811 character is '+' or '-'.
Mark Dickinson6649fa42009-04-24 13:25:20 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 For backwards compatibility, the extra forms
Mark Dickinson6649fa42009-04-24 13:25:20 +0000814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 <float><sign>j
816 <sign>j
817 j
Mark Dickinson6649fa42009-04-24 13:25:20 +0000818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 are also accepted, though support for these forms may be removed from
820 a future version of Python.
821 */
Mark Dickinson6649fa42009-04-24 13:25:20 +0000822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 /* first look for forms starting with <float> */
824 z = PyOS_string_to_double(s, &end, NULL);
825 if (z == -1.0 && PyErr_Occurred()) {
826 if (PyErr_ExceptionMatches(PyExc_ValueError))
827 PyErr_Clear();
828 else
Brett Cannona721aba2016-09-09 14:57:09 -0700829 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 }
831 if (end != s) {
832 /* all 4 forms starting with <float> land here */
833 s = end;
834 if (*s == '+' || *s == '-') {
835 /* <float><signed-float>j | <float><sign>j */
836 x = z;
837 y = PyOS_string_to_double(s, &end, NULL);
838 if (y == -1.0 && PyErr_Occurred()) {
839 if (PyErr_ExceptionMatches(PyExc_ValueError))
840 PyErr_Clear();
841 else
Brett Cannona721aba2016-09-09 14:57:09 -0700842 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 }
844 if (end != s)
845 /* <float><signed-float>j */
846 s = end;
847 else {
848 /* <float><sign>j */
849 y = *s == '+' ? 1.0 : -1.0;
850 s++;
851 }
852 if (!(*s == 'j' || *s == 'J'))
853 goto parse_error;
854 s++;
855 }
856 else if (*s == 'j' || *s == 'J') {
857 /* <float>j */
858 s++;
859 y = z;
860 }
861 else
862 /* <float> */
863 x = z;
864 }
865 else {
866 /* not starting with <float>; must be <sign>j or j */
867 if (*s == '+' || *s == '-') {
868 /* <sign>j */
869 y = *s == '+' ? 1.0 : -1.0;
870 s++;
871 }
872 else
873 /* j */
874 y = 1.0;
875 if (!(*s == 'j' || *s == 'J'))
876 goto parse_error;
877 s++;
878 }
Mark Dickinsonad476da2009-04-23 19:14:16 +0000879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 /* trailing whitespace and closing bracket */
881 while (Py_ISSPACE(*s))
882 s++;
883 if (got_bracket) {
884 /* if there was an opening parenthesis, then the corresponding
885 closing parenthesis should be right here */
886 if (*s != ')')
887 goto parse_error;
888 s++;
889 while (Py_ISSPACE(*s))
890 s++;
891 }
Mark Dickinson6649fa42009-04-24 13:25:20 +0000892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 /* we should now be at the end of the string */
894 if (s-start != len)
895 goto parse_error;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000896
Brett Cannona721aba2016-09-09 14:57:09 -0700897 return complex_subtype_from_doubles((PyTypeObject *)type, x, y);
Mark Dickinsonad476da2009-04-23 19:14:16 +0000898
Mark Dickinson6649fa42009-04-24 13:25:20 +0000899 parse_error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 PyErr_SetString(PyExc_ValueError,
901 "complex() arg is a malformed string");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000903}
904
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905static PyObject *
Brett Cannona721aba2016-09-09 14:57:09 -0700906complex_subtype_from_string(PyTypeObject *type, PyObject *v)
907{
908 const char *s;
909 PyObject *s_buffer = NULL, *result = NULL;
910 Py_ssize_t len;
911
912 if (PyUnicode_Check(v)) {
913 s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
914 if (s_buffer == NULL) {
915 return NULL;
916 }
917 s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
918 if (s == NULL) {
919 goto exit;
920 }
921 }
922 else {
923 PyErr_Format(PyExc_TypeError,
924 "complex() argument must be a string or a number, not '%.200s'",
925 Py_TYPE(v)->tp_name);
926 return NULL;
927 }
928
929 result = _Py_string_to_number_with_underscores(s, len, "complex", v, type,
930 complex_from_string_inner);
931 exit:
932 Py_DECREF(s_buffer);
933 return result;
934}
935
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200936/*[clinic input]
937@classmethod
938complex.__new__ as complex_new
Serhiy Storchakaba85d692017-03-30 09:09:41 +0300939 real as r: object(c_default="_PyLong_Zero") = 0
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200940 imag as i: object(c_default="NULL") = 0
941
942Create a complex number from a real part and an optional imaginary part.
943
944This is equivalent to (real + imag*1j) where imag defaults to 0.
945[clinic start generated code]*/
946
Brett Cannona721aba2016-09-09 14:57:09 -0700947static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200948complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i)
Serhiy Storchakabae68812017-04-05 12:00:42 +0300949/*[clinic end generated code: output=b6c7dd577b537dc1 input=6f6b0bedba29bcb5]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +0000950{
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200951 PyObject *tmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 PyNumberMethods *nbr, *nbi = NULL;
953 Py_complex cr, ci;
954 int own_r = 0;
955 int cr_is_complex = 0;
956 int ci_is_complex = 0;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 /* Special-case for a single argument when type(arg) is complex. */
959 if (PyComplex_CheckExact(r) && i == NULL &&
960 type == &PyComplex_Type) {
961 /* Note that we can't know whether it's safe to return
962 a complex *subclass* instance as-is, hence the restriction
963 to exact complexes here. If either the input or the
964 output is a complex subclass, it will be handled below
965 as a non-orthogonal vector. */
966 Py_INCREF(r);
967 return r;
968 }
969 if (PyUnicode_Check(r)) {
970 if (i != NULL) {
971 PyErr_SetString(PyExc_TypeError,
972 "complex() can't take second arg"
973 " if first is a string");
974 return NULL;
975 }
976 return complex_subtype_from_string(type, r);
977 }
978 if (i != NULL && PyUnicode_Check(i)) {
979 PyErr_SetString(PyExc_TypeError,
980 "complex() second arg can't be a string");
981 return NULL;
982 }
Tim Peters2400fa42001-09-12 19:12:49 +0000983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 tmp = try_complex_special_method(r);
985 if (tmp) {
986 r = tmp;
987 own_r = 1;
988 }
989 else if (PyErr_Occurred()) {
990 return NULL;
991 }
Benjamin Petersonaea44282010-01-04 01:10:28 +0000992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 nbr = r->ob_type->tp_as_number;
Mark Dickinson613f8e52016-09-24 15:26:36 +0100994 if (nbr == NULL || nbr->nb_float == NULL) {
Ezio Melottia5b95992013-11-07 19:18:34 +0200995 PyErr_Format(PyExc_TypeError,
Mark Dickinson613f8e52016-09-24 15:26:36 +0100996 "complex() first argument must be a string or a number, "
997 "not '%.200s'",
998 Py_TYPE(r)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 if (own_r) {
1000 Py_DECREF(r);
1001 }
1002 return NULL;
1003 }
Mark Dickinson613f8e52016-09-24 15:26:36 +01001004 if (i != NULL) {
1005 nbi = i->ob_type->tp_as_number;
1006 if (nbi == NULL || nbi->nb_float == NULL) {
1007 PyErr_Format(PyExc_TypeError,
1008 "complex() second argument must be a number, "
1009 "not '%.200s'",
1010 Py_TYPE(i)->tp_name);
1011 if (own_r) {
1012 Py_DECREF(r);
1013 }
1014 return NULL;
1015 }
1016 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 /* If we get this far, then the "real" and "imag" parts should
1019 both be treated as numbers, and the constructor should return a
1020 complex number equal to (real + imag*1j).
Guido van Rossumd8faa362007-04-27 19:54:29 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 Note that we do NOT assume the input to already be in canonical
1023 form; the "real" and "imag" parts might themselves be complex
1024 numbers, which slightly complicates the code below. */
1025 if (PyComplex_Check(r)) {
1026 /* Note that if r is of a complex subtype, we're only
1027 retaining its real & imag parts here, and the return
1028 value is (properly) of the builtin complex type. */
1029 cr = ((PyComplexObject*)r)->cval;
1030 cr_is_complex = 1;
1031 if (own_r) {
1032 Py_DECREF(r);
1033 }
1034 }
1035 else {
1036 /* The "real" part really is entirely real, and contributes
1037 nothing in the imaginary direction.
1038 Just treat it as a double. */
1039 tmp = PyNumber_Float(r);
1040 if (own_r) {
1041 /* r was a newly created complex number, rather
1042 than the original "real" argument. */
1043 Py_DECREF(r);
1044 }
1045 if (tmp == NULL)
1046 return NULL;
Serhiy Storchaka671079e2017-03-24 21:28:43 +02001047 assert(PyFloat_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 cr.real = PyFloat_AsDouble(tmp);
Mark Dickinson112ec382017-02-20 20:28:15 +00001049 cr.imag = 0.0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 Py_DECREF(tmp);
1051 }
1052 if (i == NULL) {
Mark Dickinson112ec382017-02-20 20:28:15 +00001053 ci.real = cr.imag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 }
1055 else if (PyComplex_Check(i)) {
1056 ci = ((PyComplexObject*)i)->cval;
1057 ci_is_complex = 1;
1058 } else {
1059 /* The "imag" part really is entirely imaginary, and
1060 contributes nothing in the real direction.
1061 Just treat it as a double. */
1062 tmp = (*nbi->nb_float)(i);
1063 if (tmp == NULL)
1064 return NULL;
1065 ci.real = PyFloat_AsDouble(tmp);
1066 Py_DECREF(tmp);
1067 }
1068 /* If the input was in canonical form, then the "real" and "imag"
1069 parts are real numbers, so that ci.imag and cr.imag are zero.
1070 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 if (ci_is_complex) {
1073 cr.real -= ci.imag;
1074 }
Mark Dickinson112ec382017-02-20 20:28:15 +00001075 if (cr_is_complex && i != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 ci.real += cr.imag;
1077 }
1078 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001079}
1080
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001081static PyNumberMethods complex_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 (binaryfunc)complex_add, /* nb_add */
1083 (binaryfunc)complex_sub, /* nb_subtract */
1084 (binaryfunc)complex_mul, /* nb_multiply */
1085 (binaryfunc)complex_remainder, /* nb_remainder */
1086 (binaryfunc)complex_divmod, /* nb_divmod */
1087 (ternaryfunc)complex_pow, /* nb_power */
1088 (unaryfunc)complex_neg, /* nb_negative */
1089 (unaryfunc)complex_pos, /* nb_positive */
1090 (unaryfunc)complex_abs, /* nb_absolute */
1091 (inquiry)complex_bool, /* nb_bool */
1092 0, /* nb_invert */
1093 0, /* nb_lshift */
1094 0, /* nb_rshift */
1095 0, /* nb_and */
1096 0, /* nb_xor */
1097 0, /* nb_or */
1098 complex_int, /* nb_int */
1099 0, /* nb_reserved */
1100 complex_float, /* nb_float */
1101 0, /* nb_inplace_add */
1102 0, /* nb_inplace_subtract */
1103 0, /* nb_inplace_multiply*/
1104 0, /* nb_inplace_remainder */
1105 0, /* nb_inplace_power */
1106 0, /* nb_inplace_lshift */
1107 0, /* nb_inplace_rshift */
1108 0, /* nb_inplace_and */
1109 0, /* nb_inplace_xor */
1110 0, /* nb_inplace_or */
1111 (binaryfunc)complex_int_div, /* nb_floor_divide */
1112 (binaryfunc)complex_div, /* nb_true_divide */
1113 0, /* nb_inplace_floor_divide */
1114 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001115};
1116
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001117PyTypeObject PyComplex_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1119 "complex",
1120 sizeof(PyComplexObject),
1121 0,
1122 complex_dealloc, /* tp_dealloc */
1123 0, /* tp_print */
1124 0, /* tp_getattr */
1125 0, /* tp_setattr */
1126 0, /* tp_reserved */
1127 (reprfunc)complex_repr, /* tp_repr */
1128 &complex_as_number, /* tp_as_number */
1129 0, /* tp_as_sequence */
1130 0, /* tp_as_mapping */
1131 (hashfunc)complex_hash, /* tp_hash */
1132 0, /* tp_call */
Mark Dickinson388122d2010-08-04 20:56:28 +00001133 (reprfunc)complex_repr, /* tp_str */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 PyObject_GenericGetAttr, /* tp_getattro */
1135 0, /* tp_setattro */
1136 0, /* tp_as_buffer */
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001137 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1138 complex_new__doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 0, /* tp_traverse */
1140 0, /* tp_clear */
1141 complex_richcompare, /* tp_richcompare */
1142 0, /* tp_weaklistoffset */
1143 0, /* tp_iter */
1144 0, /* tp_iternext */
1145 complex_methods, /* tp_methods */
1146 complex_members, /* tp_members */
1147 0, /* tp_getset */
1148 0, /* tp_base */
1149 0, /* tp_dict */
1150 0, /* tp_descr_get */
1151 0, /* tp_descr_set */
1152 0, /* tp_dictoffset */
1153 0, /* tp_init */
1154 PyType_GenericAlloc, /* tp_alloc */
1155 complex_new, /* tp_new */
1156 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001157};