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