blob: 4367ff6570eb6e79bac669f42d0cf390bfe019fb [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 Rossumc0b618a1997-05-02 03:12:38 +00008#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00009#include "structmember.h"
Guido van Rossumf9fca921996-01-12 00:47:05 +000010
Guido van Rossum65ce6de2002-06-13 17:07:07 +000011#ifndef WITHOUT_COMPLEX
12
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.)
Tim Petersbab22be2002-03-22 02:48:46 +0000134 errno = EDOM;
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);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000141 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000142 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
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000202 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000203 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 Rossum9475a232001-10-05 20:51:39 +0000268 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000269}
270
271
Guido van Rossum363078a1996-05-24 20:45:01 +0000272static void
Barry Warsaw01d697a2001-11-28 20:50:56 +0000273complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274{
275 if (v->cval.real == 0.)
Barry Warsaw01d697a2001-11-28 20:50:56 +0000276 PyOS_snprintf(buf, bufsz, "%.*gj",
277 precision, v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000278 else
Barry Warsaw01d697a2001-11-28 20:50:56 +0000279 PyOS_snprintf(buf, bufsz, "(%.*g%+.*gj)",
280 precision, v->cval.real,
281 precision, v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000282}
283
284static int
Fred Drake4288c802000-07-09 04:36:04 +0000285complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000286{
287 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000288 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000289 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000290 fputs(buf, fp);
291 return 0;
292}
293
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000295complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000296{
297 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000298 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000299 return PyString_FromString(buf);
300}
301
302static PyObject *
303complex_str(PyComplexObject *v)
304{
305 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000306 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000308}
309
Guido van Rossumf9fca921996-01-12 00:47:05 +0000310static long
Fred Drake4288c802000-07-09 04:36:04 +0000311complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000312{
Tim Peters39dce292000-08-15 03:34:48 +0000313 long hashreal, hashimag, combined;
314 hashreal = _Py_HashDouble(v->cval.real);
315 if (hashreal == -1)
316 return -1;
317 hashimag = _Py_HashDouble(v->cval.imag);
318 if (hashimag == -1)
319 return -1;
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).
325 */
326 combined = hashreal + 1000003 * hashimag;
327 if (combined == -1)
328 combined = -2;
329 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000330}
331
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000333complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000334{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000335 Py_complex result;
336 PyFPE_START_PROTECT("complex_add", return 0)
337 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000338 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000340}
341
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000343complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000344{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000345 Py_complex result;
346 PyFPE_START_PROTECT("complex_sub", return 0)
347 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000348 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000350}
351
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000353complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000354{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000355 Py_complex result;
356 PyFPE_START_PROTECT("complex_mul", return 0)
357 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000358 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000360}
361
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000363complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000364{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000365 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000366 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000367 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000368 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000369 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000370 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000372 return NULL;
373 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000375}
376
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000378complex_classic_div(PyComplexObject *v, PyComplexObject *w)
379{
380 Py_complex quot;
381
Guido van Rossum1832de42001-09-04 03:51:09 +0000382 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000383 PyErr_Warn(PyExc_DeprecationWarning,
384 "classic complex division") < 0)
385 return NULL;
386
387 PyFPE_START_PROTECT("complex_classic_div", return 0)
388 errno = 0;
389 quot = c_quot(v->cval,w->cval);
390 PyFPE_END_PROTECT(quot)
391 if (errno == EDOM) {
392 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
393 return NULL;
394 }
395 return PyComplex_FromCComplex(quot);
396}
397
398static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000399complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000400{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000401 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000402
403 if (PyErr_Warn(PyExc_DeprecationWarning,
404 "complex divmod(), // and % are deprecated") < 0)
405 return NULL;
406
Guido van Rossum96783941997-05-20 18:21:34 +0000407 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000408 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000409 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000411 return NULL;
412 }
413 div.real = floor(div.real); /* Use the floor of the real part. */
414 div.imag = 0.0;
415 mod = c_diff(v->cval, c_prod(w->cval, div));
416
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000418}
419
Guido van Rossumee09fc11996-09-11 13:55:55 +0000420
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000422complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000423{
424 Py_complex div, mod;
425 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000426
427 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000428 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000429 return NULL;
430
Guido van Rossum96783941997-05-20 18:21:34 +0000431 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000432 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000433 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000435 return NULL;
436 }
437 div.real = floor(div.real); /* Use the floor of the real part. */
438 div.imag = 0.0;
439 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 d = PyComplex_FromCComplex(div);
441 m = PyComplex_FromCComplex(mod);
442 z = Py_BuildValue("(OO)", d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000443 Py_XDECREF(d);
444 Py_XDECREF(m);
445 return z;
446}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000447
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000449complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000450{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000451 Py_complex p;
452 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000453 long int_exponent;
454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 if ((PyObject *)z!=Py_None) {
456 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000457 return NULL;
458 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000459 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000460 errno = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461 exponent = ((PyComplexObject*)w)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000462 int_exponent = (long)exponent.real;
463 if (exponent.imag == 0. && exponent.real == int_exponent)
464 p = c_powi(v->cval,int_exponent);
465 else
466 p = c_pow(v->cval,exponent);
467
Guido van Rossum45b83911997-03-14 04:32:50 +0000468 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000469 Py_ADJUST_ERANGE2(p.real, p.imag);
470 if (errno == EDOM) {
471 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000473 return NULL;
474 }
Tim Petersbab22be2002-03-22 02:48:46 +0000475 else if (errno == ERANGE) {
476 PyErr_SetString(PyExc_OverflowError,
477 "complex exponentiaion");
478 return NULL;
479 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000481}
482
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000484complex_int_div(PyComplexObject *v, PyComplexObject *w)
485{
486 PyObject *t, *r;
487
488 t = complex_divmod(v, w);
489 if (t != NULL) {
490 r = PyTuple_GET_ITEM(t, 0);
491 Py_INCREF(r);
492 Py_DECREF(t);
493 return r;
494 }
495 return NULL;
496}
497
498static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000499complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000500{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000501 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000502 neg.real = -v->cval.real;
503 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000505}
506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000508complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509{
Tim Peters2400fa42001-09-12 19:12:49 +0000510 if (PyComplex_CheckExact(v)) {
511 Py_INCREF(v);
512 return (PyObject *)v;
513 }
514 else
515 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000516}
517
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000519complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000520{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000521 double result;
522 PyFPE_START_PROTECT("complex_abs", return 0)
523 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000524 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000526}
527
528static int
Fred Drake4288c802000-07-09 04:36:04 +0000529complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000530{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000531 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000532}
533
534static int
Fred Drake4288c802000-07-09 04:36:04 +0000535complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000536{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000537 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000538 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 if (PyInt_Check(*pw)) {
540 cval.real = (double)PyInt_AsLong(*pw);
541 *pw = PyComplex_FromCComplex(cval);
542 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000543 return 0;
544 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 else if (PyLong_Check(*pw)) {
546 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000547 if (cval.real == -1.0 && PyErr_Occurred())
548 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 *pw = PyComplex_FromCComplex(cval);
550 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000551 return 0;
552 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553 else if (PyFloat_Check(*pw)) {
554 cval.real = PyFloat_AsDouble(*pw);
555 *pw = PyComplex_FromCComplex(cval);
556 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000557 return 0;
558 }
Guido van Rossum63805962001-09-19 01:13:10 +0000559 else if (PyComplex_Check(*pw)) {
560 Py_INCREF(*pv);
561 Py_INCREF(*pw);
562 return 0;
563 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000564 return 1; /* Can't do it */
565}
566
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000568complex_richcompare(PyObject *v, PyObject *w, int op)
569{
570 int c;
571 Py_complex i, j;
572 PyObject *res;
573
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000574 c = PyNumber_CoerceEx(&v, &w);
575 if (c < 0)
576 return NULL;
577 if (c > 0) {
578 Py_INCREF(Py_NotImplemented);
579 return Py_NotImplemented;
580 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000581 /* Make sure both arguments are complex. */
582 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000583 Py_DECREF(v);
584 Py_DECREF(w);
585 Py_INCREF(Py_NotImplemented);
586 return Py_NotImplemented;
587 }
588
589 i = ((PyComplexObject *)v)->cval;
590 j = ((PyComplexObject *)w)->cval;
591 Py_DECREF(v);
592 Py_DECREF(w);
593
Guido van Rossum22056422001-09-24 17:52:04 +0000594 if (op != Py_EQ && op != Py_NE) {
595 PyErr_SetString(PyExc_TypeError,
596 "cannot compare complex numbers using <, <=, >, >=");
597 return NULL;
598 }
599
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000600 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
601 res = Py_True;
602 else
603 res = Py_False;
604
605 Py_INCREF(res);
606 return res;
607}
608
609static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000610complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000611{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000613 "can't convert complex to int; use e.g. int(abs(z))");
614 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000615}
616
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000618complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000619{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000620 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000621 "can't convert complex to long; use e.g. long(abs(z))");
622 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000623}
624
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000626complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000627{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000628 PyErr_SetString(PyExc_TypeError,
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000629 "can't convert complex to float; use e.g. abs(z)");
630 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000631}
632
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000633static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000634complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000635{
Guido van Rossum926518b1996-08-19 19:30:45 +0000636 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000637 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000638 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000640}
641
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000642static PyObject *
643complex_getnewargs(PyComplexObject *v)
644{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000645 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000646}
647
Guido van Rossumf9fca921996-01-12 00:47:05 +0000648static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000649 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000650 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000651 {NULL, NULL} /* sentinel */
652};
653
Guido van Rossum6f799372001-09-20 20:46:19 +0000654static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000655 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000656 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000657 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000658 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000659 {0},
660};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000664{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665 extern double strtod(const char *, char **);
666 const char *s, *start;
667 char *end;
668 double x=0.0, y=0.0, z;
669 int got_re=0, got_im=0, done=0;
670 int digit_or_dot;
671 int sw_error=0;
672 int sign;
673 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000674#ifdef Py_USING_UNICODE
675 char s_buffer[256];
676#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000677 int len;
678
679 if (PyString_Check(v)) {
680 s = PyString_AS_STRING(v);
681 len = PyString_GET_SIZE(v);
682 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000683#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000684 else if (PyUnicode_Check(v)) {
685 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
686 PyErr_SetString(PyExc_ValueError,
687 "complex() literal too large to convert");
688 return NULL;
689 }
690 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
691 PyUnicode_GET_SIZE(v),
692 s_buffer,
693 NULL))
694 return NULL;
695 s = s_buffer;
696 len = (int)strlen(s);
697 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000698#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000699 else if (PyObject_AsCharBuffer(v, &s, &len)) {
700 PyErr_SetString(PyExc_TypeError,
701 "complex() arg is not a string");
702 return NULL;
703 }
704
705 /* position on first nonblank */
706 start = s;
707 while (*s && isspace(Py_CHARMASK(*s)))
708 s++;
709 if (s[0] == '\0') {
710 PyErr_SetString(PyExc_ValueError,
711 "complex() arg is an empty string");
712 return NULL;
713 }
714
715 z = -1.0;
716 sign = 1;
717 do {
718
719 switch (*s) {
720
721 case '\0':
722 if (s-start != len) {
723 PyErr_SetString(
724 PyExc_ValueError,
725 "complex() arg contains a null byte");
726 return NULL;
727 }
728 if(!done) sw_error=1;
729 break;
730
731 case '-':
732 sign = -1;
733 /* Fallthrough */
734 case '+':
735 if (done) sw_error=1;
736 s++;
737 if ( *s=='\0'||*s=='+'||*s=='-' ||
738 isspace(Py_CHARMASK(*s)) ) sw_error=1;
739 break;
740
741 case 'J':
742 case 'j':
743 if (got_im || done) {
744 sw_error = 1;
745 break;
746 }
747 if (z<0.0) {
748 y=sign;
749 }
750 else{
751 y=sign*z;
752 }
753 got_im=1;
754 s++;
755 if (*s!='+' && *s!='-' )
756 done=1;
757 break;
758
759 default:
760 if (isspace(Py_CHARMASK(*s))) {
761 while (*s && isspace(Py_CHARMASK(*s)))
762 s++;
763 if (s[0] != '\0')
764 sw_error=1;
765 else
766 done = 1;
767 break;
768 }
769 digit_or_dot =
770 (*s=='.' || isdigit(Py_CHARMASK(*s)));
771 if (done||!digit_or_dot) {
772 sw_error=1;
773 break;
774 }
775 errno = 0;
776 PyFPE_START_PROTECT("strtod", return 0)
777 z = strtod(s, &end) ;
778 PyFPE_END_PROTECT(z)
779 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000780 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000781 "float() out of range: %.150s", s);
782 PyErr_SetString(
783 PyExc_ValueError,
784 buffer);
785 return NULL;
786 }
787 s=end;
788 if (*s=='J' || *s=='j') {
789
790 break;
791 }
792 if (got_re) {
793 sw_error=1;
794 break;
795 }
796
797 /* accept a real part */
798 x=sign*z;
799 got_re=1;
800 if (got_im) done=1;
801 z = -1.0;
802 sign = 1;
803 break;
804
805 } /* end of switch */
806
Tim Peters077f2712002-04-14 22:04:03 +0000807 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000808
809 if (sw_error) {
810 PyErr_SetString(PyExc_ValueError,
811 "complex() arg is a malformed string");
812 return NULL;
813 }
814
815 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000816}
817
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818static PyObject *
819complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
820{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000821 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000822 PyNumberMethods *nbr, *nbi = NULL;
823 Py_complex cr, ci;
824 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000825 static PyObject *complexstr;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000826 static char *kwlist[] = {"real", "imag", 0};
827
828 r = Py_False;
829 i = NULL;
830 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
831 &r, &i))
832 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000833
Walter Dörwald5ecd6c42003-06-17 20:22:24 +0000834 /* Special-case for single argument that is already complex */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000835 if (PyComplex_CheckExact(r) && i == NULL &&
836 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000837 /* Note that we can't know whether it's safe to return
838 a complex *subclass* instance as-is, hence the restriction
839 to exact complexes here. */
840 Py_INCREF(r);
841 return r;
842 }
Fred Drake526c7a02001-12-13 19:52:22 +0000843 if (PyString_Check(r) || PyUnicode_Check(r)) {
844 if (i != NULL) {
845 PyErr_SetString(PyExc_TypeError,
846 "complex() can't take second arg"
847 " if first is a string");
848 return NULL;
849 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000851 }
852 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
853 PyErr_SetString(PyExc_TypeError,
854 "complex() second arg can't be a string");
855 return NULL;
856 }
Tim Peters2400fa42001-09-12 19:12:49 +0000857
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000858 /* XXX Hack to support classes with __complex__ method */
859 if (complexstr == NULL) {
860 complexstr = PyString_InternFromString("__complex__");
861 if (complexstr == NULL)
862 return NULL;
863 }
864 f = PyObject_GetAttr(r, complexstr);
865 if (f == NULL)
866 PyErr_Clear();
867 else {
868 PyObject *args = Py_BuildValue("()");
869 if (args == NULL)
870 return NULL;
871 r = PyEval_CallObject(f, args);
872 Py_DECREF(args);
873 Py_DECREF(f);
874 if (r == NULL)
875 return NULL;
876 own_r = 1;
877 }
Tim Peters2400fa42001-09-12 19:12:49 +0000878 nbr = r->ob_type->tp_as_number;
879 if (i != NULL)
880 nbi = i->ob_type->tp_as_number;
881 if (nbr == NULL || nbr->nb_float == NULL ||
882 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000884 "complex() argument must be a string or a number");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000885 return NULL;
886 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000888 /* Note that if r is of a complex subtype, we're only
889 retaining its real & imag parts here, and the return
890 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 cr = ((PyComplexObject*)r)->cval;
892 if (own_r) {
893 Py_DECREF(r);
894 }
895 }
896 else {
897 tmp = PyNumber_Float(r);
898 if (own_r) {
899 Py_DECREF(r);
900 }
901 if (tmp == NULL)
902 return NULL;
903 if (!PyFloat_Check(tmp)) {
904 PyErr_SetString(PyExc_TypeError,
905 "float(r) didn't return a float");
906 Py_DECREF(tmp);
907 return NULL;
908 }
909 cr.real = PyFloat_AsDouble(tmp);
910 Py_DECREF(tmp);
911 cr.imag = 0.0;
912 }
913 if (i == NULL) {
914 ci.real = 0.0;
915 ci.imag = 0.0;
916 }
917 else if (PyComplex_Check(i))
918 ci = ((PyComplexObject*)i)->cval;
919 else {
920 tmp = (*nbi->nb_float)(i);
921 if (tmp == NULL)
922 return NULL;
923 ci.real = PyFloat_AsDouble(tmp);
924 Py_DECREF(tmp);
925 ci.imag = 0.;
926 }
927 cr.real -= ci.imag;
928 cr.imag += ci.real;
929 return complex_subtype_from_c_complex(type, cr);
930}
931
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000932PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000933"complex(real[, imag]) -> complex number\n"
934"\n"
935"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000937
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000938static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000939 (binaryfunc)complex_add, /* nb_add */
940 (binaryfunc)complex_sub, /* nb_subtract */
941 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +0000942 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000943 (binaryfunc)complex_remainder, /* nb_remainder */
944 (binaryfunc)complex_divmod, /* nb_divmod */
945 (ternaryfunc)complex_pow, /* nb_power */
946 (unaryfunc)complex_neg, /* nb_negative */
947 (unaryfunc)complex_pos, /* nb_positive */
948 (unaryfunc)complex_abs, /* nb_absolute */
949 (inquiry)complex_nonzero, /* nb_nonzero */
950 0, /* nb_invert */
951 0, /* nb_lshift */
952 0, /* nb_rshift */
953 0, /* nb_and */
954 0, /* nb_xor */
955 0, /* nb_or */
956 (coercion)complex_coerce, /* nb_coerce */
957 (unaryfunc)complex_int, /* nb_int */
958 (unaryfunc)complex_long, /* nb_long */
959 (unaryfunc)complex_float, /* nb_float */
960 0, /* nb_oct */
961 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000962 0, /* nb_inplace_add */
963 0, /* nb_inplace_subtract */
964 0, /* nb_inplace_multiply*/
965 0, /* nb_inplace_divide */
966 0, /* nb_inplace_remainder */
967 0, /* nb_inplace_power */
968 0, /* nb_inplace_lshift */
969 0, /* nb_inplace_rshift */
970 0, /* nb_inplace_and */
971 0, /* nb_inplace_xor */
972 0, /* nb_inplace_or */
973 (binaryfunc)complex_int_div, /* nb_floor_divide */
974 (binaryfunc)complex_div, /* nb_true_divide */
975 0, /* nb_inplace_floor_divide */
976 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000977};
978
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979PyTypeObject PyComplex_Type = {
980 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000981 0,
982 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000983 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000984 0,
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000985 (destructor)complex_dealloc, /* tp_dealloc */
986 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000988 0, /* tp_setattr */
989 0, /* tp_compare */
990 (reprfunc)complex_repr, /* tp_repr */
991 &complex_as_number, /* tp_as_number */
992 0, /* tp_as_sequence */
993 0, /* tp_as_mapping */
994 (hashfunc)complex_hash, /* tp_hash */
995 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +0000996 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000998 0, /* tp_setattro */
999 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1001 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001002 0, /* tp_traverse */
1003 0, /* tp_clear */
1004 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001005 0, /* tp_weaklistoffset */
1006 0, /* tp_iter */
1007 0, /* tp_iternext */
1008 complex_methods, /* tp_methods */
1009 complex_members, /* tp_members */
1010 0, /* tp_getset */
1011 0, /* tp_base */
1012 0, /* tp_dict */
1013 0, /* tp_descr_get */
1014 0, /* tp_descr_set */
1015 0, /* tp_dictoffset */
1016 0, /* tp_init */
1017 0, /* tp_alloc */
1018 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001019 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001020};
1021
1022#endif