2 /* Complex object implementation */
4 /* Borrows heavily from floatobject.c */
6 /* Submitted by Jim Hugunin */
8 #ifndef WITHOUT_COMPLEX
11 #include "structmember.h"
13 /* Precisions used by repr() and str(), respectively.
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
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.
29 /* elementary operations on complex numbers */
31 static Py_complex c_1
= {1., 0.};
34 c_sum(Py_complex a
, Py_complex b
)
37 r
.real
= a
.real
+ b
.real
;
38 r
.imag
= a
.imag
+ b
.imag
;
43 c_diff(Py_complex a
, Py_complex b
)
46 r
.real
= a
.real
- b
.real
;
47 r
.imag
= a
.imag
- b
.imag
;
61 c_prod(Py_complex a
, Py_complex b
)
64 r
.real
= a
.real
*b
.real
- a
.imag
*b
.imag
;
65 r
.imag
= a
.real
*b
.imag
+ a
.imag
*b
.real
;
70 c_quot(Py_complex a
, Py_complex b
)
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
80 double d = b.real*b.real + b.imag*b.imag;
83 r.real = (a.real*b.real + a.imag*b.imag)/d;
84 r.imag = (a.imag*b.real - a.real*b.imag)/d;
86 ******************************************************************/
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
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
;
99 if (abs_breal
>= abs_bimag
) {
100 /* divide tops and bottom by b.real */
101 if (abs_breal
== 0.0) {
103 r
.real
= r
.imag
= 0.0;
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
;
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
;
124 c_pow(Py_complex a
, Py_complex b
)
127 double vabs
,len
,at
,phase
;
128 if (b
.real
== 0. && b
.imag
== 0.) {
132 else if (a
.real
== 0. && a
.imag
== 0.) {
133 if (b
.imag
!= 0. || b
.real
< 0.)
139 vabs
= hypot(a
.real
,a
.imag
);
140 len
= pow(vabs
,b
.real
);
141 at
= atan2(a
.imag
, a
.real
);
144 len
/= exp(at
*b
.imag
);
145 phase
+= b
.imag
*log(vabs
);
147 r
.real
= len
*cos(phase
);
148 r
.imag
= len
*sin(phase
);
154 c_powu(Py_complex x
, long n
)
160 while (mask
> 0 && n
>= mask
) {
170 c_powi(Py_complex x
, long n
)
174 if (n
> 100 || n
< -100) {
175 cn
.real
= (double) n
;
182 return c_quot(c_1
,c_powu(x
,-n
));
187 complex_subtype_from_c_complex(PyTypeObject
*type
, Py_complex cval
)
191 op
= PyType_GenericAlloc(type
, 0);
193 ((PyComplexObject
*)op
)->cval
= cval
;
198 PyComplex_FromCComplex(Py_complex cval
)
200 register PyComplexObject
*op
;
202 /* PyObject_New is inlined */
203 op
= (PyComplexObject
*) PyObject_MALLOC(sizeof(PyComplexObject
));
205 return PyErr_NoMemory();
206 PyObject_INIT(op
, &PyComplex_Type
);
208 return (PyObject
*) op
;
212 complex_subtype_from_doubles(PyTypeObject
*type
, double real
, double imag
)
217 return complex_subtype_from_c_complex(type
, c
);
221 PyComplex_FromDoubles(double real
, double imag
)
226 return PyComplex_FromCComplex(c
);
230 PyComplex_RealAsDouble(PyObject
*op
)
232 if (PyComplex_Check(op
)) {
233 return ((PyComplexObject
*)op
)->cval
.real
;
236 return PyFloat_AsDouble(op
);
241 PyComplex_ImagAsDouble(PyObject
*op
)
243 if (PyComplex_Check(op
)) {
244 return ((PyComplexObject
*)op
)->cval
.imag
;
252 PyComplex_AsCComplex(PyObject
*op
)
255 if (PyComplex_Check(op
)) {
256 return ((PyComplexObject
*)op
)->cval
;
259 cv
.real
= PyFloat_AsDouble(op
);
266 complex_dealloc(PyObject
*op
)
273 complex_to_buf(char *buf
, PyComplexObject
*v
, int precision
)
275 if (v
->cval
.real
== 0.)
276 sprintf(buf
, "%.*gj", precision
, v
->cval
.imag
);
278 sprintf(buf
, "(%.*g%+.*gj)", precision
, v
->cval
.real
,
279 precision
, v
->cval
.imag
);
283 complex_print(PyComplexObject
*v
, FILE *fp
, int flags
)
286 complex_to_buf(buf
, v
,
287 (flags
& Py_PRINT_RAW
) ? PREC_STR
: PREC_REPR
);
293 complex_repr(PyComplexObject
*v
)
296 complex_to_buf(buf
, v
, PREC_REPR
);
297 return PyString_FromString(buf
);
301 complex_str(PyComplexObject
*v
)
304 complex_to_buf(buf
, v
, PREC_STR
);
305 return PyString_FromString(buf
);
309 complex_hash(PyComplexObject
*v
)
311 long hashreal
, hashimag
, combined
;
312 hashreal
= _Py_HashDouble(v
->cval
.real
);
315 hashimag
= _Py_HashDouble(v
->cval
.imag
);
318 /* Note: if the imaginary part is 0, hashimag is 0 now,
319 * so the following returns hashreal unchanged. This is
320 * important because numbers of different types that
321 * compare equal must have the same hash value, so that
322 * hash(x + 0*j) must equal hash(x).
324 combined
= hashreal
+ 1000003 * hashimag
;
331 complex_add(PyComplexObject
*v
, PyComplexObject
*w
)
334 PyFPE_START_PROTECT("complex_add", return 0)
335 result
= c_sum(v
->cval
,w
->cval
);
336 PyFPE_END_PROTECT(result
)
337 return PyComplex_FromCComplex(result
);
341 complex_sub(PyComplexObject
*v
, PyComplexObject
*w
)
344 PyFPE_START_PROTECT("complex_sub", return 0)
345 result
= c_diff(v
->cval
,w
->cval
);
346 PyFPE_END_PROTECT(result
)
347 return PyComplex_FromCComplex(result
);
351 complex_mul(PyComplexObject
*v
, PyComplexObject
*w
)
354 PyFPE_START_PROTECT("complex_mul", return 0)
355 result
= c_prod(v
->cval
,w
->cval
);
356 PyFPE_END_PROTECT(result
)
357 return PyComplex_FromCComplex(result
);
361 complex_div(PyComplexObject
*v
, PyComplexObject
*w
)
364 PyFPE_START_PROTECT("complex_div", return 0)
366 quot
= c_quot(v
->cval
,w
->cval
);
367 PyFPE_END_PROTECT(quot
)
369 PyErr_SetString(PyExc_ZeroDivisionError
, "complex division");
372 return PyComplex_FromCComplex(quot
);
376 complex_remainder(PyComplexObject
*v
, PyComplexObject
*w
)
380 div
= c_quot(v
->cval
,w
->cval
); /* The raw divisor value. */
382 PyErr_SetString(PyExc_ZeroDivisionError
, "complex remainder");
385 div
.real
= floor(div
.real
); /* Use the floor of the real part. */
387 mod
= c_diff(v
->cval
, c_prod(w
->cval
, div
));
389 return PyComplex_FromCComplex(mod
);
394 complex_divmod(PyComplexObject
*v
, PyComplexObject
*w
)
399 div
= c_quot(v
->cval
,w
->cval
); /* The raw divisor value. */
401 PyErr_SetString(PyExc_ZeroDivisionError
, "complex divmod()");
404 div
.real
= floor(div
.real
); /* Use the floor of the real part. */
406 mod
= c_diff(v
->cval
, c_prod(w
->cval
, div
));
407 d
= PyComplex_FromCComplex(div
);
408 m
= PyComplex_FromCComplex(mod
);
409 z
= Py_BuildValue("(OO)", d
, m
);
416 complex_pow(PyComplexObject
*v
, PyObject
*w
, PyComplexObject
*z
)
422 if ((PyObject
*)z
!=Py_None
) {
423 PyErr_SetString(PyExc_ValueError
, "complex modulo");
426 PyFPE_START_PROTECT("complex_pow", return 0)
428 exponent
= ((PyComplexObject
*)w
)->cval
;
429 int_exponent
= (long)exponent
.real
;
430 if (exponent
.imag
== 0. && exponent
.real
== int_exponent
)
431 p
= c_powi(v
->cval
,int_exponent
);
433 p
= c_pow(v
->cval
,exponent
);
436 if (errno
== ERANGE
) {
437 PyErr_SetString(PyExc_ValueError
,
438 "0.0 to a negative or complex power");
441 return PyComplex_FromCComplex(p
);
445 complex_int_div(PyComplexObject
*v
, PyComplexObject
*w
)
449 t
= complex_divmod(v
, w
);
451 r
= PyTuple_GET_ITEM(t
, 0);
460 complex_neg(PyComplexObject
*v
)
463 neg
.real
= -v
->cval
.real
;
464 neg
.imag
= -v
->cval
.imag
;
465 return PyComplex_FromCComplex(neg
);
469 complex_pos(PyComplexObject
*v
)
472 return (PyObject
*)v
;
476 complex_abs(PyComplexObject
*v
)
479 PyFPE_START_PROTECT("complex_abs", return 0)
480 result
= hypot(v
->cval
.real
,v
->cval
.imag
);
481 PyFPE_END_PROTECT(result
)
482 return PyFloat_FromDouble(result
);
486 complex_nonzero(PyComplexObject
*v
)
488 return v
->cval
.real
!= 0.0 || v
->cval
.imag
!= 0.0;
492 complex_coerce(PyObject
**pv
, PyObject
**pw
)
496 if (PyInt_Check(*pw
)) {
497 cval
.real
= (double)PyInt_AsLong(*pw
);
498 *pw
= PyComplex_FromCComplex(cval
);
502 else if (PyLong_Check(*pw
)) {
503 cval
.real
= PyLong_AsDouble(*pw
);
504 *pw
= PyComplex_FromCComplex(cval
);
508 else if (PyFloat_Check(*pw
)) {
509 cval
.real
= PyFloat_AsDouble(*pw
);
510 *pw
= PyComplex_FromCComplex(cval
);
514 return 1; /* Can't do it */
518 complex_richcompare(PyObject
*v
, PyObject
*w
, int op
)
524 if (op
!= Py_EQ
&& op
!= Py_NE
) {
525 PyErr_SetString(PyExc_TypeError
,
526 "cannot compare complex numbers using <, <=, >, >=");
530 c
= PyNumber_CoerceEx(&v
, &w
);
534 Py_INCREF(Py_NotImplemented
);
535 return Py_NotImplemented
;
537 if (!PyComplex_Check(v
) || !PyComplex_Check(w
)) {
540 Py_INCREF(Py_NotImplemented
);
541 return Py_NotImplemented
;
544 i
= ((PyComplexObject
*)v
)->cval
;
545 j
= ((PyComplexObject
*)w
)->cval
;
549 if ((i
.real
== j
.real
&& i
.imag
== j
.imag
) == (op
== Py_EQ
))
559 complex_int(PyObject
*v
)
561 PyErr_SetString(PyExc_TypeError
,
562 "can't convert complex to int; use e.g. int(abs(z))");
567 complex_long(PyObject
*v
)
569 PyErr_SetString(PyExc_TypeError
,
570 "can't convert complex to long; use e.g. long(abs(z))");
575 complex_float(PyObject
*v
)
577 PyErr_SetString(PyExc_TypeError
,
578 "can't convert complex to float; use e.g. abs(z)");
583 complex_conjugate(PyObject
*self
, PyObject
*args
)
586 if (!PyArg_ParseTuple(args
, ":conjugate"))
588 c
= ((PyComplexObject
*)self
)->cval
;
590 return PyComplex_FromCComplex(c
);
593 static PyMethodDef complex_methods
[] = {
594 {"conjugate", complex_conjugate
, 1},
595 {NULL
, NULL
} /* sentinel */
598 static struct memberlist complex_members
[] = {
599 {"real", T_DOUBLE
, offsetof(PyComplexObject
, cval
.real
), 0},
600 {"imag", T_DOUBLE
, offsetof(PyComplexObject
, cval
.imag
), 0},
605 complex_subtype_from_string(PyTypeObject
*type
, PyObject
*v
)
607 extern double strtod(const char *, char **);
608 const char *s
, *start
;
610 double x
=0.0, y
=0.0, z
;
611 int got_re
=0, got_im
=0, done
=0;
615 char buffer
[256]; /* For errors */
619 if (PyString_Check(v
)) {
620 s
= PyString_AS_STRING(v
);
621 len
= PyString_GET_SIZE(v
);
623 else if (PyUnicode_Check(v
)) {
624 if (PyUnicode_GET_SIZE(v
) >= sizeof(s_buffer
)) {
625 PyErr_SetString(PyExc_ValueError
,
626 "complex() literal too large to convert");
629 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v
),
630 PyUnicode_GET_SIZE(v
),
635 len
= (int)strlen(s
);
637 else if (PyObject_AsCharBuffer(v
, &s
, &len
)) {
638 PyErr_SetString(PyExc_TypeError
,
639 "complex() arg is not a string");
643 /* position on first nonblank */
645 while (*s
&& isspace(Py_CHARMASK(*s
)))
648 PyErr_SetString(PyExc_ValueError
,
649 "complex() arg is an empty string");
660 if (s
-start
!= len
) {
663 "complex() arg contains a null byte");
666 if(!done
) sw_error
=1;
673 if (done
) sw_error
=1;
675 if ( *s
=='\0'||*s
=='+'||*s
=='-' ||
676 isspace(Py_CHARMASK(*s
)) ) sw_error
=1;
681 if (got_im
|| done
) {
693 if (*s
!='+' && *s
!='-' )
698 if (isspace(Py_CHARMASK(*s
))) {
699 while (*s
&& isspace(Py_CHARMASK(*s
)))
708 (*s
=='.' || isdigit(Py_CHARMASK(*s
)));
709 if (done
||!digit_or_dot
) {
714 PyFPE_START_PROTECT("strtod", return 0)
715 z
= strtod(s
, &end
) ;
719 "float() out of range: %.150s", s
);
726 if (*s
=='J' || *s
=='j') {
735 /* accept a real part */
743 } /* end of switch */
745 } while (*s
!='\0' && !sw_error
);
748 PyErr_SetString(PyExc_ValueError
,
749 "complex() arg is a malformed string");
753 return complex_subtype_from_doubles(type
, x
, y
);
757 complex_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
759 PyObject
*r
, *i
, *tmp
;
760 PyNumberMethods
*nbr
, *nbi
= NULL
;
763 static char *kwlist
[] = {"real", "imag", 0};
767 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|OO:complex", kwlist
,
770 if (PyString_Check(r
) || PyUnicode_Check(r
))
771 return complex_subtype_from_string(type
, r
);
772 if ((nbr
= r
->ob_type
->tp_as_number
) == NULL
||
773 nbr
->nb_float
== NULL
||
775 ((nbi
= i
->ob_type
->tp_as_number
) == NULL
||
776 nbi
->nb_float
== NULL
))) {
777 PyErr_SetString(PyExc_TypeError
,
778 "complex() arg can't be converted to complex");
781 /* XXX Hack to support classes with __complex__ method */
782 if (PyInstance_Check(r
)) {
783 static PyObject
*complexstr
;
785 if (complexstr
== NULL
) {
786 complexstr
= PyString_InternFromString("__complex__");
787 if (complexstr
== NULL
)
790 f
= PyObject_GetAttr(r
, complexstr
);
794 PyObject
*args
= Py_BuildValue("()");
797 r
= PyEval_CallObject(f
, args
);
805 if (PyComplex_Check(r
)) {
806 cr
= ((PyComplexObject
*)r
)->cval
;
812 tmp
= PyNumber_Float(r
);
818 if (!PyFloat_Check(tmp
)) {
819 PyErr_SetString(PyExc_TypeError
,
820 "float(r) didn't return a float");
824 cr
.real
= PyFloat_AsDouble(tmp
);
832 else if (PyComplex_Check(i
))
833 ci
= ((PyComplexObject
*)i
)->cval
;
835 tmp
= (*nbi
->nb_float
)(i
);
838 ci
.real
= PyFloat_AsDouble(tmp
);
844 return complex_subtype_from_c_complex(type
, cr
);
847 static char complex_doc
[] =
848 "complex(real[, imag]) -> complex number\n\
850 Create a complex number from a real part and an optional imaginary part.\n\
851 This is equivalent to (real + imag*1j) where imag defaults to 0.";
853 static PyNumberMethods complex_as_number
= {
854 (binaryfunc
)complex_add
, /* nb_add */
855 (binaryfunc
)complex_sub
, /* nb_subtract */
856 (binaryfunc
)complex_mul
, /* nb_multiply */
857 (binaryfunc
)complex_div
, /* nb_divide */
858 (binaryfunc
)complex_remainder
, /* nb_remainder */
859 (binaryfunc
)complex_divmod
, /* nb_divmod */
860 (ternaryfunc
)complex_pow
, /* nb_power */
861 (unaryfunc
)complex_neg
, /* nb_negative */
862 (unaryfunc
)complex_pos
, /* nb_positive */
863 (unaryfunc
)complex_abs
, /* nb_absolute */
864 (inquiry
)complex_nonzero
, /* nb_nonzero */
871 (coercion
)complex_coerce
, /* nb_coerce */
872 (unaryfunc
)complex_int
, /* nb_int */
873 (unaryfunc
)complex_long
, /* nb_long */
874 (unaryfunc
)complex_float
, /* nb_float */
877 0, /* nb_inplace_add */
878 0, /* nb_inplace_subtract */
879 0, /* nb_inplace_multiply*/
880 0, /* nb_inplace_divide */
881 0, /* nb_inplace_remainder */
882 0, /* nb_inplace_power */
883 0, /* nb_inplace_lshift */
884 0, /* nb_inplace_rshift */
885 0, /* nb_inplace_and */
886 0, /* nb_inplace_xor */
887 0, /* nb_inplace_or */
888 (binaryfunc
)complex_int_div
, /* nb_floor_divide */
889 (binaryfunc
)complex_div
, /* nb_true_divide */
890 0, /* nb_inplace_floor_divide */
891 0, /* nb_inplace_true_divide */
894 PyTypeObject PyComplex_Type
= {
895 PyObject_HEAD_INIT(&PyType_Type
)
898 sizeof(PyComplexObject
),
900 (destructor
)complex_dealloc
, /* tp_dealloc */
901 (printfunc
)complex_print
, /* tp_print */
905 (reprfunc
)complex_repr
, /* tp_repr */
906 &complex_as_number
, /* tp_as_number */
907 0, /* tp_as_sequence */
908 0, /* tp_as_mapping */
909 (hashfunc
)complex_hash
, /* tp_hash */
911 (reprfunc
)complex_str
, /* tp_str */
912 PyObject_GenericGetAttr
, /* tp_getattro */
914 0, /* tp_as_buffer */
915 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /* tp_flags */
916 complex_doc
, /* tp_doc */
919 complex_richcompare
, /* tp_richcompare */
920 0, /* tp_weaklistoffset */
923 complex_methods
, /* tp_methods */
924 complex_members
, /* tp_members */
928 0, /* tp_descr_get */
929 0, /* tp_descr_set */
930 0, /* tp_dictoffset */
933 complex_new
, /* tp_new */