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