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