2
/* Complex object implementation */
4
/* Borrows heavily from floatobject.c */
6
/* Submitted by Jim Hugunin */
9
#include "structmember.h"
15
#ifndef WITHOUT_COMPLEX
17
/* Precisions used by repr() and str(), respectively.
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
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.
33
/* elementary operations on complex numbers */
35
static Py_complex c_1 = {1., 0.};
38
c_sum(Py_complex a, Py_complex b)
41
r.real = a.real + b.real;
42
r.imag = a.imag + b.imag;
47
c_diff(Py_complex a, Py_complex b)
50
r.real = a.real - b.real;
51
r.imag = a.imag - b.imag;
65
c_prod(Py_complex a, Py_complex b)
68
r.real = a.real*b.real - a.imag*b.imag;
69
r.imag = a.real*b.imag + a.imag*b.real;
74
c_quot(Py_complex a, Py_complex b)
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
84
double d = b.real*b.real + b.imag*b.imag;
87
r.real = (a.real*b.real + a.imag*b.imag)/d;
88
r.imag = (a.imag*b.real - a.real*b.imag)/d;
90
******************************************************************/
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
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;
103
if (abs_breal >= abs_bimag) {
104
/* divide tops and bottom by b.real */
105
if (abs_breal == 0.0) {
107
r.real = r.imag = 0.0;
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;
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;
128
c_pow(Py_complex a, Py_complex b)
131
double vabs,len,at,phase;
132
if (b.real == 0. && b.imag == 0.) {
136
else if (a.real == 0. && a.imag == 0.) {
137
if (b.imag != 0. || b.real < 0.)
143
vabs = hypot(a.real,a.imag);
144
len = pow(vabs,b.real);
145
at = atan2(a.imag, a.real);
148
len /= exp(at*b.imag);
149
phase += b.imag*log(vabs);
151
r.real = len*cos(phase);
152
r.imag = len*sin(phase);
158
c_powu(Py_complex x, long n)
164
while (mask > 0 && n >= mask) {
174
c_powi(Py_complex x, long n)
178
if (n > 100 || n < -100) {
179
cn.real = (double) n;
186
return c_quot(c_1,c_powu(x,-n));
193
/* sets errno = ERANGE on overflow; otherwise errno = 0 */
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
200
if (Py_IS_INFINITY(z.real)) {
201
result = fabs(z.real);
205
if (Py_IS_INFINITY(z.imag)) {
206
result = fabs(z.imag);
210
/* either the real or imaginary part is a NaN,
211
and neither is infinite. Result should be NaN. */
214
result = hypot(z.real, z.imag);
215
if (!Py_IS_FINITE(result))
223
complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
227
op = type->tp_alloc(type, 0);
229
((PyComplexObject *)op)->cval = cval;
234
PyComplex_FromCComplex(Py_complex cval)
236
register PyComplexObject *op;
238
/* Inline PyObject_New */
239
op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
241
return PyErr_NoMemory();
242
PyObject_INIT(op, &PyComplex_Type);
244
return (PyObject *) op;
248
complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
253
return complex_subtype_from_c_complex(type, c);
257
PyComplex_FromDoubles(double real, double imag)
262
return PyComplex_FromCComplex(c);
266
PyComplex_RealAsDouble(PyObject *op)
268
if (PyComplex_Check(op)) {
269
return ((PyComplexObject *)op)->cval.real;
272
return PyFloat_AsDouble(op);
277
PyComplex_ImagAsDouble(PyObject *op)
279
if (PyComplex_Check(op)) {
280
return ((PyComplexObject *)op)->cval.imag;
288
PyComplex_AsCComplex(PyObject *op)
291
PyObject *newop = NULL;
292
static PyObject *complex_str = NULL;
295
/* If op is already of type PyComplex_Type, return its value */
296
if (PyComplex_Check(op)) {
297
return ((PyComplexObject *)op)->cval;
299
/* If not, use op's __complex__ method, if it exists */
301
/* return -1 on failure */
305
if (complex_str == NULL) {
306
if (!(complex_str = PyUnicode_FromString("__complex__")))
311
PyObject *complexfunc;
312
complexfunc = _PyType_Lookup(op->ob_type, complex_str);
313
/* complexfunc is a borrowed reference */
315
newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
322
if (!PyComplex_Check(newop)) {
323
PyErr_SetString(PyExc_TypeError,
324
"__complex__ should return a complex object");
328
cv = ((PyComplexObject *)newop)->cval;
332
/* If neither of the above works, interpret op as a float giving the
333
real part of the result, and fill in the imaginary part as 0. */
335
/* PyFloat_AsDouble will return -1 on failure */
336
cv.real = PyFloat_AsDouble(op);
342
complex_dealloc(PyObject *op)
344
op->ob_type->tp_free(op);
349
complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
352
if (v->cval.real == 0.) {
353
if (!Py_IS_FINITE(v->cval.imag)) {
354
if (Py_IS_NAN(v->cval.imag))
355
strncpy(buf, "nan*j", 6);
356
else if (copysign(1, v->cval.imag) == 1)
357
strncpy(buf, "inf*j", 6);
359
strncpy(buf, "-inf*j", 7);
362
PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
363
PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
364
strncat(buf, "j", 1);
368
/* Format imaginary part with sign, real part without */
369
if (!Py_IS_FINITE(v->cval.real)) {
370
if (Py_IS_NAN(v->cval.real))
371
strncpy(re, "nan", 4);
372
/* else if (copysign(1, v->cval.real) == 1) */
373
else if (v->cval.real > 0)
374
strncpy(re, "inf", 4);
376
strncpy(re, "-inf", 5);
379
PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
380
PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
382
if (!Py_IS_FINITE(v->cval.imag)) {
383
if (Py_IS_NAN(v->cval.imag))
384
strncpy(im, "+nan*", 6);
385
/* else if (copysign(1, v->cval.imag) == 1) */
386
else if (v->cval.imag > 0)
387
strncpy(im, "+inf*", 6);
389
strncpy(im, "-inf*", 6);
392
PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
393
PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
395
PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
400
complex_repr(PyComplexObject *v)
403
complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
404
return PyUnicode_FromString(buf);
408
complex_str(PyComplexObject *v)
411
complex_to_buf(buf, sizeof(buf), v, PREC_STR);
412
return PyUnicode_FromString(buf);
416
complex_hash(PyComplexObject *v)
418
long hashreal, hashimag, combined;
419
hashreal = _Py_HashDouble(v->cval.real);
422
hashimag = _Py_HashDouble(v->cval.imag);
425
/* Note: if the imaginary part is 0, hashimag is 0 now,
426
* so the following returns hashreal unchanged. This is
427
* important because numbers of different types that
428
* compare equal must have the same hash value, so that
429
* hash(x + 0*j) must equal hash(x).
431
combined = hashreal + 1000003 * hashimag;
437
/* This macro may return! */
438
#define TO_COMPLEX(obj, c) \
439
if (PyComplex_Check(obj)) \
440
c = ((PyComplexObject *)(obj))->cval; \
441
else if (to_complex(&(obj), &(c)) < 0) \
445
to_complex(PyObject **pobj, Py_complex *pc)
447
PyObject *obj = *pobj;
449
pc->real = pc->imag = 0.0;
450
if (PyLong_Check(obj)) {
451
pc->real = PyLong_AsDouble(obj);
452
if (pc->real == -1.0 && PyErr_Occurred()) {
458
if (PyFloat_Check(obj)) {
459
pc->real = PyFloat_AsDouble(obj);
462
Py_INCREF(Py_NotImplemented);
463
*pobj = Py_NotImplemented;
469
complex_add(PyObject *v, PyObject *w)
475
PyFPE_START_PROTECT("complex_add", return 0)
476
result = c_sum(a, b);
477
PyFPE_END_PROTECT(result)
478
return PyComplex_FromCComplex(result);
482
complex_sub(PyObject *v, PyObject *w)
488
PyFPE_START_PROTECT("complex_sub", return 0)
489
result = c_diff(a, b);
490
PyFPE_END_PROTECT(result)
491
return PyComplex_FromCComplex(result);
495
complex_mul(PyObject *v, PyObject *w)
501
PyFPE_START_PROTECT("complex_mul", return 0)
502
result = c_prod(a, b);
503
PyFPE_END_PROTECT(result)
504
return PyComplex_FromCComplex(result);
508
complex_div(PyObject *v, PyObject *w)
514
PyFPE_START_PROTECT("complex_div", return 0)
517
PyFPE_END_PROTECT(quot)
519
PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
522
return PyComplex_FromCComplex(quot);
526
complex_remainder(PyObject *v, PyObject *w)
528
PyErr_SetString(PyExc_TypeError,
529
"can't mod complex numbers.");
535
complex_divmod(PyObject *v, PyObject *w)
537
PyErr_SetString(PyExc_TypeError,
538
"can't take floor or mod of complex number.");
543
complex_pow(PyObject *v, PyObject *w, PyObject *z)
553
PyErr_SetString(PyExc_ValueError, "complex modulo");
556
PyFPE_START_PROTECT("complex_pow", return 0)
559
int_exponent = (long)exponent.real;
560
if (exponent.imag == 0. && exponent.real == int_exponent)
561
p = c_powi(a, int_exponent);
563
p = c_pow(a, exponent);
566
Py_ADJUST_ERANGE2(p.real, p.imag);
568
PyErr_SetString(PyExc_ZeroDivisionError,
569
"0.0 to a negative or complex power");
572
else if (errno == ERANGE) {
573
PyErr_SetString(PyExc_OverflowError,
574
"complex exponentiation");
577
return PyComplex_FromCComplex(p);
581
complex_int_div(PyObject *v, PyObject *w)
583
PyErr_SetString(PyExc_TypeError,
584
"can't take floor of complex number.");
589
complex_neg(PyComplexObject *v)
592
neg.real = -v->cval.real;
593
neg.imag = -v->cval.imag;
594
return PyComplex_FromCComplex(neg);
598
complex_pos(PyComplexObject *v)
600
if (PyComplex_CheckExact(v)) {
602
return (PyObject *)v;
605
return PyComplex_FromCComplex(v->cval);
609
complex_abs(PyComplexObject *v)
613
PyFPE_START_PROTECT("complex_abs", return 0)
614
result = c_abs(v->cval);
615
PyFPE_END_PROTECT(result)
617
if (errno == ERANGE) {
618
PyErr_SetString(PyExc_OverflowError,
619
"absolute value too large");
622
return PyFloat_FromDouble(result);
626
complex_bool(PyComplexObject *v)
628
return v->cval.real != 0.0 || v->cval.imag != 0.0;
632
complex_richcompare(PyObject *v, PyObject *w, int op)
639
if (op != Py_EQ && op != Py_NE) {
640
/* XXX Should eventually return NotImplemented */
641
PyErr_SetString(PyExc_TypeError,
642
"no ordering relation is defined for complex numbers");
646
if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
656
complex_int(PyObject *v)
658
PyErr_SetString(PyExc_TypeError,
659
"can't convert complex to int; use int(abs(z))");
664
complex_float(PyObject *v)
666
PyErr_SetString(PyExc_TypeError,
667
"can't convert complex to float; use abs(z)");
672
complex_conjugate(PyObject *self)
675
c = ((PyComplexObject *)self)->cval;
677
return PyComplex_FromCComplex(c);
680
PyDoc_STRVAR(complex_conjugate_doc,
681
"complex.conjugate() -> complex\n"
683
"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
686
complex_getnewargs(PyComplexObject *v)
688
Py_complex c = v->cval;
689
return Py_BuildValue("(dd)", c.real, c.imag);
694
complex_is_finite(PyObject *self)
697
c = ((PyComplexObject *)self)->cval;
698
return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
699
Py_IS_FINITE(c.imag)));
702
PyDoc_STRVAR(complex_is_finite_doc,
703
"complex.is_finite() -> bool\n"
705
"Returns True if the real and the imaginary part is finite.");
708
static PyMethodDef complex_methods[] = {
709
{"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
710
complex_conjugate_doc},
712
{"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
713
complex_is_finite_doc},
715
{"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
716
{NULL, NULL} /* sentinel */
719
static PyMemberDef complex_members[] = {
720
{"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
721
"the real part of a complex number"},
722
{"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
723
"the imaginary part of a complex number"},
728
complex_subtype_from_string(PyTypeObject *type, PyObject *v)
730
const char *s, *start;
732
double x=0.0, y=0.0, z;
733
int got_re=0, got_im=0, got_bracket=0, done=0;
737
char buffer[256]; /* For errors */
741
if (PyUnicode_Check(v)) {
742
if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
743
PyErr_SetString(PyExc_ValueError,
744
"complex() literal too large to convert");
747
if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
748
PyUnicode_GET_SIZE(v),
755
else if (PyObject_AsCharBuffer(v, &s, &len)) {
756
PyErr_SetString(PyExc_TypeError,
757
"complex() arg is not a string");
761
/* position on first nonblank */
763
while (*s && isspace(Py_CHARMASK(*s)))
766
PyErr_SetString(PyExc_ValueError,
767
"complex() arg is an empty string");
771
/* Skip over possible bracket from repr(). */
774
while (*s && isspace(Py_CHARMASK(*s)))
785
if (s-start != len) {
788
"complex() arg contains a null byte");
791
if(!done) sw_error=1;
795
if (!got_bracket || !(got_re || got_im)) {
802
while (*s && isspace(Py_CHARMASK(*s)))
811
if (done) sw_error=1;
813
if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
814
isspace(Py_CHARMASK(*s)) ) sw_error=1;
819
if (got_im || done) {
831
if (*s!='+' && *s!='-' )
836
if (isspace(Py_CHARMASK(*s))) {
837
while (*s && isspace(Py_CHARMASK(*s)))
846
(*s=='.' || isdigit(Py_CHARMASK(*s)));
847
if (done||!digit_or_dot) {
852
PyFPE_START_PROTECT("strtod", return 0)
853
z = PyOS_ascii_strtod(s, &end) ;
856
PyOS_snprintf(buffer, sizeof(buffer),
857
"float() out of range: %.150s", s);
864
if (*s=='J' || *s=='j') {
873
/* accept a real part */
881
} /* end of switch */
883
} while (s - start < len && !sw_error);
885
if (sw_error || got_bracket) {
886
PyErr_SetString(PyExc_ValueError,
887
"complex() arg is a malformed string");
891
return complex_subtype_from_doubles(type, x, y);
895
complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
897
PyObject *r, *i, *tmp, *f;
898
PyNumberMethods *nbr, *nbi = NULL;
901
int cr_is_complex = 0;
902
int ci_is_complex = 0;
903
static PyObject *complexstr;
904
static char *kwlist[] = {"real", "imag", 0};
908
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
912
/* Special-case for a single argument when type(arg) is complex. */
913
if (PyComplex_CheckExact(r) && i == NULL &&
914
type == &PyComplex_Type) {
915
/* Note that we can't know whether it's safe to return
916
a complex *subclass* instance as-is, hence the restriction
917
to exact complexes here. If either the input or the
918
output is a complex subclass, it will be handled below
919
as a non-orthogonal vector. */
923
if (PyUnicode_Check(r)) {
925
PyErr_SetString(PyExc_TypeError,
926
"complex() can't take second arg"
927
" if first is a string");
930
return complex_subtype_from_string(type, r);
932
if (i != NULL && PyUnicode_Check(i)) {
933
PyErr_SetString(PyExc_TypeError,
934
"complex() second arg can't be a string");
938
/* XXX Hack to support classes with __complex__ method */
939
if (complexstr == NULL) {
940
complexstr = PyUnicode_InternFromString("__complex__");
941
if (complexstr == NULL)
944
f = PyObject_GetAttr(r, complexstr);
948
PyObject *args = PyTuple_New(0);
951
r = PyEval_CallObject(f, args);
958
nbr = r->ob_type->tp_as_number;
960
nbi = i->ob_type->tp_as_number;
961
if (nbr == NULL || nbr->nb_float == NULL ||
962
((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
963
PyErr_SetString(PyExc_TypeError,
964
"complex() argument must be a string or a number");
971
/* If we get this far, then the "real" and "imag" parts should
972
both be treated as numbers, and the constructor should return a
973
complex number equal to (real + imag*1j).
975
Note that we do NOT assume the input to already be in canonical
976
form; the "real" and "imag" parts might themselves be complex
977
numbers, which slightly complicates the code below. */
978
if (PyComplex_Check(r)) {
979
/* Note that if r is of a complex subtype, we're only
980
retaining its real & imag parts here, and the return
981
value is (properly) of the builtin complex type. */
982
cr = ((PyComplexObject*)r)->cval;
989
/* The "real" part really is entirely real, and contributes
990
nothing in the imaginary direction.
991
Just treat it as a double. */
992
tmp = PyNumber_Float(r);
994
/* r was a newly created complex number, rather
995
than the original "real" argument. */
1000
if (!PyFloat_Check(tmp)) {
1001
PyErr_SetString(PyExc_TypeError,
1002
"float(r) didn't return a float");
1006
cr.real = PyFloat_AsDouble(tmp);
1007
cr.imag = 0.0; /* Shut up compiler warning */
1013
else if (PyComplex_Check(i)) {
1014
ci = ((PyComplexObject*)i)->cval;
1017
/* The "imag" part really is entirely imaginary, and
1018
contributes nothing in the real direction.
1019
Just treat it as a double. */
1020
tmp = (*nbi->nb_float)(i);
1023
ci.real = PyFloat_AsDouble(tmp);
1026
/* If the input was in canonical form, then the "real" and "imag"
1027
parts are real numbers, so that ci.imag and cr.imag are zero.
1028
We need this correction in case they were not real numbers. */
1030
if (ci_is_complex) {
1033
if (cr_is_complex) {
1036
return complex_subtype_from_doubles(type, cr.real, ci.real);
1039
PyDoc_STRVAR(complex_doc,
1040
"complex(real[, imag]) -> complex number\n"
1042
"Create a complex number from a real part and an optional imaginary part.\n"
1043
"This is equivalent to (real + imag*1j) where imag defaults to 0.");
1045
static PyNumberMethods complex_as_number = {
1046
(binaryfunc)complex_add, /* nb_add */
1047
(binaryfunc)complex_sub, /* nb_subtract */
1048
(binaryfunc)complex_mul, /* nb_multiply */
1049
(binaryfunc)complex_remainder, /* nb_remainder */
1050
(binaryfunc)complex_divmod, /* nb_divmod */
1051
(ternaryfunc)complex_pow, /* nb_power */
1052
(unaryfunc)complex_neg, /* nb_negative */
1053
(unaryfunc)complex_pos, /* nb_positive */
1054
(unaryfunc)complex_abs, /* nb_absolute */
1055
(inquiry)complex_bool, /* nb_bool */
1062
complex_int, /* nb_int */
1063
0, /* nb_reserved */
1064
complex_float, /* nb_float */
1065
0, /* nb_inplace_add */
1066
0, /* nb_inplace_subtract */
1067
0, /* nb_inplace_multiply*/
1068
0, /* nb_inplace_remainder */
1069
0, /* nb_inplace_power */
1070
0, /* nb_inplace_lshift */
1071
0, /* nb_inplace_rshift */
1072
0, /* nb_inplace_and */
1073
0, /* nb_inplace_xor */
1074
0, /* nb_inplace_or */
1075
(binaryfunc)complex_int_div, /* nb_floor_divide */
1076
(binaryfunc)complex_div, /* nb_true_divide */
1077
0, /* nb_inplace_floor_divide */
1078
0, /* nb_inplace_true_divide */
1081
PyTypeObject PyComplex_Type = {
1082
PyVarObject_HEAD_INIT(&PyType_Type, 0)
1084
sizeof(PyComplexObject),
1086
complex_dealloc, /* tp_dealloc */
1090
0, /* tp_reserved */
1091
(reprfunc)complex_repr, /* tp_repr */
1092
&complex_as_number, /* tp_as_number */
1093
0, /* tp_as_sequence */
1094
0, /* tp_as_mapping */
1095
(hashfunc)complex_hash, /* tp_hash */
1097
(reprfunc)complex_str, /* tp_str */
1098
PyObject_GenericGetAttr, /* tp_getattro */
1099
0, /* tp_setattro */
1100
0, /* tp_as_buffer */
1101
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1102
complex_doc, /* tp_doc */
1103
0, /* tp_traverse */
1105
complex_richcompare, /* tp_richcompare */
1106
0, /* tp_weaklistoffset */
1108
0, /* tp_iternext */
1109
complex_methods, /* tp_methods */
1110
complex_members, /* tp_members */
1114
0, /* tp_descr_get */
1115
0, /* tp_descr_set */
1116
0, /* tp_dictoffset */
1118
PyType_GenericAlloc, /* tp_alloc */
1119
complex_new, /* tp_new */
1120
PyObject_Del, /* tp_free */