blob: cb081aac7bc8f34151d366e30ff60c5e1e3125e6 [file] [log] [blame]
Guido van Rossum96783941997-05-20 18:21:34 +00001
Guido van Rossumf9fca921996-01-12 00:47:05 +00002/* Complex object implementation */
3
4/* Borrows heavily from floatobject.c */
5
Guido van Rossum96783941997-05-20 18:21:34 +00006/* Submitted by Jim Hugunin */
7
Guido van Rossumf9fca921996-01-12 00:47:05 +00008#ifndef WITHOUT_COMPLEX
9
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +000011#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000012
Tim Peters70695122001-03-11 08:37:29 +000013/* Precisions used by repr() and str(), respectively.
14
15 The repr() precision (17 significant decimal digits) is the minimal number
16 that is guaranteed to have enough precision so that if the number is read
17 back in the exact same binary value is recreated. This is true for IEEE
18 floating point by design, and also happens to work for all other modern
19 hardware.
20
21 The str() precision is chosen so that in most cases, the rounding noise
22 created by various operations is suppressed, while giving plenty of
23 precision for practical use.
24*/
25
26#define PREC_REPR 17
27#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000028
29/* elementary operations on complex numbers */
30
Guido van Rossum9e720e31996-07-21 02:31:35 +000031static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
Tim Peters0f336042001-03-18 08:21:57 +000033Py_complex
34c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000035{
Guido van Rossum9e720e31996-07-21 02:31:35 +000036 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000037 r.real = a.real + b.real;
38 r.imag = a.imag + b.imag;
39 return r;
40}
41
Tim Peters0f336042001-03-18 08:21:57 +000042Py_complex
43c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000044{
Guido van Rossum9e720e31996-07-21 02:31:35 +000045 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000046 r.real = a.real - b.real;
47 r.imag = a.imag - b.imag;
48 return r;
49}
50
Tim Peters0f336042001-03-18 08:21:57 +000051Py_complex
52c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000053{
Guido van Rossum9e720e31996-07-21 02:31:35 +000054 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000055 r.real = -a.real;
56 r.imag = -a.imag;
57 return r;
58}
59
Tim Peters0f336042001-03-18 08:21:57 +000060Py_complex
61c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000062{
Guido van Rossum9e720e31996-07-21 02:31:35 +000063 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000064 r.real = a.real*b.real - a.imag*b.imag;
65 r.imag = a.real*b.imag + a.imag*b.real;
66 return r;
67}
68
Tim Peters0f336042001-03-18 08:21:57 +000069Py_complex
70c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000071{
Tim Peters0f336042001-03-18 08:21:57 +000072 /******************************************************************
73 This was the original algorithm. It's grossly prone to spurious
74 overflow and underflow errors. It also merrily divides by 0 despite
75 checking for that(!). The code still serves a doc purpose here, as
76 the algorithm following is a simple by-cases transformation of this
77 one:
78
Guido van Rossum9e720e31996-07-21 02:31:35 +000079 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000080 double d = b.real*b.real + b.imag*b.imag;
81 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000082 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000083 r.real = (a.real*b.real + a.imag*b.imag)/d;
84 r.imag = (a.imag*b.real - a.real*b.imag)/d;
85 return r;
Tim Peters0f336042001-03-18 08:21:57 +000086 ******************************************************************/
87
88 /* This algorithm is better, and is pretty obvious: first divide the
89 * numerators and denominator by whichever of {b.real, b.imag} has
90 * larger magnitude. The earliest reference I found was to CACM
91 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
92 * University). As usual, though, we're still ignoring all IEEE
93 * endcases.
94 */
95 Py_complex r; /* the result */
96 const double abs_breal = b.real < 0 ? -b.real : b.real;
97 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
98
99 if (abs_breal >= abs_bimag) {
100 /* divide tops and bottom by b.real */
101 if (abs_breal == 0.0) {
102 errno = EDOM;
103 r.real = r.imag = 0.0;
104 }
105 else {
106 const double ratio = b.imag / b.real;
107 const double denom = b.real + b.imag * ratio;
108 r.real = (a.real + a.imag * ratio) / denom;
109 r.imag = (a.imag - a.real * ratio) / denom;
110 }
111 }
112 else {
113 /* divide tops and bottom by b.imag */
114 const double ratio = b.real / b.imag;
115 const double denom = b.real * ratio + b.imag;
116 assert(b.imag != 0.0);
117 r.real = (a.real * ratio + a.imag) / denom;
118 r.imag = (a.imag * ratio - a.real) / denom;
119 }
120 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000121}
122
Tim Peters0f336042001-03-18 08:21:57 +0000123Py_complex
124c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000126 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000127 double vabs,len,at,phase;
128 if (b.real == 0. && b.imag == 0.) {
129 r.real = 1.;
130 r.imag = 0.;
131 }
132 else if (a.real == 0. && a.imag == 0.) {
133 if (b.imag != 0. || b.real < 0.)
Guido van Rossum96783941997-05-20 18:21:34 +0000134 errno = ERANGE;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000135 r.real = 0.;
136 r.imag = 0.;
137 }
138 else {
139 vabs = hypot(a.real,a.imag);
140 len = pow(vabs,b.real);
141 at = atan2(a.imag, a.real);
142 phase = at*b.real;
143 if (b.imag != 0.0) {
144 len /= exp(at*b.imag);
145 phase += b.imag*log(vabs);
146 }
147 r.real = len*cos(phase);
148 r.imag = len*sin(phase);
149 }
150 return r;
151}
152
Tim Peters0f336042001-03-18 08:21:57 +0000153static Py_complex
154c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000155{
Guido van Rossum926518b1996-08-19 19:30:45 +0000156 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000157 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000158 r = c_1;
159 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000160 while (mask > 0 && n >= mask) {
161 if (n & mask)
162 r = c_prod(r,p);
163 mask <<= 1;
164 p = c_prod(p,p);
165 }
166 return r;
167}
168
Tim Peters0f336042001-03-18 08:21:57 +0000169static Py_complex
170c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000171{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000172 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000173
174 if (n > 100 || n < -100) {
175 cn.real = (double) n;
176 cn.imag = 0.;
177 return c_pow(x,cn);
178 }
179 else if (n > 0)
180 return c_powu(x,n);
181 else
182 return c_quot(c_1,c_powu(x,-n));
183
184}
185
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186static PyObject *
187complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
188{
189 PyObject *op;
190
191 op = PyType_GenericAlloc(type, 0);
192 if (op != NULL)
193 ((PyComplexObject *)op)->cval = cval;
194 return op;
195}
196
Guido van Rossumf9fca921996-01-12 00:47:05 +0000197PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000198PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000199{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000200 register PyComplexObject *op;
201
202 /* PyObject_New is inlined */
203 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000204 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000206 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000207 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000209}
210
Tim Peters6d6c1a32001-08-02 04:15:00 +0000211static PyObject *
212complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
213{
214 Py_complex c;
215 c.real = real;
216 c.imag = imag;
217 return complex_subtype_from_c_complex(type, c);
218}
219
Guido van Rossumf9fca921996-01-12 00:47:05 +0000220PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000221PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000222{
223 Py_complex c;
224 c.real = real;
225 c.imag = imag;
226 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000227}
228
229double
Fred Drake4288c802000-07-09 04:36:04 +0000230PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000231{
232 if (PyComplex_Check(op)) {
233 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000234 }
235 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000236 return PyFloat_AsDouble(op);
237 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000238}
239
240double
Fred Drake4288c802000-07-09 04:36:04 +0000241PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000242{
243 if (PyComplex_Check(op)) {
244 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000245 }
246 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000247 return 0.0;
248 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000249}
250
Guido van Rossum9e720e31996-07-21 02:31:35 +0000251Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000252PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000253{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000254 Py_complex cv;
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000255 if (PyComplex_Check(op)) {
256 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000257 }
258 else {
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000259 cv.real = PyFloat_AsDouble(op);
260 cv.imag = 0.;
261 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000262 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000263}
264
Guido van Rossumf9fca921996-01-12 00:47:05 +0000265static void
Fred Drake4288c802000-07-09 04:36:04 +0000266complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000267{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000268 PyObject_DEL(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000269}
270
271
Guido van Rossum363078a1996-05-24 20:45:01 +0000272static void
Tim Peters70695122001-03-11 08:37:29 +0000273complex_to_buf(char *buf, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274{
275 if (v->cval.real == 0.)
Tim Peters70695122001-03-11 08:37:29 +0000276 sprintf(buf, "%.*gj", precision, v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000277 else
Tim Peters70695122001-03-11 08:37:29 +0000278 sprintf(buf, "(%.*g%+.*gj)", precision, v->cval.real,
279 precision, v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000280}
281
282static int
Fred Drake4288c802000-07-09 04:36:04 +0000283complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000284{
285 char buf[100];
Tim Peters70695122001-03-11 08:37:29 +0000286 complex_to_buf(buf, v,
287 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000288 fputs(buf, fp);
289 return 0;
290}
291
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000293complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000294{
295 char buf[100];
Tim Peters70695122001-03-11 08:37:29 +0000296 complex_to_buf(buf, v, PREC_REPR);
297 return PyString_FromString(buf);
298}
299
300static PyObject *
301complex_str(PyComplexObject *v)
302{
303 char buf[100];
304 complex_to_buf(buf, v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000306}
307
Guido van Rossumf9fca921996-01-12 00:47:05 +0000308static long
Fred Drake4288c802000-07-09 04:36:04 +0000309complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000310{
Tim Peters39dce292000-08-15 03:34:48 +0000311 long hashreal, hashimag, combined;
312 hashreal = _Py_HashDouble(v->cval.real);
313 if (hashreal == -1)
314 return -1;
315 hashimag = _Py_HashDouble(v->cval.imag);
316 if (hashimag == -1)
317 return -1;
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).
323 */
324 combined = hashreal + 1000003 * hashimag;
325 if (combined == -1)
326 combined = -2;
327 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000328}
329
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000331complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000332{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000333 Py_complex result;
334 PyFPE_START_PROTECT("complex_add", return 0)
335 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000336 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000338}
339
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000341complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000342{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000343 Py_complex result;
344 PyFPE_START_PROTECT("complex_sub", return 0)
345 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000346 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000348}
349
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000351complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000352{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000353 Py_complex result;
354 PyFPE_START_PROTECT("complex_mul", return 0)
355 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000356 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000358}
359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000361complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000362{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000363 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000364 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000365 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000366 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000367 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000368 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000370 return NULL;
371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000376complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000377{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000378 Py_complex div, mod;
Guido van Rossum96783941997-05-20 18:21:34 +0000379 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000380 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000381 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000383 return NULL;
384 }
385 div.real = floor(div.real); /* Use the floor of the real part. */
386 div.imag = 0.0;
387 mod = c_diff(v->cval, c_prod(w->cval, div));
388
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000390}
391
Guido van Rossumee09fc11996-09-11 13:55:55 +0000392
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000394complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000395{
396 Py_complex div, mod;
397 PyObject *d, *m, *z;
Guido van Rossum96783941997-05-20 18:21:34 +0000398 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000399 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000400 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000402 return NULL;
403 }
404 div.real = floor(div.real); /* Use the floor of the real part. */
405 div.imag = 0.0;
406 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 d = PyComplex_FromCComplex(div);
408 m = PyComplex_FromCComplex(mod);
409 z = Py_BuildValue("(OO)", d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000410 Py_XDECREF(d);
411 Py_XDECREF(m);
412 return z;
413}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000414
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000416complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000417{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000418 Py_complex p;
419 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000420 long int_exponent;
421
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 if ((PyObject *)z!=Py_None) {
423 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000424 return NULL;
425 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000426 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000427 errno = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 exponent = ((PyComplexObject*)w)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000429 int_exponent = (long)exponent.real;
430 if (exponent.imag == 0. && exponent.real == int_exponent)
431 p = c_powi(v->cval,int_exponent);
432 else
433 p = c_pow(v->cval,exponent);
434
Guido van Rossum45b83911997-03-14 04:32:50 +0000435 PyFPE_END_PROTECT(p)
Guido van Rossum96783941997-05-20 18:21:34 +0000436 if (errno == ERANGE) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 PyErr_SetString(PyExc_ValueError,
438 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000439 return NULL;
440 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000442}
443
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000445complex_int_div(PyComplexObject *v, PyComplexObject *w)
446{
447 PyObject *t, *r;
448
449 t = complex_divmod(v, w);
450 if (t != NULL) {
451 r = PyTuple_GET_ITEM(t, 0);
452 Py_INCREF(r);
453 Py_DECREF(t);
454 return r;
455 }
456 return NULL;
457}
458
459static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000460complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000461{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000462 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000463 neg.real = -v->cval.real;
464 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000466}
467
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000469complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000470{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 Py_INCREF(v);
472 return (PyObject *)v;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000473}
474
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000476complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000477{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000478 double result;
479 PyFPE_START_PROTECT("complex_abs", return 0)
480 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000481 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000483}
484
485static int
Fred Drake4288c802000-07-09 04:36:04 +0000486complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000487{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000488 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000489}
490
491static int
Fred Drake4288c802000-07-09 04:36:04 +0000492complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000493{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000494 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000495 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 if (PyInt_Check(*pw)) {
497 cval.real = (double)PyInt_AsLong(*pw);
498 *pw = PyComplex_FromCComplex(cval);
499 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000500 return 0;
501 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 else if (PyLong_Check(*pw)) {
503 cval.real = PyLong_AsDouble(*pw);
504 *pw = PyComplex_FromCComplex(cval);
505 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000506 return 0;
507 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508 else if (PyFloat_Check(*pw)) {
509 cval.real = PyFloat_AsDouble(*pw);
510 *pw = PyComplex_FromCComplex(cval);
511 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000512 return 0;
513 }
514 return 1; /* Can't do it */
515}
516
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000518complex_richcompare(PyObject *v, PyObject *w, int op)
519{
520 int c;
521 Py_complex i, j;
522 PyObject *res;
523
524 if (op != Py_EQ && op != Py_NE) {
525 PyErr_SetString(PyExc_TypeError,
526 "cannot compare complex numbers using <, <=, >, >=");
527 return NULL;
528 }
529
530 c = PyNumber_CoerceEx(&v, &w);
531 if (c < 0)
532 return NULL;
533 if (c > 0) {
534 Py_INCREF(Py_NotImplemented);
535 return Py_NotImplemented;
536 }
537 if (!PyComplex_Check(v) || !PyComplex_Check(w)) {
538 Py_DECREF(v);
539 Py_DECREF(w);
540 Py_INCREF(Py_NotImplemented);
541 return Py_NotImplemented;
542 }
543
544 i = ((PyComplexObject *)v)->cval;
545 j = ((PyComplexObject *)w)->cval;
546 Py_DECREF(v);
547 Py_DECREF(w);
548
549 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
550 res = Py_True;
551 else
552 res = Py_False;
553
554 Py_INCREF(res);
555 return res;
556}
557
558static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000559complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000560{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000562 "can't convert complex to int; use e.g. int(abs(z))");
563 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000564}
565
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000567complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000568{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000570 "can't convert complex to long; use e.g. long(abs(z))");
571 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000572}
573
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000575complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000576{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000578 "can't convert complex to float; use e.g. abs(z)");
579 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000580}
581
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000582static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000583complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000584{
Guido van Rossum926518b1996-08-19 19:30:45 +0000585 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000587 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000588 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000589}
590
591static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000592 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000593 {NULL, NULL} /* sentinel */
594};
595
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596static struct memberlist complex_members[] = {
597 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), 0},
598 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), 0},
599 {0},
600};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000601
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000604{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000605 extern double strtod(const char *, char **);
606 const char *s, *start;
607 char *end;
608 double x=0.0, y=0.0, z;
609 int got_re=0, got_im=0, done=0;
610 int digit_or_dot;
611 int sw_error=0;
612 int sign;
613 char buffer[256]; /* For errors */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614 int len;
615
616 if (PyString_Check(v)) {
617 s = PyString_AS_STRING(v);
618 len = PyString_GET_SIZE(v);
619 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000620#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 else if (PyUnicode_Check(v)) {
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000622 char s_buffer[256];
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
624 PyErr_SetString(PyExc_ValueError,
625 "complex() literal too large to convert");
626 return NULL;
627 }
628 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
629 PyUnicode_GET_SIZE(v),
630 s_buffer,
631 NULL))
632 return NULL;
633 s = s_buffer;
634 len = (int)strlen(s);
635 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000636#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 else if (PyObject_AsCharBuffer(v, &s, &len)) {
638 PyErr_SetString(PyExc_TypeError,
639 "complex() arg is not a string");
640 return NULL;
641 }
642
643 /* position on first nonblank */
644 start = s;
645 while (*s && isspace(Py_CHARMASK(*s)))
646 s++;
647 if (s[0] == '\0') {
648 PyErr_SetString(PyExc_ValueError,
649 "complex() arg is an empty string");
650 return NULL;
651 }
652
653 z = -1.0;
654 sign = 1;
655 do {
656
657 switch (*s) {
658
659 case '\0':
660 if (s-start != len) {
661 PyErr_SetString(
662 PyExc_ValueError,
663 "complex() arg contains a null byte");
664 return NULL;
665 }
666 if(!done) sw_error=1;
667 break;
668
669 case '-':
670 sign = -1;
671 /* Fallthrough */
672 case '+':
673 if (done) sw_error=1;
674 s++;
675 if ( *s=='\0'||*s=='+'||*s=='-' ||
676 isspace(Py_CHARMASK(*s)) ) sw_error=1;
677 break;
678
679 case 'J':
680 case 'j':
681 if (got_im || done) {
682 sw_error = 1;
683 break;
684 }
685 if (z<0.0) {
686 y=sign;
687 }
688 else{
689 y=sign*z;
690 }
691 got_im=1;
692 s++;
693 if (*s!='+' && *s!='-' )
694 done=1;
695 break;
696
697 default:
698 if (isspace(Py_CHARMASK(*s))) {
699 while (*s && isspace(Py_CHARMASK(*s)))
700 s++;
701 if (s[0] != '\0')
702 sw_error=1;
703 else
704 done = 1;
705 break;
706 }
707 digit_or_dot =
708 (*s=='.' || isdigit(Py_CHARMASK(*s)));
709 if (done||!digit_or_dot) {
710 sw_error=1;
711 break;
712 }
713 errno = 0;
714 PyFPE_START_PROTECT("strtod", return 0)
715 z = strtod(s, &end) ;
716 PyFPE_END_PROTECT(z)
717 if (errno != 0) {
718 sprintf(buffer,
719 "float() out of range: %.150s", s);
720 PyErr_SetString(
721 PyExc_ValueError,
722 buffer);
723 return NULL;
724 }
725 s=end;
726 if (*s=='J' || *s=='j') {
727
728 break;
729 }
730 if (got_re) {
731 sw_error=1;
732 break;
733 }
734
735 /* accept a real part */
736 x=sign*z;
737 got_re=1;
738 if (got_im) done=1;
739 z = -1.0;
740 sign = 1;
741 break;
742
743 } /* end of switch */
744
745 } while (*s!='\0' && !sw_error);
746
747 if (sw_error) {
748 PyErr_SetString(PyExc_ValueError,
749 "complex() arg is a malformed string");
750 return NULL;
751 }
752
753 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000754}
755
Tim Peters6d6c1a32001-08-02 04:15:00 +0000756static PyObject *
757complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
758{
759 PyObject *r, *i, *tmp;
760 PyNumberMethods *nbr, *nbi = NULL;
761 Py_complex cr, ci;
762 int own_r = 0;
763 static char *kwlist[] = {"real", "imag", 0};
764
765 r = Py_False;
766 i = NULL;
767 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
768 &r, &i))
769 return NULL;
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 ||
774 (i != 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");
779 return NULL;
780 }
781 /* XXX Hack to support classes with __complex__ method */
782 if (PyInstance_Check(r)) {
783 static PyObject *complexstr;
784 PyObject *f;
785 if (complexstr == NULL) {
786 complexstr = PyString_InternFromString("__complex__");
787 if (complexstr == NULL)
788 return NULL;
789 }
790 f = PyObject_GetAttr(r, complexstr);
791 if (f == NULL)
792 PyErr_Clear();
793 else {
794 PyObject *args = Py_BuildValue("()");
795 if (args == NULL)
796 return NULL;
797 r = PyEval_CallObject(f, args);
798 Py_DECREF(args);
799 Py_DECREF(f);
800 if (r == NULL)
801 return NULL;
802 own_r = 1;
803 }
804 }
805 if (PyComplex_Check(r)) {
806 cr = ((PyComplexObject*)r)->cval;
807 if (own_r) {
808 Py_DECREF(r);
809 }
810 }
811 else {
812 tmp = PyNumber_Float(r);
813 if (own_r) {
814 Py_DECREF(r);
815 }
816 if (tmp == NULL)
817 return NULL;
818 if (!PyFloat_Check(tmp)) {
819 PyErr_SetString(PyExc_TypeError,
820 "float(r) didn't return a float");
821 Py_DECREF(tmp);
822 return NULL;
823 }
824 cr.real = PyFloat_AsDouble(tmp);
825 Py_DECREF(tmp);
826 cr.imag = 0.0;
827 }
828 if (i == NULL) {
829 ci.real = 0.0;
830 ci.imag = 0.0;
831 }
832 else if (PyComplex_Check(i))
833 ci = ((PyComplexObject*)i)->cval;
834 else {
835 tmp = (*nbi->nb_float)(i);
836 if (tmp == NULL)
837 return NULL;
838 ci.real = PyFloat_AsDouble(tmp);
839 Py_DECREF(tmp);
840 ci.imag = 0.;
841 }
842 cr.real -= ci.imag;
843 cr.imag += ci.real;
844 return complex_subtype_from_c_complex(type, cr);
845}
846
847static char complex_doc[] =
848"complex(real[, imag]) -> complex number\n\
849\n\
850Create a complex number from a real part and an optional imaginary part.\n\
851This is equivalent to (real + imag*1j) where imag defaults to 0.";
852
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000853static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000854 (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 */
865 0, /* nb_invert */
866 0, /* nb_lshift */
867 0, /* nb_rshift */
868 0, /* nb_and */
869 0, /* nb_xor */
870 0, /* nb_or */
871 (coercion)complex_coerce, /* nb_coerce */
872 (unaryfunc)complex_int, /* nb_int */
873 (unaryfunc)complex_long, /* nb_long */
874 (unaryfunc)complex_float, /* nb_float */
875 0, /* nb_oct */
876 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000877 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 */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000892};
893
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000894PyTypeObject PyComplex_Type = {
895 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000896 0,
897 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000898 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000899 0,
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000900 (destructor)complex_dealloc, /* tp_dealloc */
901 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000902 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000903 0, /* tp_setattr */
904 0, /* tp_compare */
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 */
910 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +0000911 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000912 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000913 0, /* tp_setattro */
914 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000915 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
916 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000917 0, /* tp_traverse */
918 0, /* tp_clear */
919 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000920 0, /* tp_weaklistoffset */
921 0, /* tp_iter */
922 0, /* tp_iternext */
923 complex_methods, /* tp_methods */
924 complex_members, /* tp_members */
925 0, /* tp_getset */
926 0, /* tp_base */
927 0, /* tp_dict */
928 0, /* tp_descr_get */
929 0, /* tp_descr_set */
930 0, /* tp_dictoffset */
931 0, /* tp_init */
932 0, /* tp_alloc */
933 complex_new, /* tp_new */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000934};
935
936#endif