Upload Tizen:Base source
[profile/ivi/python.git] / Objects / complexobject.c
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