blob: 6e3d47b62d193740fa0fe089048a137aa203ce19 [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. */
Serhiy Storchakae2f92de2017-11-11 13:06:26 +0200366 const char *re = NULL;
367 const char *lead = "";
368 const 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 *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530698complex_conjugate(PyObject *self, PyObject *Py_UNUSED(ignored))
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 *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +0530712complex_getnewargs(PyComplexObject *v, PyObject *Py_UNUSED(ignored))
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000713{
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 }
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +0200917 assert(PyUnicode_IS_ASCII(s_buffer));
918 /* Simply get a pointer to existing ASCII characters. */
Brett Cannona721aba2016-09-09 14:57:09 -0700919 s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
Serhiy Storchaka9b6c60c2017-11-13 21:23:48 +0200920 assert(s != NULL);
Brett Cannona721aba2016-09-09 14:57:09 -0700921 }
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);
Brett Cannona721aba2016-09-09 14:57:09 -0700931 Py_DECREF(s_buffer);
932 return result;
933}
934
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200935/*[clinic input]
936@classmethod
937complex.__new__ as complex_new
Serhiy Storchakaba85d692017-03-30 09:09:41 +0300938 real as r: object(c_default="_PyLong_Zero") = 0
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200939 imag as i: object(c_default="NULL") = 0
940
941Create a complex number from a real part and an optional imaginary part.
942
943This is equivalent to (real + imag*1j) where imag defaults to 0.
944[clinic start generated code]*/
945
Brett Cannona721aba2016-09-09 14:57:09 -0700946static PyObject *
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200947complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i)
Serhiy Storchakabae68812017-04-05 12:00:42 +0300948/*[clinic end generated code: output=b6c7dd577b537dc1 input=6f6b0bedba29bcb5]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949{
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200950 PyObject *tmp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 PyNumberMethods *nbr, *nbi = NULL;
952 Py_complex cr, ci;
953 int own_r = 0;
954 int cr_is_complex = 0;
955 int ci_is_complex = 0;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 /* Special-case for a single argument when type(arg) is complex. */
958 if (PyComplex_CheckExact(r) && i == NULL &&
959 type == &PyComplex_Type) {
960 /* Note that we can't know whether it's safe to return
961 a complex *subclass* instance as-is, hence the restriction
962 to exact complexes here. If either the input or the
963 output is a complex subclass, it will be handled below
964 as a non-orthogonal vector. */
965 Py_INCREF(r);
966 return r;
967 }
968 if (PyUnicode_Check(r)) {
969 if (i != NULL) {
970 PyErr_SetString(PyExc_TypeError,
971 "complex() can't take second arg"
972 " if first is a string");
973 return NULL;
974 }
975 return complex_subtype_from_string(type, r);
976 }
977 if (i != NULL && PyUnicode_Check(i)) {
978 PyErr_SetString(PyExc_TypeError,
979 "complex() second arg can't be a string");
980 return NULL;
981 }
Tim Peters2400fa42001-09-12 19:12:49 +0000982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 tmp = try_complex_special_method(r);
984 if (tmp) {
985 r = tmp;
986 own_r = 1;
987 }
988 else if (PyErr_Occurred()) {
989 return NULL;
990 }
Benjamin Petersonaea44282010-01-04 01:10:28 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 nbr = r->ob_type->tp_as_number;
Mark Dickinson613f8e52016-09-24 15:26:36 +0100993 if (nbr == NULL || nbr->nb_float == NULL) {
Ezio Melottia5b95992013-11-07 19:18:34 +0200994 PyErr_Format(PyExc_TypeError,
Mark Dickinson613f8e52016-09-24 15:26:36 +0100995 "complex() first argument must be a string or a number, "
996 "not '%.200s'",
997 Py_TYPE(r)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 if (own_r) {
999 Py_DECREF(r);
1000 }
1001 return NULL;
1002 }
Mark Dickinson613f8e52016-09-24 15:26:36 +01001003 if (i != NULL) {
1004 nbi = i->ob_type->tp_as_number;
1005 if (nbi == NULL || nbi->nb_float == NULL) {
1006 PyErr_Format(PyExc_TypeError,
1007 "complex() second argument must be a number, "
1008 "not '%.200s'",
1009 Py_TYPE(i)->tp_name);
1010 if (own_r) {
1011 Py_DECREF(r);
1012 }
1013 return NULL;
1014 }
1015 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 /* If we get this far, then the "real" and "imag" parts should
1018 both be treated as numbers, and the constructor should return a
1019 complex number equal to (real + imag*1j).
Guido van Rossumd8faa362007-04-27 19:54:29 +00001020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 Note that we do NOT assume the input to already be in canonical
1022 form; the "real" and "imag" parts might themselves be complex
1023 numbers, which slightly complicates the code below. */
1024 if (PyComplex_Check(r)) {
1025 /* Note that if r is of a complex subtype, we're only
1026 retaining its real & imag parts here, and the return
1027 value is (properly) of the builtin complex type. */
1028 cr = ((PyComplexObject*)r)->cval;
1029 cr_is_complex = 1;
1030 if (own_r) {
1031 Py_DECREF(r);
1032 }
1033 }
1034 else {
1035 /* The "real" part really is entirely real, and contributes
1036 nothing in the imaginary direction.
1037 Just treat it as a double. */
1038 tmp = PyNumber_Float(r);
1039 if (own_r) {
1040 /* r was a newly created complex number, rather
1041 than the original "real" argument. */
1042 Py_DECREF(r);
1043 }
1044 if (tmp == NULL)
1045 return NULL;
Serhiy Storchaka671079e2017-03-24 21:28:43 +02001046 assert(PyFloat_Check(tmp));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 cr.real = PyFloat_AsDouble(tmp);
Mark Dickinson112ec382017-02-20 20:28:15 +00001048 cr.imag = 0.0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 Py_DECREF(tmp);
1050 }
1051 if (i == NULL) {
Mark Dickinson112ec382017-02-20 20:28:15 +00001052 ci.real = cr.imag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 }
1054 else if (PyComplex_Check(i)) {
1055 ci = ((PyComplexObject*)i)->cval;
1056 ci_is_complex = 1;
1057 } else {
1058 /* The "imag" part really is entirely imaginary, and
1059 contributes nothing in the real direction.
1060 Just treat it as a double. */
1061 tmp = (*nbi->nb_float)(i);
1062 if (tmp == NULL)
1063 return NULL;
1064 ci.real = PyFloat_AsDouble(tmp);
1065 Py_DECREF(tmp);
1066 }
1067 /* If the input was in canonical form, then the "real" and "imag"
1068 parts are real numbers, so that ci.imag and cr.imag are zero.
1069 We need this correction in case they were not real numbers. */
Christian Heimes69a79632007-11-28 10:04:30 +00001070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 if (ci_is_complex) {
1072 cr.real -= ci.imag;
1073 }
Mark Dickinson112ec382017-02-20 20:28:15 +00001074 if (cr_is_complex && i != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 ci.real += cr.imag;
1076 }
1077 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078}
1079
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001080static PyNumberMethods complex_as_number = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 (binaryfunc)complex_add, /* nb_add */
1082 (binaryfunc)complex_sub, /* nb_subtract */
1083 (binaryfunc)complex_mul, /* nb_multiply */
1084 (binaryfunc)complex_remainder, /* nb_remainder */
1085 (binaryfunc)complex_divmod, /* nb_divmod */
1086 (ternaryfunc)complex_pow, /* nb_power */
1087 (unaryfunc)complex_neg, /* nb_negative */
1088 (unaryfunc)complex_pos, /* nb_positive */
1089 (unaryfunc)complex_abs, /* nb_absolute */
1090 (inquiry)complex_bool, /* nb_bool */
1091 0, /* nb_invert */
1092 0, /* nb_lshift */
1093 0, /* nb_rshift */
1094 0, /* nb_and */
1095 0, /* nb_xor */
1096 0, /* nb_or */
1097 complex_int, /* nb_int */
1098 0, /* nb_reserved */
1099 complex_float, /* nb_float */
1100 0, /* nb_inplace_add */
1101 0, /* nb_inplace_subtract */
1102 0, /* nb_inplace_multiply*/
1103 0, /* nb_inplace_remainder */
1104 0, /* nb_inplace_power */
1105 0, /* nb_inplace_lshift */
1106 0, /* nb_inplace_rshift */
1107 0, /* nb_inplace_and */
1108 0, /* nb_inplace_xor */
1109 0, /* nb_inplace_or */
1110 (binaryfunc)complex_int_div, /* nb_floor_divide */
1111 (binaryfunc)complex_div, /* nb_true_divide */
1112 0, /* nb_inplace_floor_divide */
1113 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001114};
1115
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001116PyTypeObject PyComplex_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1118 "complex",
1119 sizeof(PyComplexObject),
1120 0,
1121 complex_dealloc, /* tp_dealloc */
1122 0, /* tp_print */
1123 0, /* tp_getattr */
1124 0, /* tp_setattr */
1125 0, /* tp_reserved */
1126 (reprfunc)complex_repr, /* tp_repr */
1127 &complex_as_number, /* tp_as_number */
1128 0, /* tp_as_sequence */
1129 0, /* tp_as_mapping */
1130 (hashfunc)complex_hash, /* tp_hash */
1131 0, /* tp_call */
Mark Dickinson388122d2010-08-04 20:56:28 +00001132 (reprfunc)complex_repr, /* tp_str */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 PyObject_GenericGetAttr, /* tp_getattro */
1134 0, /* tp_setattro */
1135 0, /* tp_as_buffer */
Serhiy Storchaka18b250f2017-03-19 08:51:07 +02001136 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1137 complex_new__doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 0, /* tp_traverse */
1139 0, /* tp_clear */
1140 complex_richcompare, /* tp_richcompare */
1141 0, /* tp_weaklistoffset */
1142 0, /* tp_iter */
1143 0, /* tp_iternext */
1144 complex_methods, /* tp_methods */
1145 complex_members, /* tp_members */
1146 0, /* tp_getset */
1147 0, /* tp_base */
1148 0, /* tp_dict */
1149 0, /* tp_descr_get */
1150 0, /* tp_descr_set */
1151 0, /* tp_dictoffset */
1152 0, /* tp_init */
1153 PyType_GenericAlloc, /* tp_alloc */
1154 complex_new, /* tp_new */
1155 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001156};