1
2 /* Complex object implementation */
3
4 /* Borrows heavily from floatobject.c */
5
6 /* Submitted by Jim Hugunin */
7
8 #include "Python.h"
9 #include "pycore_call.h" // _PyObject_CallNoArgs()
10 #include "pycore_long.h" // _PyLong_GetZero()
11 #include "pycore_object.h" // _PyObject_Init()
12 #include "pycore_pymath.h" // _Py_ADJUST_ERANGE2()
13 #include "structmember.h" // PyMemberDef
14
15
16 /*[clinic input]
17 class complex "PyComplexObject *" "&PyComplex_Type"
18 [clinic start generated code]*/
19 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=819e057d2d10f5ec]*/
20
21 #include "clinic/complexobject.c.h"
22
23 /* elementary operations on complex numbers */
24
25 static Py_complex c_1 = {1., 0.};
26
27 Py_complex
_Py_c_sum(Py_complex a,Py_complex b)28 _Py_c_sum(Py_complex a, Py_complex b)
29 {
30 Py_complex r;
31 r.real = a.real + b.real;
32 r.imag = a.imag + b.imag;
33 return r;
34 }
35
36 Py_complex
_Py_c_diff(Py_complex a,Py_complex b)37 _Py_c_diff(Py_complex a, Py_complex b)
38 {
39 Py_complex r;
40 r.real = a.real - b.real;
41 r.imag = a.imag - b.imag;
42 return r;
43 }
44
45 Py_complex
_Py_c_neg(Py_complex a)46 _Py_c_neg(Py_complex a)
47 {
48 Py_complex r;
49 r.real = -a.real;
50 r.imag = -a.imag;
51 return r;
52 }
53
54 Py_complex
_Py_c_prod(Py_complex a,Py_complex b)55 _Py_c_prod(Py_complex a, Py_complex b)
56 {
57 Py_complex r;
58 r.real = a.real*b.real - a.imag*b.imag;
59 r.imag = a.real*b.imag + a.imag*b.real;
60 return r;
61 }
62
63 /* Avoid bad optimization on Windows ARM64 until the compiler is fixed */
64 #ifdef _M_ARM64
65 #pragma optimize("", off)
66 #endif
67 Py_complex
_Py_c_quot(Py_complex a,Py_complex b)68 _Py_c_quot(Py_complex a, Py_complex b)
69 {
70 /******************************************************************
71 This was the original algorithm. It's grossly prone to spurious
72 overflow and underflow errors. It also merrily divides by 0 despite
73 checking for that(!). The code still serves a doc purpose here, as
74 the algorithm following is a simple by-cases transformation of this
75 one:
76
77 Py_complex r;
78 double d = b.real*b.real + b.imag*b.imag;
79 if (d == 0.)
80 errno = EDOM;
81 r.real = (a.real*b.real + a.imag*b.imag)/d;
82 r.imag = (a.imag*b.real - a.real*b.imag)/d;
83 return r;
84 ******************************************************************/
85
86 /* This algorithm is better, and is pretty obvious: first divide the
87 * numerators and denominator by whichever of {b.real, b.imag} has
88 * larger magnitude. The earliest reference I found was to CACM
89 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
90 * University). As usual, though, we're still ignoring all IEEE
91 * endcases.
92 */
93 Py_complex r; /* the result */
94 const double abs_breal = b.real < 0 ? -b.real : b.real;
95 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
96
97 if (abs_breal >= abs_bimag) {
98 /* divide tops and bottom by b.real */
99 if (abs_breal == 0.0) {
100 errno = EDOM;
101 r.real = r.imag = 0.0;
102 }
103 else {
104 const double ratio = b.imag / b.real;
105 const double denom = b.real + b.imag * ratio;
106 r.real = (a.real + a.imag * ratio) / denom;
107 r.imag = (a.imag - a.real * ratio) / denom;
108 }
109 }
110 else if (abs_bimag >= abs_breal) {
111 /* divide tops and bottom by b.imag */
112 const double ratio = b.real / b.imag;
113 const double denom = b.real * ratio + b.imag;
114 assert(b.imag != 0.0);
115 r.real = (a.real * ratio + a.imag) / denom;
116 r.imag = (a.imag * ratio - a.real) / denom;
117 }
118 else {
119 /* At least one of b.real or b.imag is a NaN */
120 r.real = r.imag = Py_NAN;
121 }
122 return r;
123 }
124 #ifdef _M_ARM64
125 #pragma optimize("", on)
126 #endif
127
128 Py_complex
_Py_c_pow(Py_complex a,Py_complex b)129 _Py_c_pow(Py_complex a, Py_complex b)
130 {
131 Py_complex r;
132 double vabs,len,at,phase;
133 if (b.real == 0. && b.imag == 0.) {
134 r.real = 1.;
135 r.imag = 0.;
136 }
137 else if (a.real == 0. && a.imag == 0.) {
138 if (b.imag != 0. || b.real < 0.)
139 errno = EDOM;
140 r.real = 0.;
141 r.imag = 0.;
142 }
143 else {
144 vabs = hypot(a.real,a.imag);
145 len = pow(vabs,b.real);
146 at = atan2(a.imag, a.real);
147 phase = at*b.real;
148 if (b.imag != 0.0) {
149 len /= exp(at*b.imag);
150 phase += b.imag*log(vabs);
151 }
152 r.real = len*cos(phase);
153 r.imag = len*sin(phase);
154 }
155 return r;
156 }
157
158 static Py_complex
c_powu(Py_complex x,long n)159 c_powu(Py_complex x, long n)
160 {
161 Py_complex r, p;
162 long mask = 1;
163 r = c_1;
164 p = x;
165 while (mask > 0 && n >= mask) {
166 if (n & mask)
167 r = _Py_c_prod(r,p);
168 mask <<= 1;
169 p = _Py_c_prod(p,p);
170 }
171 return r;
172 }
173
174 static Py_complex
c_powi(Py_complex x,long n)175 c_powi(Py_complex x, long n)
176 {
177 if (n > 0)
178 return c_powu(x,n);
179 else
180 return _Py_c_quot(c_1, c_powu(x,-n));
181
182 }
183
184 double
_Py_c_abs(Py_complex z)185 _Py_c_abs(Py_complex z)
186 {
187 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
188 double result;
189
190 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
191 /* C99 rules: if either the real or the imaginary part is an
192 infinity, return infinity, even if the other part is a
193 NaN. */
194 if (Py_IS_INFINITY(z.real)) {
195 result = fabs(z.real);
196 errno = 0;
197 return result;
198 }
199 if (Py_IS_INFINITY(z.imag)) {
200 result = fabs(z.imag);
201 errno = 0;
202 return result;
203 }
204 /* either the real or imaginary part is a NaN,
205 and neither is infinite. Result should be NaN. */
206 return Py_NAN;
207 }
208 result = hypot(z.real, z.imag);
209 if (!Py_IS_FINITE(result))
210 errno = ERANGE;
211 else
212 errno = 0;
213 return result;
214 }
215
216 static PyObject *
complex_subtype_from_c_complex(PyTypeObject * type,Py_complex cval)217 complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
218 {
219 PyObject *op;
220
221 op = type->tp_alloc(type, 0);
222 if (op != NULL)
223 ((PyComplexObject *)op)->cval = cval;
224 return op;
225 }
226
227 PyObject *
PyComplex_FromCComplex(Py_complex cval)228 PyComplex_FromCComplex(Py_complex cval)
229 {
230 /* Inline PyObject_New */
231 PyComplexObject *op = PyObject_Malloc(sizeof(PyComplexObject));
232 if (op == NULL) {
233 return PyErr_NoMemory();
234 }
235 _PyObject_Init((PyObject*)op, &PyComplex_Type);
236 op->cval = cval;
237 return (PyObject *) op;
238 }
239
240 static PyObject *
complex_subtype_from_doubles(PyTypeObject * type,double real,double imag)241 complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
242 {
243 Py_complex c;
244 c.real = real;
245 c.imag = imag;
246 return complex_subtype_from_c_complex(type, c);
247 }
248
249 PyObject *
PyComplex_FromDoubles(double real,double imag)250 PyComplex_FromDoubles(double real, double imag)
251 {
252 Py_complex c;
253 c.real = real;
254 c.imag = imag;
255 return PyComplex_FromCComplex(c);
256 }
257
258 double
PyComplex_RealAsDouble(PyObject * op)259 PyComplex_RealAsDouble(PyObject *op)
260 {
261 if (PyComplex_Check(op)) {
262 return ((PyComplexObject *)op)->cval.real;
263 }
264 else {
265 return PyFloat_AsDouble(op);
266 }
267 }
268
269 double
PyComplex_ImagAsDouble(PyObject * op)270 PyComplex_ImagAsDouble(PyObject *op)
271 {
272 if (PyComplex_Check(op)) {
273 return ((PyComplexObject *)op)->cval.imag;
274 }
275 else {
276 return 0.0;
277 }
278 }
279
280 static PyObject *
try_complex_special_method(PyObject * op)281 try_complex_special_method(PyObject *op)
282 {
283 PyObject *f;
284
285 f = _PyObject_LookupSpecial(op, &_Py_ID(__complex__));
286 if (f) {
287 PyObject *res = _PyObject_CallNoArgs(f);
288 Py_DECREF(f);
289 if (!res || PyComplex_CheckExact(res)) {
290 return res;
291 }
292 if (!PyComplex_Check(res)) {
293 PyErr_Format(PyExc_TypeError,
294 "__complex__ returned non-complex (type %.200s)",
295 Py_TYPE(res)->tp_name);
296 Py_DECREF(res);
297 return NULL;
298 }
299 /* Issue #29894: warn if 'res' not of exact type complex. */
300 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
301 "__complex__ returned non-complex (type %.200s). "
302 "The ability to return an instance of a strict subclass of complex "
303 "is deprecated, and may be removed in a future version of Python.",
304 Py_TYPE(res)->tp_name)) {
305 Py_DECREF(res);
306 return NULL;
307 }
308 return res;
309 }
310 return NULL;
311 }
312
313 Py_complex
PyComplex_AsCComplex(PyObject * op)314 PyComplex_AsCComplex(PyObject *op)
315 {
316 Py_complex cv;
317 PyObject *newop = NULL;
318
319 assert(op);
320 /* If op is already of type PyComplex_Type, return its value */
321 if (PyComplex_Check(op)) {
322 return ((PyComplexObject *)op)->cval;
323 }
324 /* If not, use op's __complex__ method, if it exists */
325
326 /* return -1 on failure */
327 cv.real = -1.;
328 cv.imag = 0.;
329
330 newop = try_complex_special_method(op);
331
332 if (newop) {
333 cv = ((PyComplexObject *)newop)->cval;
334 Py_DECREF(newop);
335 return cv;
336 }
337 else if (PyErr_Occurred()) {
338 return cv;
339 }
340 /* If neither of the above works, interpret op as a float giving the
341 real part of the result, and fill in the imaginary part as 0. */
342 else {
343 /* PyFloat_AsDouble will return -1 on failure */
344 cv.real = PyFloat_AsDouble(op);
345 return cv;
346 }
347 }
348
349 static PyObject *
complex_repr(PyComplexObject * v)350 complex_repr(PyComplexObject *v)
351 {
352 int precision = 0;
353 char format_code = 'r';
354 PyObject *result = NULL;
355
356 /* If these are non-NULL, they'll need to be freed. */
357 char *pre = NULL;
358 char *im = NULL;
359
360 /* These do not need to be freed. re is either an alias
361 for pre or a pointer to a constant. lead and tail
362 are pointers to constants. */
363 const char *re = NULL;
364 const char *lead = "";
365 const char *tail = "";
366
367 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
368 /* Real part is +0: just output the imaginary part and do not
369 include parens. */
370 re = "";
371 im = PyOS_double_to_string(v->cval.imag, format_code,
372 precision, 0, NULL);
373 if (!im) {
374 PyErr_NoMemory();
375 goto done;
376 }
377 } else {
378 /* Format imaginary part with sign, real part without. Include
379 parens in the result. */
380 pre = PyOS_double_to_string(v->cval.real, format_code,
381 precision, 0, NULL);
382 if (!pre) {
383 PyErr_NoMemory();
384 goto done;
385 }
386 re = pre;
387
388 im = PyOS_double_to_string(v->cval.imag, format_code,
389 precision, Py_DTSF_SIGN, NULL);
390 if (!im) {
391 PyErr_NoMemory();
392 goto done;
393 }
394 lead = "(";
395 tail = ")";
396 }
397 result = PyUnicode_FromFormat("%s%s%sj%s", lead, re, im, tail);
398 done:
399 PyMem_Free(im);
400 PyMem_Free(pre);
401
402 return result;
403 }
404
405 static Py_hash_t
complex_hash(PyComplexObject * v)406 complex_hash(PyComplexObject *v)
407 {
408 Py_uhash_t hashreal, hashimag, combined;
409 hashreal = (Py_uhash_t)_Py_HashDouble((PyObject *) v, v->cval.real);
410 if (hashreal == (Py_uhash_t)-1)
411 return -1;
412 hashimag = (Py_uhash_t)_Py_HashDouble((PyObject *)v, v->cval.imag);
413 if (hashimag == (Py_uhash_t)-1)
414 return -1;
415 /* Note: if the imaginary part is 0, hashimag is 0 now,
416 * so the following returns hashreal unchanged. This is
417 * important because numbers of different types that
418 * compare equal must have the same hash value, so that
419 * hash(x + 0*j) must equal hash(x).
420 */
421 combined = hashreal + _PyHASH_IMAG * hashimag;
422 if (combined == (Py_uhash_t)-1)
423 combined = (Py_uhash_t)-2;
424 return (Py_hash_t)combined;
425 }
426
427 /* This macro may return! */
428 #define TO_COMPLEX(obj, c) \
429 if (PyComplex_Check(obj)) \
430 c = ((PyComplexObject *)(obj))->cval; \
431 else if (to_complex(&(obj), &(c)) < 0) \
432 return (obj)
433
434 static int
to_complex(PyObject ** pobj,Py_complex * pc)435 to_complex(PyObject **pobj, Py_complex *pc)
436 {
437 PyObject *obj = *pobj;
438
439 pc->real = pc->imag = 0.0;
440 if (PyLong_Check(obj)) {
441 pc->real = PyLong_AsDouble(obj);
442 if (pc->real == -1.0 && PyErr_Occurred()) {
443 *pobj = NULL;
444 return -1;
445 }
446 return 0;
447 }
448 if (PyFloat_Check(obj)) {
449 pc->real = PyFloat_AsDouble(obj);
450 return 0;
451 }
452 Py_INCREF(Py_NotImplemented);
453 *pobj = Py_NotImplemented;
454 return -1;
455 }
456
457
458 static PyObject *
complex_add(PyObject * v,PyObject * w)459 complex_add(PyObject *v, PyObject *w)
460 {
461 Py_complex result;
462 Py_complex a, b;
463 TO_COMPLEX(v, a);
464 TO_COMPLEX(w, b);
465 result = _Py_c_sum(a, b);
466 return PyComplex_FromCComplex(result);
467 }
468
469 static PyObject *
complex_sub(PyObject * v,PyObject * w)470 complex_sub(PyObject *v, PyObject *w)
471 {
472 Py_complex result;
473 Py_complex a, b;
474 TO_COMPLEX(v, a);
475 TO_COMPLEX(w, b);
476 result = _Py_c_diff(a, b);
477 return PyComplex_FromCComplex(result);
478 }
479
480 static PyObject *
complex_mul(PyObject * v,PyObject * w)481 complex_mul(PyObject *v, PyObject *w)
482 {
483 Py_complex result;
484 Py_complex a, b;
485 TO_COMPLEX(v, a);
486 TO_COMPLEX(w, b);
487 result = _Py_c_prod(a, b);
488 return PyComplex_FromCComplex(result);
489 }
490
491 static PyObject *
complex_div(PyObject * v,PyObject * w)492 complex_div(PyObject *v, PyObject *w)
493 {
494 Py_complex quot;
495 Py_complex a, b;
496 TO_COMPLEX(v, a);
497 TO_COMPLEX(w, b);
498 errno = 0;
499 quot = _Py_c_quot(a, b);
500 if (errno == EDOM) {
501 PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero");
502 return NULL;
503 }
504 return PyComplex_FromCComplex(quot);
505 }
506
507 static PyObject *
complex_pow(PyObject * v,PyObject * w,PyObject * z)508 complex_pow(PyObject *v, PyObject *w, PyObject *z)
509 {
510 Py_complex p;
511 Py_complex a, b;
512 TO_COMPLEX(v, a);
513 TO_COMPLEX(w, b);
514
515 if (z != Py_None) {
516 PyErr_SetString(PyExc_ValueError, "complex modulo");
517 return NULL;
518 }
519 errno = 0;
520 // Check whether the exponent has a small integer value, and if so use
521 // a faster and more accurate algorithm.
522 if (b.imag == 0.0 && b.real == floor(b.real) && fabs(b.real) <= 100.0) {
523 p = c_powi(a, (long)b.real);
524 }
525 else {
526 p = _Py_c_pow(a, b);
527 }
528
529 _Py_ADJUST_ERANGE2(p.real, p.imag);
530 if (errno == EDOM) {
531 PyErr_SetString(PyExc_ZeroDivisionError,
532 "0.0 to a negative or complex power");
533 return NULL;
534 }
535 else if (errno == ERANGE) {
536 PyErr_SetString(PyExc_OverflowError,
537 "complex exponentiation");
538 return NULL;
539 }
540 return PyComplex_FromCComplex(p);
541 }
542
543 static PyObject *
complex_neg(PyComplexObject * v)544 complex_neg(PyComplexObject *v)
545 {
546 Py_complex neg;
547 neg.real = -v->cval.real;
548 neg.imag = -v->cval.imag;
549 return PyComplex_FromCComplex(neg);
550 }
551
552 static PyObject *
complex_pos(PyComplexObject * v)553 complex_pos(PyComplexObject *v)
554 {
555 if (PyComplex_CheckExact(v)) {
556 Py_INCREF(v);
557 return (PyObject *)v;
558 }
559 else
560 return PyComplex_FromCComplex(v->cval);
561 }
562
563 static PyObject *
complex_abs(PyComplexObject * v)564 complex_abs(PyComplexObject *v)
565 {
566 double result;
567
568 result = _Py_c_abs(v->cval);
569
570 if (errno == ERANGE) {
571 PyErr_SetString(PyExc_OverflowError,
572 "absolute value too large");
573 return NULL;
574 }
575 return PyFloat_FromDouble(result);
576 }
577
578 static int
complex_bool(PyComplexObject * v)579 complex_bool(PyComplexObject *v)
580 {
581 return v->cval.real != 0.0 || v->cval.imag != 0.0;
582 }
583
584 static PyObject *
complex_richcompare(PyObject * v,PyObject * w,int op)585 complex_richcompare(PyObject *v, PyObject *w, int op)
586 {
587 PyObject *res;
588 Py_complex i;
589 int equal;
590
591 if (op != Py_EQ && op != Py_NE) {
592 goto Unimplemented;
593 }
594
595 assert(PyComplex_Check(v));
596 TO_COMPLEX(v, i);
597
598 if (PyLong_Check(w)) {
599 /* Check for 0.0 imaginary part first to avoid the rich
600 * comparison when possible.
601 */
602 if (i.imag == 0.0) {
603 PyObject *j, *sub_res;
604 j = PyFloat_FromDouble(i.real);
605 if (j == NULL)
606 return NULL;
607
608 sub_res = PyObject_RichCompare(j, w, op);
609 Py_DECREF(j);
610 return sub_res;
611 }
612 else {
613 equal = 0;
614 }
615 }
616 else if (PyFloat_Check(w)) {
617 equal = (i.real == PyFloat_AsDouble(w) && i.imag == 0.0);
618 }
619 else if (PyComplex_Check(w)) {
620 Py_complex j;
621
622 TO_COMPLEX(w, j);
623 equal = (i.real == j.real && i.imag == j.imag);
624 }
625 else {
626 goto Unimplemented;
627 }
628
629 if (equal == (op == Py_EQ))
630 res = Py_True;
631 else
632 res = Py_False;
633
634 Py_INCREF(res);
635 return res;
636
637 Unimplemented:
638 Py_RETURN_NOTIMPLEMENTED;
639 }
640
641 /*[clinic input]
642 complex.conjugate
643
644 Return the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.
645 [clinic start generated code]*/
646
647 static PyObject *
complex_conjugate_impl(PyComplexObject * self)648 complex_conjugate_impl(PyComplexObject *self)
649 /*[clinic end generated code: output=5059ef162edfc68e input=5fea33e9747ec2c4]*/
650 {
651 Py_complex c = self->cval;
652 c.imag = -c.imag;
653 return PyComplex_FromCComplex(c);
654 }
655
656 /*[clinic input]
657 complex.__getnewargs__
658
659 [clinic start generated code]*/
660
661 static PyObject *
complex___getnewargs___impl(PyComplexObject * self)662 complex___getnewargs___impl(PyComplexObject *self)
663 /*[clinic end generated code: output=689b8206e8728934 input=539543e0a50533d7]*/
664 {
665 Py_complex c = self->cval;
666 return Py_BuildValue("(dd)", c.real, c.imag);
667 }
668
669
670 /*[clinic input]
671 complex.__format__
672
673 format_spec: unicode
674 /
675
676 Convert to a string according to format_spec.
677 [clinic start generated code]*/
678
679 static PyObject *
complex___format___impl(PyComplexObject * self,PyObject * format_spec)680 complex___format___impl(PyComplexObject *self, PyObject *format_spec)
681 /*[clinic end generated code: output=bfcb60df24cafea0 input=014ef5488acbe1d5]*/
682 {
683 _PyUnicodeWriter writer;
684 int ret;
685 _PyUnicodeWriter_Init(&writer);
686 ret = _PyComplex_FormatAdvancedWriter(
687 &writer,
688 (PyObject *)self,
689 format_spec, 0, PyUnicode_GET_LENGTH(format_spec));
690 if (ret == -1) {
691 _PyUnicodeWriter_Dealloc(&writer);
692 return NULL;
693 }
694 return _PyUnicodeWriter_Finish(&writer);
695 }
696
697 /*[clinic input]
698 complex.__complex__
699
700 Convert this value to exact type complex.
701 [clinic start generated code]*/
702
703 static PyObject *
complex___complex___impl(PyComplexObject * self)704 complex___complex___impl(PyComplexObject *self)
705 /*[clinic end generated code: output=e6b35ba3d275dc9c input=3589ada9d27db854]*/
706 {
707 if (PyComplex_CheckExact(self)) {
708 Py_INCREF(self);
709 return (PyObject *)self;
710 }
711 else {
712 return PyComplex_FromCComplex(self->cval);
713 }
714 }
715
716
717 static PyMethodDef complex_methods[] = {
718 COMPLEX_CONJUGATE_METHODDEF
719 COMPLEX___COMPLEX___METHODDEF
720 COMPLEX___GETNEWARGS___METHODDEF
721 COMPLEX___FORMAT___METHODDEF
722 {NULL, NULL} /* sentinel */
723 };
724
725 static PyMemberDef complex_members[] = {
726 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
727 "the real part of a complex number"},
728 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
729 "the imaginary part of a complex number"},
730 {0},
731 };
732
733 static PyObject *
complex_from_string_inner(const char * s,Py_ssize_t len,void * type)734 complex_from_string_inner(const char *s, Py_ssize_t len, void *type)
735 {
736 double x=0.0, y=0.0, z;
737 int got_bracket=0;
738 const char *start;
739 char *end;
740
741 /* position on first nonblank */
742 start = s;
743 while (Py_ISSPACE(*s))
744 s++;
745 if (*s == '(') {
746 /* Skip over possible bracket from repr(). */
747 got_bracket = 1;
748 s++;
749 while (Py_ISSPACE(*s))
750 s++;
751 }
752
753 /* a valid complex string usually takes one of the three forms:
754
755 <float> - real part only
756 <float>j - imaginary part only
757 <float><signed-float>j - real and imaginary parts
758
759 where <float> represents any numeric string that's accepted by the
760 float constructor (including 'nan', 'inf', 'infinity', etc.), and
761 <signed-float> is any string of the form <float> whose first
762 character is '+' or '-'.
763
764 For backwards compatibility, the extra forms
765
766 <float><sign>j
767 <sign>j
768 j
769
770 are also accepted, though support for these forms may be removed from
771 a future version of Python.
772 */
773
774 /* first look for forms starting with <float> */
775 z = PyOS_string_to_double(s, &end, NULL);
776 if (z == -1.0 && PyErr_Occurred()) {
777 if (PyErr_ExceptionMatches(PyExc_ValueError))
778 PyErr_Clear();
779 else
780 return NULL;
781 }
782 if (end != s) {
783 /* all 4 forms starting with <float> land here */
784 s = end;
785 if (*s == '+' || *s == '-') {
786 /* <float><signed-float>j | <float><sign>j */
787 x = z;
788 y = PyOS_string_to_double(s, &end, NULL);
789 if (y == -1.0 && PyErr_Occurred()) {
790 if (PyErr_ExceptionMatches(PyExc_ValueError))
791 PyErr_Clear();
792 else
793 return NULL;
794 }
795 if (end != s)
796 /* <float><signed-float>j */
797 s = end;
798 else {
799 /* <float><sign>j */
800 y = *s == '+' ? 1.0 : -1.0;
801 s++;
802 }
803 if (!(*s == 'j' || *s == 'J'))
804 goto parse_error;
805 s++;
806 }
807 else if (*s == 'j' || *s == 'J') {
808 /* <float>j */
809 s++;
810 y = z;
811 }
812 else
813 /* <float> */
814 x = z;
815 }
816 else {
817 /* not starting with <float>; must be <sign>j or j */
818 if (*s == '+' || *s == '-') {
819 /* <sign>j */
820 y = *s == '+' ? 1.0 : -1.0;
821 s++;
822 }
823 else
824 /* j */
825 y = 1.0;
826 if (!(*s == 'j' || *s == 'J'))
827 goto parse_error;
828 s++;
829 }
830
831 /* trailing whitespace and closing bracket */
832 while (Py_ISSPACE(*s))
833 s++;
834 if (got_bracket) {
835 /* if there was an opening parenthesis, then the corresponding
836 closing parenthesis should be right here */
837 if (*s != ')')
838 goto parse_error;
839 s++;
840 while (Py_ISSPACE(*s))
841 s++;
842 }
843
844 /* we should now be at the end of the string */
845 if (s-start != len)
846 goto parse_error;
847
848 return complex_subtype_from_doubles(_PyType_CAST(type), x, y);
849
850 parse_error:
851 PyErr_SetString(PyExc_ValueError,
852 "complex() arg is a malformed string");
853 return NULL;
854 }
855
856 static PyObject *
complex_subtype_from_string(PyTypeObject * type,PyObject * v)857 complex_subtype_from_string(PyTypeObject *type, PyObject *v)
858 {
859 const char *s;
860 PyObject *s_buffer = NULL, *result = NULL;
861 Py_ssize_t len;
862
863 if (PyUnicode_Check(v)) {
864 s_buffer = _PyUnicode_TransformDecimalAndSpaceToASCII(v);
865 if (s_buffer == NULL) {
866 return NULL;
867 }
868 assert(PyUnicode_IS_ASCII(s_buffer));
869 /* Simply get a pointer to existing ASCII characters. */
870 s = PyUnicode_AsUTF8AndSize(s_buffer, &len);
871 assert(s != NULL);
872 }
873 else {
874 PyErr_Format(PyExc_TypeError,
875 "complex() argument must be a string or a number, not '%.200s'",
876 Py_TYPE(v)->tp_name);
877 return NULL;
878 }
879
880 result = _Py_string_to_number_with_underscores(s, len, "complex", v, type,
881 complex_from_string_inner);
882 Py_DECREF(s_buffer);
883 return result;
884 }
885
886 /*[clinic input]
887 @classmethod
888 complex.__new__ as complex_new
889 real as r: object(c_default="NULL") = 0
890 imag as i: object(c_default="NULL") = 0
891
892 Create a complex number from a real part and an optional imaginary part.
893
894 This is equivalent to (real + imag*1j) where imag defaults to 0.
895 [clinic start generated code]*/
896
897 static PyObject *
complex_new_impl(PyTypeObject * type,PyObject * r,PyObject * i)898 complex_new_impl(PyTypeObject *type, PyObject *r, PyObject *i)
899 /*[clinic end generated code: output=b6c7dd577b537dc1 input=f4c667f2596d4fd1]*/
900 {
901 PyObject *tmp;
902 PyNumberMethods *nbr, *nbi = NULL;
903 Py_complex cr, ci;
904 int own_r = 0;
905 int cr_is_complex = 0;
906 int ci_is_complex = 0;
907
908 if (r == NULL) {
909 r = _PyLong_GetZero();
910 }
911
912 /* Special-case for a single argument when type(arg) is complex. */
913 if (PyComplex_CheckExact(r) && i == NULL &&
914 type == &PyComplex_Type) {
915 /* Note that we can't know whether it's safe to return
916 a complex *subclass* instance as-is, hence the restriction
917 to exact complexes here. If either the input or the
918 output is a complex subclass, it will be handled below
919 as a non-orthogonal vector. */
920 Py_INCREF(r);
921 return r;
922 }
923 if (PyUnicode_Check(r)) {
924 if (i != NULL) {
925 PyErr_SetString(PyExc_TypeError,
926 "complex() can't take second arg"
927 " if first is a string");
928 return NULL;
929 }
930 return complex_subtype_from_string(type, r);
931 }
932 if (i != NULL && PyUnicode_Check(i)) {
933 PyErr_SetString(PyExc_TypeError,
934 "complex() second arg can't be a string");
935 return NULL;
936 }
937
938 tmp = try_complex_special_method(r);
939 if (tmp) {
940 r = tmp;
941 own_r = 1;
942 }
943 else if (PyErr_Occurred()) {
944 return NULL;
945 }
946
947 nbr = Py_TYPE(r)->tp_as_number;
948 if (nbr == NULL ||
949 (nbr->nb_float == NULL && nbr->nb_index == NULL && !PyComplex_Check(r)))
950 {
951 PyErr_Format(PyExc_TypeError,
952 "complex() first argument must be a string or a number, "
953 "not '%.200s'",
954 Py_TYPE(r)->tp_name);
955 if (own_r) {
956 Py_DECREF(r);
957 }
958 return NULL;
959 }
960 if (i != NULL) {
961 nbi = Py_TYPE(i)->tp_as_number;
962 if (nbi == NULL ||
963 (nbi->nb_float == NULL && nbi->nb_index == NULL && !PyComplex_Check(i)))
964 {
965 PyErr_Format(PyExc_TypeError,
966 "complex() second argument must be a number, "
967 "not '%.200s'",
968 Py_TYPE(i)->tp_name);
969 if (own_r) {
970 Py_DECREF(r);
971 }
972 return NULL;
973 }
974 }
975
976 /* If we get this far, then the "real" and "imag" parts should
977 both be treated as numbers, and the constructor should return a
978 complex number equal to (real + imag*1j).
979
980 Note that we do NOT assume the input to already be in canonical
981 form; the "real" and "imag" parts might themselves be complex
982 numbers, which slightly complicates the code below. */
983 if (PyComplex_Check(r)) {
984 /* Note that if r is of a complex subtype, we're only
985 retaining its real & imag parts here, and the return
986 value is (properly) of the builtin complex type. */
987 cr = ((PyComplexObject*)r)->cval;
988 cr_is_complex = 1;
989 if (own_r) {
990 Py_DECREF(r);
991 }
992 }
993 else {
994 /* The "real" part really is entirely real, and contributes
995 nothing in the imaginary direction.
996 Just treat it as a double. */
997 tmp = PyNumber_Float(r);
998 if (own_r) {
999 /* r was a newly created complex number, rather
1000 than the original "real" argument. */
1001 Py_DECREF(r);
1002 }
1003 if (tmp == NULL)
1004 return NULL;
1005 assert(PyFloat_Check(tmp));
1006 cr.real = PyFloat_AsDouble(tmp);
1007 cr.imag = 0.0;
1008 Py_DECREF(tmp);
1009 }
1010 if (i == NULL) {
1011 ci.real = cr.imag;
1012 }
1013 else if (PyComplex_Check(i)) {
1014 ci = ((PyComplexObject*)i)->cval;
1015 ci_is_complex = 1;
1016 } else {
1017 /* The "imag" part really is entirely imaginary, and
1018 contributes nothing in the real direction.
1019 Just treat it as a double. */
1020 tmp = PyNumber_Float(i);
1021 if (tmp == NULL)
1022 return NULL;
1023 ci.real = PyFloat_AsDouble(tmp);
1024 Py_DECREF(tmp);
1025 }
1026 /* If the input was in canonical form, then the "real" and "imag"
1027 parts are real numbers, so that ci.imag and cr.imag are zero.
1028 We need this correction in case they were not real numbers. */
1029
1030 if (ci_is_complex) {
1031 cr.real -= ci.imag;
1032 }
1033 if (cr_is_complex && i != NULL) {
1034 ci.real += cr.imag;
1035 }
1036 return complex_subtype_from_doubles(type, cr.real, ci.real);
1037 }
1038
1039 static PyNumberMethods complex_as_number = {
1040 (binaryfunc)complex_add, /* nb_add */
1041 (binaryfunc)complex_sub, /* nb_subtract */
1042 (binaryfunc)complex_mul, /* nb_multiply */
1043 0, /* nb_remainder */
1044 0, /* nb_divmod */
1045 (ternaryfunc)complex_pow, /* nb_power */
1046 (unaryfunc)complex_neg, /* nb_negative */
1047 (unaryfunc)complex_pos, /* nb_positive */
1048 (unaryfunc)complex_abs, /* nb_absolute */
1049 (inquiry)complex_bool, /* nb_bool */
1050 0, /* nb_invert */
1051 0, /* nb_lshift */
1052 0, /* nb_rshift */
1053 0, /* nb_and */
1054 0, /* nb_xor */
1055 0, /* nb_or */
1056 0, /* nb_int */
1057 0, /* nb_reserved */
1058 0, /* nb_float */
1059 0, /* nb_inplace_add */
1060 0, /* nb_inplace_subtract */
1061 0, /* nb_inplace_multiply*/
1062 0, /* nb_inplace_remainder */
1063 0, /* nb_inplace_power */
1064 0, /* nb_inplace_lshift */
1065 0, /* nb_inplace_rshift */
1066 0, /* nb_inplace_and */
1067 0, /* nb_inplace_xor */
1068 0, /* nb_inplace_or */
1069 0, /* nb_floor_divide */
1070 (binaryfunc)complex_div, /* nb_true_divide */
1071 0, /* nb_inplace_floor_divide */
1072 0, /* nb_inplace_true_divide */
1073 };
1074
1075 PyTypeObject PyComplex_Type = {
1076 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1077 "complex",
1078 sizeof(PyComplexObject),
1079 0,
1080 0, /* tp_dealloc */
1081 0, /* tp_vectorcall_offset */
1082 0, /* tp_getattr */
1083 0, /* tp_setattr */
1084 0, /* tp_as_async */
1085 (reprfunc)complex_repr, /* tp_repr */
1086 &complex_as_number, /* tp_as_number */
1087 0, /* tp_as_sequence */
1088 0, /* tp_as_mapping */
1089 (hashfunc)complex_hash, /* tp_hash */
1090 0, /* tp_call */
1091 0, /* tp_str */
1092 PyObject_GenericGetAttr, /* tp_getattro */
1093 0, /* tp_setattro */
1094 0, /* tp_as_buffer */
1095 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1096 complex_new__doc__, /* tp_doc */
1097 0, /* tp_traverse */
1098 0, /* tp_clear */
1099 complex_richcompare, /* tp_richcompare */
1100 0, /* tp_weaklistoffset */
1101 0, /* tp_iter */
1102 0, /* tp_iternext */
1103 complex_methods, /* tp_methods */
1104 complex_members, /* tp_members */
1105 0, /* tp_getset */
1106 0, /* tp_base */
1107 0, /* tp_dict */
1108 0, /* tp_descr_get */
1109 0, /* tp_descr_set */
1110 0, /* tp_dictoffset */
1111 0, /* tp_init */
1112 PyType_GenericAlloc, /* tp_alloc */
1113 complex_new, /* tp_new */
1114 PyObject_Del, /* tp_free */
1115 };
1116