blob: 212fd34e07e7128338c58131f98867614a7d0591 [file] [log] [blame]
Guido van Rossumf9fca921996-01-12 00:47:05 +00001/* Complex object implementation */
2
3/* Borrows heavily from floatobject.c */
4
5#ifndef WITHOUT_COMPLEX
6
7#include "allobjects.h"
8#include "modsupport.h"
9
10#include <errno.h>
11#include "mymath.h"
12
13#ifdef i860
14/* Cray APP has bogus definition of HUGE_VAL in <math.h> */
15#undef HUGE_VAL
16#endif
17
18#ifdef HUGE_VAL
19#define CHECK(x) if (errno != 0) ; \
20 else if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \
21 else errno = ERANGE
22#else
23#define CHECK(x) /* Don't know how to check */
24#endif
25
26#ifdef HAVE_LIMITS_H
27#include <limits.h>
28#endif
29
30#ifndef LONG_MAX
31#define LONG_MAX 0X7FFFFFFFL
32#endif
33
34#ifndef LONG_MIN
35#define LONG_MIN (-LONG_MAX-1)
36#endif
37
38#ifdef __NeXT__
39#ifdef __sparc__
40/*
41 * This works around a bug in the NS/Sparc 3.3 pre-release
42 * limits.h header file.
43 * 10-Feb-1995 bwarsaw@cnri.reston.va.us
44 */
45#undef LONG_MIN
46#define LONG_MIN (-LONG_MAX-1)
47#endif
48#endif
49
50#if !defined(__STDC__) && !defined(macintosh)
51extern double fmod PROTO((double, double));
52extern double pow PROTO((double, double));
53#endif
54
55
56/* elementary operations on complex numbers */
57
Guido van Rossum363078a1996-05-24 20:45:01 +000058static int c_error;
Guido van Rossum9e720e31996-07-21 02:31:35 +000059static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000060
Guido van Rossum9e720e31996-07-21 02:31:35 +000061Py_complex c_sum(a,b)
62 Py_complex a,b;
Guido van Rossumf9fca921996-01-12 00:47:05 +000063{
Guido van Rossum9e720e31996-07-21 02:31:35 +000064 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000065 r.real = a.real + b.real;
66 r.imag = a.imag + b.imag;
67 return r;
68}
69
Guido van Rossum9e720e31996-07-21 02:31:35 +000070Py_complex c_diff(a,b)
71 Py_complex a,b;
Guido van Rossumf9fca921996-01-12 00:47:05 +000072{
Guido van Rossum9e720e31996-07-21 02:31:35 +000073 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000074 r.real = a.real - b.real;
75 r.imag = a.imag - b.imag;
76 return r;
77}
78
Guido van Rossum9e720e31996-07-21 02:31:35 +000079Py_complex c_neg(a)
80 Py_complex a;
Guido van Rossumf9fca921996-01-12 00:47:05 +000081{
Guido van Rossum9e720e31996-07-21 02:31:35 +000082 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000083 r.real = -a.real;
84 r.imag = -a.imag;
85 return r;
86}
87
Guido van Rossum9e720e31996-07-21 02:31:35 +000088Py_complex c_prod(a,b)
89 Py_complex a,b;
Guido van Rossumf9fca921996-01-12 00:47:05 +000090{
Guido van Rossum9e720e31996-07-21 02:31:35 +000091 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000092 r.real = a.real*b.real - a.imag*b.imag;
93 r.imag = a.real*b.imag + a.imag*b.real;
94 return r;
95}
96
Guido van Rossum9e720e31996-07-21 02:31:35 +000097Py_complex c_quot(a,b)
98 Py_complex a,b;
Guido van Rossumf9fca921996-01-12 00:47:05 +000099{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000100 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000101 double d = b.real*b.real + b.imag*b.imag;
102 if (d == 0.)
103 c_error = 1;
104 r.real = (a.real*b.real + a.imag*b.imag)/d;
105 r.imag = (a.imag*b.real - a.real*b.imag)/d;
106 return r;
107}
108
Guido van Rossum9e720e31996-07-21 02:31:35 +0000109Py_complex c_pow(a,b)
110 Py_complex a,b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000111{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000112 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000113 double vabs,len,at,phase;
114 if (b.real == 0. && b.imag == 0.) {
115 r.real = 1.;
116 r.imag = 0.;
117 }
118 else if (a.real == 0. && a.imag == 0.) {
119 if (b.imag != 0. || b.real < 0.)
120 c_error = 2;
121 r.real = 0.;
122 r.imag = 0.;
123 }
124 else {
125 vabs = hypot(a.real,a.imag);
126 len = pow(vabs,b.real);
127 at = atan2(a.imag, a.real);
128 phase = at*b.real;
129 if (b.imag != 0.0) {
130 len /= exp(at*b.imag);
131 phase += b.imag*log(vabs);
132 }
133 r.real = len*cos(phase);
134 r.imag = len*sin(phase);
135 }
136 return r;
137}
138
Guido van Rossum9e720e31996-07-21 02:31:35 +0000139static Py_complex c_powu(x, n)
140 Py_complex x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000141 long n;
142{
Guido van Rossum926518b1996-08-19 19:30:45 +0000143 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000144 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000145 r = c_1;
146 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000147 while (mask > 0 && n >= mask) {
148 if (n & mask)
149 r = c_prod(r,p);
150 mask <<= 1;
151 p = c_prod(p,p);
152 }
153 return r;
154}
155
Guido van Rossum9e720e31996-07-21 02:31:35 +0000156static Py_complex c_powi(x, n)
157 Py_complex x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000158 long n;
159{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000160 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000161
162 if (n > 100 || n < -100) {
163 cn.real = (double) n;
164 cn.imag = 0.;
165 return c_pow(x,cn);
166 }
167 else if (n > 0)
168 return c_powu(x,n);
169 else
170 return c_quot(c_1,c_powu(x,-n));
171
172}
173
174PyObject *
Guido van Rossum926518b1996-08-19 19:30:45 +0000175PyComplex_FromCComplex(cval)
176 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000177{
Guido van Rossum926518b1996-08-19 19:30:45 +0000178 register complexobject *op =
179 (complexobject *) malloc(sizeof(complexobject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000180 if (op == NULL)
181 return err_nomem();
182 op->ob_type = &Complextype;
183 op->cval = cval;
184 NEWREF(op);
185 return (object *) op;
186}
187
188PyObject *
Guido van Rossum926518b1996-08-19 19:30:45 +0000189PyComplex_FromDoubles(real, imag)
190 double real, imag;
191{
192 Py_complex c;
193 c.real = real;
194 c.imag = imag;
195 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000196}
197
198double
Guido van Rossum926518b1996-08-19 19:30:45 +0000199PyComplex_RealAsDouble(op)
200 PyObject *op;
201{
202 if (PyComplex_Check(op)) {
203 return ((PyComplexObject *)op)->cval.real;
204 } else {
205 return PyFloat_AsDouble(op);
206 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000207}
208
209double
Guido van Rossum926518b1996-08-19 19:30:45 +0000210PyComplex_ImagAsDouble(op)
211 PyObject *op;
212{
213 if (PyComplex_Check(op)) {
214 return ((PyComplexObject *)op)->cval.imag;
215 } else {
216 return 0.0;
217 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000218}
219
Guido van Rossum9e720e31996-07-21 02:31:35 +0000220Py_complex
Guido van Rossum926518b1996-08-19 19:30:45 +0000221PyComplex_AsCComplex(op)
222 PyObject *op;
223{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000224 Py_complex cv;
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000225 if (PyComplex_Check(op)) {
226 return ((PyComplexObject *)op)->cval;
227 } else {
228 cv.real = PyFloat_AsDouble(op);
229 cv.imag = 0.;
230 return cv;
231 }
232}
233
Guido van Rossumf9fca921996-01-12 00:47:05 +0000234static void
235complex_dealloc(op)
236 object *op;
237{
238 DEL(op);
239}
240
241
Guido van Rossum363078a1996-05-24 20:45:01 +0000242static void
Guido van Rossumf9fca921996-01-12 00:47:05 +0000243complex_buf_repr(buf, v)
244 char *buf;
245 complexobject *v;
246{
247 if (v->cval.real == 0.)
Guido van Rossum72418791996-01-25 16:21:31 +0000248 sprintf(buf, "%.12gj", v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000249 else
Guido van Rossum72418791996-01-25 16:21:31 +0000250 sprintf(buf, "(%.12g%+.12gj)", v->cval.real, v->cval.imag);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000251}
252
253static int
254complex_print(v, fp, flags)
255 complexobject *v;
256 FILE *fp;
257 int flags; /* Not used but required by interface */
258{
259 char buf[100];
260 complex_buf_repr(buf, v);
261 fputs(buf, fp);
262 return 0;
263}
264
265static object *
266complex_repr(v)
267 complexobject *v;
268{
269 char buf[100];
270 complex_buf_repr(buf, v);
271 return newstringobject(buf);
272}
273
274static int
275complex_compare(v, w)
276 complexobject *v, *w;
277{
278/* Note: "greater" and "smaller" have no meaning for complex numbers,
279 but Python requires that they be defined nevertheless. */
Guido van Rossum926518b1996-08-19 19:30:45 +0000280 Py_complex i, j;
281 i = v->cval;
282 j = w->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000283 if (i.real == j.real && i.imag == j.imag)
284 return 0;
285 else if (i.real != j.real)
286 return (i.real < j.real) ? -1 : 1;
287 else
288 return (i.imag < j.imag) ? -1 : 1;
289}
290
291static long
292complex_hash(v)
293 complexobject *v;
294{
295 double intpart, fractpart;
296 int expo;
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000297 long hipart, x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000298 /* This is designed so that Python numbers with the same
299 value hash to the same value, otherwise comparisons
300 of mapping keys will turn out weird */
301
302#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
303{
304 extended e;
305 fractpart = modf(v->cval.real, &e);
306 intpart = e;
307}
308#else
309 fractpart = modf(v->cval.real, &intpart);
310#endif
311
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000312 if (fractpart == 0.0 && v->cval.imag == 0.0) {
Guido van Rossumf9fca921996-01-12 00:47:05 +0000313 if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
314 /* Convert to long int and use its hash... */
315 object *w = dnewlongobject(v->cval.real);
316 if (w == NULL)
317 return -1;
318 x = hashobject(w);
319 DECREF(w);
320 return x;
321 }
322 x = (long)intpart;
323 }
324 else {
325 fractpart = frexp(fractpart, &expo);
Guido van Rossum919cf1a1997-01-11 19:26:21 +0000326 fractpart = fractpart * 2147483648.0; /* 2**31 */
327 hipart = (long)fractpart; /* Take the top 32 bits */
328 fractpart = (fractpart - (double)hipart) * 2147483648.0;
329 /* Get the next 32 bits */
330 x = hipart + (long)fractpart + (long)intpart + (expo << 15);
331 /* Combine everything */
332
333 if (v->cval.imag != 0.0) { /* Hash the imaginary part */
334 /* XXX Note that this hashes complex(x, y)
335 to the same value as complex(y, x).
336 Still better than it used to be :-) */
337#ifdef MPW
338 {
339 extended e;
340 fractpart = modf(v->cval.imag, &e);
341 intpart = e;
342 }
343#else
344 fractpart = modf(v->cval.imag, &intpart);
345#endif
346 fractpart = frexp(fractpart, &expo);
347 fractpart = fractpart * 2147483648.0; /* 2**31 */
348 hipart = (long)fractpart; /* Take the top 32 bits */
349 fractpart =
350 (fractpart - (double)hipart) * 2147483648.0;
351 /* Get the next 32 bits */
352 x ^= hipart + (long)fractpart +
353 (long)intpart + (expo << 15);
354 /* Combine everything */
355 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000356 }
357 if (x == -1)
358 x = -2;
359 return x;
360}
361
362static object *
363complex_add(v, w)
364 complexobject *v;
365 complexobject *w;
366{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000367 Py_complex result;
368 PyFPE_START_PROTECT("complex_add", return 0)
369 result = c_sum(v->cval,w->cval);
370 PyFPE_END_PROTECT
371 return newcomplexobject(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000372}
373
374static object *
375complex_sub(v, w)
376 complexobject *v;
377 complexobject *w;
378{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000379 Py_complex result;
380 PyFPE_START_PROTECT("complex_sub", return 0)
381 result = c_diff(v->cval,w->cval);
382 PyFPE_END_PROTECT
383 return newcomplexobject(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000384}
385
386static object *
387complex_mul(v, w)
388 complexobject *v;
389 complexobject *w;
390{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000391 Py_complex result;
392 PyFPE_START_PROTECT("complex_mul", return 0)
393 result = c_prod(v->cval,w->cval);
394 PyFPE_END_PROTECT
395 return newcomplexobject(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000396}
397
398static object *
399complex_div(v, w)
400 complexobject *v;
401 complexobject *w;
402{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000403 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000404 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000405 c_error = 0;
406 quot = c_quot(v->cval,w->cval);
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000407 PyFPE_END_PROTECT
Guido van Rossumf9fca921996-01-12 00:47:05 +0000408 if (c_error == 1) {
Guido van Rossum3be12e91996-09-12 20:56:18 +0000409 err_setstr(ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000410 return NULL;
411 }
412 return newcomplexobject(quot);
413}
414
Guido van Rossumee09fc11996-09-11 13:55:55 +0000415static object *
416complex_remainder(v, w)
417 complexobject *v;
418 complexobject *w;
419{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000420 Py_complex div, mod;
Guido van Rossum24048581996-09-12 21:02:02 +0000421 c_error = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000422 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
423 if (c_error == 1) {
424 err_setstr(ZeroDivisionError, "complex remainder");
425 return NULL;
426 }
427 div.real = floor(div.real); /* Use the floor of the real part. */
428 div.imag = 0.0;
429 mod = c_diff(v->cval, c_prod(w->cval, div));
430
431 return newcomplexobject(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000432}
433
Guido van Rossumee09fc11996-09-11 13:55:55 +0000434
Guido van Rossum3be12e91996-09-12 20:56:18 +0000435static object *
436complex_divmod(v, w)
437 complexobject *v;
438 complexobject *w;
439{
440 Py_complex div, mod;
441 PyObject *d, *m, *z;
Guido van Rossum24048581996-09-12 21:02:02 +0000442 c_error = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000443 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
444 if (c_error == 1) {
445 err_setstr(ZeroDivisionError, "complex divmod()");
446 return NULL;
447 }
448 div.real = floor(div.real); /* Use the floor of the real part. */
449 div.imag = 0.0;
450 mod = c_diff(v->cval, c_prod(w->cval, div));
451 d = newcomplexobject(div);
452 m = newcomplexobject(mod);
453 z = mkvalue("(OO)", d, m);
454 Py_XDECREF(d);
455 Py_XDECREF(m);
456 return z;
457}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000458
459static object *
460complex_pow(v, w, z)
461 complexobject *v;
462 object *w;
463 complexobject *z;
464{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000465 Py_complex p;
466 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000467 long int_exponent;
468
469 if ((object *)z!=None) {
470 err_setstr(ValueError, "complex modulo");
471 return NULL;
472 }
473
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000474 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000475 c_error = 0;
476 exponent = ((complexobject*)w)->cval;
477 int_exponent = (long)exponent.real;
478 if (exponent.imag == 0. && exponent.real == int_exponent)
479 p = c_powi(v->cval,int_exponent);
480 else
481 p = c_pow(v->cval,exponent);
482
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000483 PyFPE_END_PROTECT
Guido van Rossumf9fca921996-01-12 00:47:05 +0000484 if (c_error == 2) {
485 err_setstr(ValueError, "0.0 to a negative or complex power");
486 return NULL;
487 }
488
489 return newcomplexobject(p);
490}
491
492static object *
493complex_neg(v)
494 complexobject *v;
495{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000496 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000497 neg.real = -v->cval.real;
498 neg.imag = -v->cval.imag;
499 return newcomplexobject(neg);
500}
501
502static object *
503complex_pos(v)
504 complexobject *v;
505{
506 INCREF(v);
507 return (object *)v;
508}
509
510static object *
511complex_abs(v)
512 complexobject *v;
513{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000514 double result;
515 PyFPE_START_PROTECT("complex_abs", return 0)
516 result = hypot(v->cval.real,v->cval.imag);
517 PyFPE_END_PROTECT
518 return newfloatobject(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000519}
520
521static int
522complex_nonzero(v)
523 complexobject *v;
524{
525 return v->cval.real != 0.0 && v->cval.imag != 0.0;
526}
527
528static int
529complex_coerce(pv, pw)
530 object **pv;
531 object **pw;
532{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000533 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000534 cval.imag = 0.;
535 if (is_intobject(*pw)) {
536 cval.real = (double)getintvalue(*pw);
537 *pw = newcomplexobject(cval);
538 INCREF(*pv);
539 return 0;
540 }
541 else if (is_longobject(*pw)) {
542 cval.real = dgetlongvalue(*pw);
543 *pw = newcomplexobject(cval);
544 INCREF(*pv);
545 return 0;
546 }
547 else if (is_floatobject(*pw)) {
548 cval.real = getfloatvalue(*pw);
549 *pw = newcomplexobject(cval);
550 INCREF(*pv);
551 return 0;
552 }
553 return 1; /* Can't do it */
554}
555
556static object *
557complex_int(v)
558 object *v;
559{
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000560 err_setstr(TypeError,
561 "can't convert complex to int; use e.g. int(abs(z))");
562 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000563}
564
565static object *
566complex_long(v)
567 object *v;
568{
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000569 err_setstr(TypeError,
570 "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
574static object *
575complex_float(v)
576 object *v;
577{
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000578 err_setstr(TypeError,
579 "can't convert complex to float; use e.g. abs(z)");
580 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000581}
582
Guido van Rossumf9fca921996-01-12 00:47:05 +0000583static object *
584complex_conjugate(self)
585 object *self;
586{
Guido van Rossum926518b1996-08-19 19:30:45 +0000587 Py_complex c;
588 c = ((complexobject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000589 c.imag = -c.imag;
590 return newcomplexobject(c);
591}
592
593static PyMethodDef complex_methods[] = {
594 {"conjugate", (PyCFunction)complex_conjugate, 1},
595 {NULL, NULL} /* sentinel */
596};
597
598
599static object *
600complex_getattr(self, name)
601 complexobject *self;
602 char *name;
603{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000604 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000605 if (strcmp(name, "real") == 0)
606 return (object *)newfloatobject(self->cval.real);
607 else if (strcmp(name, "imag") == 0)
608 return (object *)newfloatobject(self->cval.imag);
609 else if (strcmp(name, "conj") == 0) {
610 cval.real = self->cval.real;
611 cval.imag = -self->cval.imag;
612 return (object *)newcomplexobject(cval);
613 }
614 return findmethod(complex_methods, (object *)self, name);
615}
616
617static number_methods complex_as_number = {
618 (binaryfunc)complex_add, /*nb_add*/
619 (binaryfunc)complex_sub, /*nb_subtract*/
620 (binaryfunc)complex_mul, /*nb_multiply*/
621 (binaryfunc)complex_div, /*nb_divide*/
Guido van Rossumee09fc11996-09-11 13:55:55 +0000622 (binaryfunc)complex_remainder, /*nb_remainder*/
623 (binaryfunc)complex_divmod, /*nb_divmod*/
Guido van Rossumf9fca921996-01-12 00:47:05 +0000624 (ternaryfunc)complex_pow, /*nb_power*/
625 (unaryfunc)complex_neg, /*nb_negative*/
626 (unaryfunc)complex_pos, /*nb_positive*/
627 (unaryfunc)complex_abs, /*nb_absolute*/
628 (inquiry)complex_nonzero, /*nb_nonzero*/
629 0, /*nb_invert*/
630 0, /*nb_lshift*/
631 0, /*nb_rshift*/
632 0, /*nb_and*/
633 0, /*nb_xor*/
634 0, /*nb_or*/
635 (coercion)complex_coerce, /*nb_coerce*/
636 (unaryfunc)complex_int, /*nb_int*/
637 (unaryfunc)complex_long, /*nb_long*/
638 (unaryfunc)complex_float, /*nb_float*/
639 0, /*nb_oct*/
640 0, /*nb_hex*/
641};
642
643typeobject Complextype = {
644 OB_HEAD_INIT(&Typetype)
645 0,
646 "complex",
647 sizeof(complexobject),
648 0,
649 (destructor)complex_dealloc, /*tp_dealloc*/
650 (printfunc)complex_print, /*tp_print*/
651 (getattrfunc)complex_getattr, /*tp_getattr*/
652 0, /*tp_setattr*/
653 (cmpfunc)complex_compare, /*tp_compare*/
654 (reprfunc)complex_repr, /*tp_repr*/
655 &complex_as_number, /*tp_as_number*/
656 0, /*tp_as_sequence*/
657 0, /*tp_as_mapping*/
658 (hashfunc)complex_hash, /*tp_hash*/
659};
660
661#endif