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 /* Inline PyObject_New */
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
)
268 op
->ob_type
->tp_free(op
);
273 complex_to_buf(char *buf
, int bufsz
, PyComplexObject
*v
, int precision
)
275 if (v
->cval
.real
== 0.)
276 PyOS_snprintf(buf
, bufsz
, "%.*gj",
277 precision
, v
->cval
.imag
);
279 PyOS_snprintf(buf
, bufsz
, "(%.*g%+.*gj)",
280 precision
, v
->cval
.real
,
281 precision
, v
->cval
.imag
);
285 complex_print(PyComplexObject
*v
, FILE *fp
, int flags
)
288 complex_to_buf(buf
, sizeof(buf
), v
,
289 (flags
& Py_PRINT_RAW
) ? PREC_STR
: PREC_REPR
);
295 complex_repr(PyComplexObject
*v
)
298 complex_to_buf(buf
, sizeof(buf
), v
, PREC_REPR
);
299 return PyString_FromString(buf
);
303 complex_str(PyComplexObject
*v
)
306 complex_to_buf(buf
, sizeof(buf
), v
, PREC_STR
);
307 return PyString_FromString(buf
);
311 complex_hash(PyComplexObject
*v
)
313 long hashreal
, hashimag
, combined
;
314 hashreal
= _Py_HashDouble(v
->cval
.real
);
317 hashimag
= _Py_HashDouble(v
->cval
.imag
);
320 /* Note: if the imaginary part is 0, hashimag is 0 now,
321 * so the following returns hashreal unchanged. This is
322 * important because numbers of different types that
323 * compare equal must have the same hash value, so that
324 * hash(x + 0*j) must equal hash(x).
326 combined
= hashreal
+ 1000003 * hashimag
;
333 complex_add(PyComplexObject
*v
, PyComplexObject
*w
)
336 PyFPE_START_PROTECT("complex_add", return 0)
337 result
= c_sum(v
->cval
,w
->cval
);
338 PyFPE_END_PROTECT(result
)
339 return PyComplex_FromCComplex(result
);
343 complex_sub(PyComplexObject
*v
, PyComplexObject
*w
)
346 PyFPE_START_PROTECT("complex_sub", return 0)
347 result
= c_diff(v
->cval
,w
->cval
);
348 PyFPE_END_PROTECT(result
)
349 return PyComplex_FromCComplex(result
);
353 complex_mul(PyComplexObject
*v
, PyComplexObject
*w
)
356 PyFPE_START_PROTECT("complex_mul", return 0)
357 result
= c_prod(v
->cval
,w
->cval
);
358 PyFPE_END_PROTECT(result
)
359 return PyComplex_FromCComplex(result
);
363 complex_div(PyComplexObject
*v
, PyComplexObject
*w
)
366 PyFPE_START_PROTECT("complex_div", return 0)
368 quot
= c_quot(v
->cval
,w
->cval
);
369 PyFPE_END_PROTECT(quot
)
371 PyErr_SetString(PyExc_ZeroDivisionError
, "complex division");
374 return PyComplex_FromCComplex(quot
);
378 complex_classic_div(PyComplexObject
*v
, PyComplexObject
*w
)
382 if (Py_DivisionWarningFlag
>= 2 &&
383 PyErr_Warn(PyExc_DeprecationWarning
,
384 "classic complex division") < 0)
387 PyFPE_START_PROTECT("complex_classic_div", return 0)
389 quot
= c_quot(v
->cval
,w
->cval
);
390 PyFPE_END_PROTECT(quot
)
392 PyErr_SetString(PyExc_ZeroDivisionError
, "complex division");
395 return PyComplex_FromCComplex(quot
);
399 complex_remainder(PyComplexObject
*v
, PyComplexObject
*w
)
403 if (PyErr_Warn(PyExc_DeprecationWarning
,
404 "complex divmod(), // and % are deprecated") < 0)
408 div
= c_quot(v
->cval
,w
->cval
); /* The raw divisor value. */
410 PyErr_SetString(PyExc_ZeroDivisionError
, "complex remainder");
413 div
.real
= floor(div
.real
); /* Use the floor of the real part. */
415 mod
= c_diff(v
->cval
, c_prod(w
->cval
, div
));
417 return PyComplex_FromCComplex(mod
);
422 complex_divmod(PyComplexObject
*v
, PyComplexObject
*w
)
427 if (PyErr_Warn(PyExc_DeprecationWarning
,
428 "complex divmod(), // and % are deprecated") < 0)
432 div
= c_quot(v
->cval
,w
->cval
); /* The raw divisor value. */
434 PyErr_SetString(PyExc_ZeroDivisionError
, "complex divmod()");
437 div
.real
= floor(div
.real
); /* Use the floor of the real part. */
439 mod
= c_diff(v
->cval
, c_prod(w
->cval
, div
));
440 d
= PyComplex_FromCComplex(div
);
441 m
= PyComplex_FromCComplex(mod
);
442 z
= Py_BuildValue("(OO)", d
, m
);
449 complex_pow(PyComplexObject
*v
, PyObject
*w
, PyComplexObject
*z
)
455 if ((PyObject
*)z
!=Py_None
) {
456 PyErr_SetString(PyExc_ValueError
, "complex modulo");
459 PyFPE_START_PROTECT("complex_pow", return 0)
461 exponent
= ((PyComplexObject
*)w
)->cval
;
462 int_exponent
= (long)exponent
.real
;
463 if (exponent
.imag
== 0. && exponent
.real
== int_exponent
)
464 p
= c_powi(v
->cval
,int_exponent
);
466 p
= c_pow(v
->cval
,exponent
);
469 Py_ADJUST_ERANGE2(p
.real
, p
.imag
);
471 PyErr_SetString(PyExc_ZeroDivisionError
,
472 "0.0 to a negative or complex power");
475 else if (errno
== ERANGE
) {
476 PyErr_SetString(PyExc_OverflowError
,
477 "complex exponentiaion");
480 return PyComplex_FromCComplex(p
);
484 complex_int_div(PyComplexObject
*v
, PyComplexObject
*w
)
488 t
= complex_divmod(v
, w
);
490 r
= PyTuple_GET_ITEM(t
, 0);
499 complex_neg(PyComplexObject
*v
)
502 neg
.real
= -v
->cval
.real
;
503 neg
.imag
= -v
->cval
.imag
;
504 return PyComplex_FromCComplex(neg
);
508 complex_pos(PyComplexObject
*v
)
510 if (PyComplex_CheckExact(v
)) {
512 return (PyObject
*)v
;
515 return PyComplex_FromCComplex(v
->cval
);
519 complex_abs(PyComplexObject
*v
)
522 PyFPE_START_PROTECT("complex_abs", return 0)
523 result
= hypot(v
->cval
.real
,v
->cval
.imag
);
524 PyFPE_END_PROTECT(result
)
525 return PyFloat_FromDouble(result
);
529 complex_nonzero(PyComplexObject
*v
)
531 return v
->cval
.real
!= 0.0 || v
->cval
.imag
!= 0.0;
535 complex_coerce(PyObject
**pv
, PyObject
**pw
)
539 if (PyInt_Check(*pw
)) {
540 cval
.real
= (double)PyInt_AsLong(*pw
);
541 *pw
= PyComplex_FromCComplex(cval
);
545 else if (PyLong_Check(*pw
)) {
546 cval
.real
= PyLong_AsDouble(*pw
);
547 if (cval
.real
== -1.0 && PyErr_Occurred())
549 *pw
= PyComplex_FromCComplex(cval
);
553 else if (PyFloat_Check(*pw
)) {
554 cval
.real
= PyFloat_AsDouble(*pw
);
555 *pw
= PyComplex_FromCComplex(cval
);
559 else if (PyComplex_Check(*pw
)) {
564 return 1; /* Can't do it */
568 complex_richcompare(PyObject
*v
, PyObject
*w
, int op
)
574 c
= PyNumber_CoerceEx(&v
, &w
);
578 Py_INCREF(Py_NotImplemented
);
579 return Py_NotImplemented
;
581 /* Make sure both arguments are complex. */
582 if (!(PyComplex_Check(v
) && PyComplex_Check(w
))) {
585 Py_INCREF(Py_NotImplemented
);
586 return Py_NotImplemented
;
589 i
= ((PyComplexObject
*)v
)->cval
;
590 j
= ((PyComplexObject
*)w
)->cval
;
594 if (op
!= Py_EQ
&& op
!= Py_NE
) {
595 PyErr_SetString(PyExc_TypeError
,
596 "cannot compare complex numbers using <, <=, >, >=");
600 if ((i
.real
== j
.real
&& i
.imag
== j
.imag
) == (op
== Py_EQ
))
610 complex_int(PyObject
*v
)
612 PyErr_SetString(PyExc_TypeError
,
613 "can't convert complex to int; use e.g. int(abs(z))");
618 complex_long(PyObject
*v
)
620 PyErr_SetString(PyExc_TypeError
,
621 "can't convert complex to long; use e.g. long(abs(z))");
626 complex_float(PyObject
*v
)
628 PyErr_SetString(PyExc_TypeError
,
629 "can't convert complex to float; use e.g. abs(z)");
634 complex_conjugate(PyObject
*self
)
637 c
= ((PyComplexObject
*)self
)->cval
;
639 return PyComplex_FromCComplex(c
);
642 static PyMethodDef complex_methods
[] = {
643 {"conjugate", (PyCFunction
)complex_conjugate
, METH_NOARGS
},
644 {NULL
, NULL
} /* sentinel */
647 static PyMemberDef complex_members
[] = {
648 {"real", T_DOUBLE
, offsetof(PyComplexObject
, cval
.real
), READONLY
,
649 "the real part of a complex number"},
650 {"imag", T_DOUBLE
, offsetof(PyComplexObject
, cval
.imag
), READONLY
,
651 "the imaginary part of a complex number"},
656 complex_subtype_from_string(PyTypeObject
*type
, PyObject
*v
)
658 extern double strtod(const char *, char **);
659 const char *s
, *start
;
661 double x
=0.0, y
=0.0, z
;
662 int got_re
=0, got_im
=0, done
=0;
666 char buffer
[256]; /* For errors */
667 #ifdef Py_USING_UNICODE
672 if (PyString_Check(v
)) {
673 s
= PyString_AS_STRING(v
);
674 len
= PyString_GET_SIZE(v
);
676 #ifdef Py_USING_UNICODE
677 else if (PyUnicode_Check(v
)) {
678 if (PyUnicode_GET_SIZE(v
) >= sizeof(s_buffer
)) {
679 PyErr_SetString(PyExc_ValueError
,
680 "complex() literal too large to convert");
683 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v
),
684 PyUnicode_GET_SIZE(v
),
689 len
= (int)strlen(s
);
692 else if (PyObject_AsCharBuffer(v
, &s
, &len
)) {
693 PyErr_SetString(PyExc_TypeError
,
694 "complex() arg is not a string");
698 /* position on first nonblank */
700 while (*s
&& isspace(Py_CHARMASK(*s
)))
703 PyErr_SetString(PyExc_ValueError
,
704 "complex() arg is an empty string");
715 if (s
-start
!= len
) {
718 "complex() arg contains a null byte");
721 if(!done
) sw_error
=1;
728 if (done
) sw_error
=1;
730 if ( *s
=='\0'||*s
=='+'||*s
=='-' ||
731 isspace(Py_CHARMASK(*s
)) ) sw_error
=1;
736 if (got_im
|| done
) {
748 if (*s
!='+' && *s
!='-' )
753 if (isspace(Py_CHARMASK(*s
))) {
754 while (*s
&& isspace(Py_CHARMASK(*s
)))
763 (*s
=='.' || isdigit(Py_CHARMASK(*s
)));
764 if (done
||!digit_or_dot
) {
769 PyFPE_START_PROTECT("strtod", return 0)
770 z
= strtod(s
, &end
) ;
773 PyOS_snprintf(buffer
, sizeof(buffer
),
774 "float() out of range: %.150s", s
);
781 if (*s
=='J' || *s
=='j') {
790 /* accept a real part */
798 } /* end of switch */
800 } while (s
- start
< len
&& !sw_error
);
803 PyErr_SetString(PyExc_ValueError
,
804 "complex() arg is a malformed string");
808 return complex_subtype_from_doubles(type
, x
, y
);
812 complex_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
814 PyObject
*r
, *i
, *tmp
, *f
;
815 PyNumberMethods
*nbr
, *nbi
= NULL
;
818 static PyObject
*complexstr
;
819 static char *kwlist
[] = {"real", "imag", 0};
823 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|OO:complex", kwlist
,
826 if (PyString_Check(r
) || PyUnicode_Check(r
)) {
828 PyErr_SetString(PyExc_TypeError
,
829 "complex() can't take second arg"
830 " if first is a string");
833 return complex_subtype_from_string(type
, r
);
835 if (i
!= NULL
&& (PyString_Check(i
) || PyUnicode_Check(i
))) {
836 PyErr_SetString(PyExc_TypeError
,
837 "complex() second arg can't be a string");
841 /* XXX Hack to support classes with __complex__ method */
842 if (complexstr
== NULL
) {
843 complexstr
= PyString_InternFromString("__complex__");
844 if (complexstr
== NULL
)
847 f
= PyObject_GetAttr(r
, complexstr
);
851 PyObject
*args
= Py_BuildValue("()");
854 r
= PyEval_CallObject(f
, args
);
861 nbr
= r
->ob_type
->tp_as_number
;
863 nbi
= i
->ob_type
->tp_as_number
;
864 if (nbr
== NULL
|| nbr
->nb_float
== NULL
||
865 ((i
!= NULL
) && (nbi
== NULL
|| nbi
->nb_float
== NULL
))) {
866 PyErr_SetString(PyExc_TypeError
,
867 "complex() argument must be a string or a number");
870 if (PyComplex_Check(r
)) {
871 /* Note that if r is of a complex subtype, we're only
872 retaining its real & imag parts here, and the return
873 value is (properly) of the builtin complex type. */
874 cr
= ((PyComplexObject
*)r
)->cval
;
880 tmp
= PyNumber_Float(r
);
886 if (!PyFloat_Check(tmp
)) {
887 PyErr_SetString(PyExc_TypeError
,
888 "float(r) didn't return a float");
892 cr
.real
= PyFloat_AsDouble(tmp
);
900 else if (PyComplex_Check(i
))
901 ci
= ((PyComplexObject
*)i
)->cval
;
903 tmp
= (*nbi
->nb_float
)(i
);
906 ci
.real
= PyFloat_AsDouble(tmp
);
912 return complex_subtype_from_c_complex(type
, cr
);
915 static char complex_doc
[] =
916 "complex(real[, imag]) -> complex number\n"
918 "Create a complex number from a real part and an optional imaginary part.\n"
919 "This is equivalent to (real + imag*1j) where imag defaults to 0.";
921 static PyNumberMethods complex_as_number
= {
922 (binaryfunc
)complex_add
, /* nb_add */
923 (binaryfunc
)complex_sub
, /* nb_subtract */
924 (binaryfunc
)complex_mul
, /* nb_multiply */
925 (binaryfunc
)complex_classic_div
, /* nb_divide */
926 (binaryfunc
)complex_remainder
, /* nb_remainder */
927 (binaryfunc
)complex_divmod
, /* nb_divmod */
928 (ternaryfunc
)complex_pow
, /* nb_power */
929 (unaryfunc
)complex_neg
, /* nb_negative */
930 (unaryfunc
)complex_pos
, /* nb_positive */
931 (unaryfunc
)complex_abs
, /* nb_absolute */
932 (inquiry
)complex_nonzero
, /* nb_nonzero */
939 (coercion
)complex_coerce
, /* nb_coerce */
940 (unaryfunc
)complex_int
, /* nb_int */
941 (unaryfunc
)complex_long
, /* nb_long */
942 (unaryfunc
)complex_float
, /* nb_float */
945 0, /* nb_inplace_add */
946 0, /* nb_inplace_subtract */
947 0, /* nb_inplace_multiply*/
948 0, /* nb_inplace_divide */
949 0, /* nb_inplace_remainder */
950 0, /* nb_inplace_power */
951 0, /* nb_inplace_lshift */
952 0, /* nb_inplace_rshift */
953 0, /* nb_inplace_and */
954 0, /* nb_inplace_xor */
955 0, /* nb_inplace_or */
956 (binaryfunc
)complex_int_div
, /* nb_floor_divide */
957 (binaryfunc
)complex_div
, /* nb_true_divide */
958 0, /* nb_inplace_floor_divide */
959 0, /* nb_inplace_true_divide */
962 PyTypeObject PyComplex_Type
= {
963 PyObject_HEAD_INIT(&PyType_Type
)
966 sizeof(PyComplexObject
),
968 (destructor
)complex_dealloc
, /* tp_dealloc */
969 (printfunc
)complex_print
, /* tp_print */
973 (reprfunc
)complex_repr
, /* tp_repr */
974 &complex_as_number
, /* tp_as_number */
975 0, /* tp_as_sequence */
976 0, /* tp_as_mapping */
977 (hashfunc
)complex_hash
, /* tp_hash */
979 (reprfunc
)complex_str
, /* tp_str */
980 PyObject_GenericGetAttr
, /* tp_getattro */
982 0, /* tp_as_buffer */
983 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /* tp_flags */
984 complex_doc
, /* tp_doc */
987 complex_richcompare
, /* tp_richcompare */
988 0, /* tp_weaklistoffset */
991 complex_methods
, /* tp_methods */
992 complex_members
, /* tp_members */
996 0, /* tp_descr_get */
997 0, /* tp_descr_set */
998 0, /* tp_dictoffset */
1001 complex_new
, /* tp_new */
1002 _PyObject_Del
, /* tp_free */