blob: c6021e903c80202a67dfdee5334f0dbd091b5852 [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{
Martin v. Löwis737ea822004-06-08 18:52:54 +0000275 char format[32];
276 if (v->cval.real == 0.) {
277 PyOS_snprintf(format, 32, "%%.%ig", precision);
278 PyOS_ascii_formatd(buf, bufsz, format, v->cval.imag);
279 strncat(buf, "j", bufsz);
280 } else {
281 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000282 /* Format imaginary part with sign, real part without */
Martin v. Löwis737ea822004-06-08 18:52:54 +0000283 PyOS_snprintf(format, 32, "%%.%ig", precision);
284 PyOS_ascii_formatd(re, 64, format, v->cval.real);
Georg Brandlc404ff22005-09-16 06:42:26 +0000285 PyOS_snprintf(format, 32, "%%+.%ig", precision);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000286 PyOS_ascii_formatd(im, 64, format, v->cval.imag);
Georg Brandlc404ff22005-09-16 06:42:26 +0000287 PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000288 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000289}
290
291static int
Fred Drake4288c802000-07-09 04:36:04 +0000292complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000293{
294 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000295 complex_to_buf(buf, sizeof(buf), v,
Tim Peters70695122001-03-11 08:37:29 +0000296 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000297 fputs(buf, fp);
298 return 0;
299}
300
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000302complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000303{
304 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000305 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000306 return PyString_FromString(buf);
307}
308
309static PyObject *
310complex_str(PyComplexObject *v)
311{
312 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000313 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000315}
316
Guido van Rossumf9fca921996-01-12 00:47:05 +0000317static long
Fred Drake4288c802000-07-09 04:36:04 +0000318complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000319{
Tim Peters39dce292000-08-15 03:34:48 +0000320 long hashreal, hashimag, combined;
321 hashreal = _Py_HashDouble(v->cval.real);
322 if (hashreal == -1)
323 return -1;
324 hashimag = _Py_HashDouble(v->cval.imag);
325 if (hashimag == -1)
326 return -1;
327 /* Note: if the imaginary part is 0, hashimag is 0 now,
328 * so the following returns hashreal unchanged. This is
329 * important because numbers of different types that
330 * compare equal must have the same hash value, so that
331 * hash(x + 0*j) must equal hash(x).
332 */
333 combined = hashreal + 1000003 * hashimag;
334 if (combined == -1)
335 combined = -2;
336 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000337}
338
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000340complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000341{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000342 Py_complex result;
343 PyFPE_START_PROTECT("complex_add", return 0)
344 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000345 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000347}
348
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000350complex_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000351{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000352 Py_complex result;
353 PyFPE_START_PROTECT("complex_sub", return 0)
354 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000355 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000357}
358
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000360complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000361{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000362 Py_complex result;
363 PyFPE_START_PROTECT("complex_mul", return 0)
364 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000365 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000367}
368
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000370complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000371{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000372 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000373 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000374 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000375 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000376 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000377 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000379 return NULL;
380 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000382}
383
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000385complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000386{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000387 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000388
389 if (PyErr_Warn(PyExc_DeprecationWarning,
390 "complex divmod(), // and % are deprecated") < 0)
391 return NULL;
392
Guido van Rossum96783941997-05-20 18:21:34 +0000393 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000394 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000395 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000397 return NULL;
398 }
399 div.real = floor(div.real); /* Use the floor of the real part. */
400 div.imag = 0.0;
401 mod = c_diff(v->cval, c_prod(w->cval, div));
402
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000404}
405
Guido van Rossumee09fc11996-09-11 13:55:55 +0000406
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000408complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000409{
410 Py_complex div, mod;
411 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000412
413 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000414 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000415 return NULL;
416
Guido van Rossum96783941997-05-20 18:21:34 +0000417 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000418 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000419 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000421 return NULL;
422 }
423 div.real = floor(div.real); /* Use the floor of the real part. */
424 div.imag = 0.0;
425 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 d = PyComplex_FromCComplex(div);
427 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000428 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000429 Py_XDECREF(d);
430 Py_XDECREF(m);
431 return z;
432}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000435complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000436{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000437 Py_complex p;
438 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000439 long int_exponent;
440
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 if ((PyObject *)z!=Py_None) {
442 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000443 return NULL;
444 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000445 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000446 errno = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 exponent = ((PyComplexObject*)w)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000448 int_exponent = (long)exponent.real;
449 if (exponent.imag == 0. && exponent.real == int_exponent)
450 p = c_powi(v->cval,int_exponent);
451 else
452 p = c_pow(v->cval,exponent);
453
Guido van Rossum45b83911997-03-14 04:32:50 +0000454 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000455 Py_ADJUST_ERANGE2(p.real, p.imag);
456 if (errno == EDOM) {
457 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000459 return NULL;
460 }
Tim Petersbab22be2002-03-22 02:48:46 +0000461 else if (errno == ERANGE) {
462 PyErr_SetString(PyExc_OverflowError,
463 "complex exponentiaion");
464 return NULL;
465 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000467}
468
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000470complex_int_div(PyComplexObject *v, PyComplexObject *w)
471{
472 PyObject *t, *r;
473
474 t = complex_divmod(v, w);
475 if (t != NULL) {
476 r = PyTuple_GET_ITEM(t, 0);
477 Py_INCREF(r);
478 Py_DECREF(t);
479 return r;
480 }
481 return NULL;
482}
483
484static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000485complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000486{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000487 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000488 neg.real = -v->cval.real;
489 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000491}
492
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000494complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000495{
Tim Peters2400fa42001-09-12 19:12:49 +0000496 if (PyComplex_CheckExact(v)) {
497 Py_INCREF(v);
498 return (PyObject *)v;
499 }
500 else
501 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000502}
503
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000505complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000506{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000507 double result;
508 PyFPE_START_PROTECT("complex_abs", return 0)
509 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000510 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000512}
513
514static int
Fred Drake4288c802000-07-09 04:36:04 +0000515complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000516{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000517 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000518}
519
520static int
Fred Drake4288c802000-07-09 04:36:04 +0000521complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000522{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000523 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000524 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 if (PyInt_Check(*pw)) {
526 cval.real = (double)PyInt_AsLong(*pw);
527 *pw = PyComplex_FromCComplex(cval);
528 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000529 return 0;
530 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000531 else if (PyLong_Check(*pw)) {
532 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000533 if (cval.real == -1.0 && PyErr_Occurred())
534 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 *pw = PyComplex_FromCComplex(cval);
536 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000537 return 0;
538 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 else if (PyFloat_Check(*pw)) {
540 cval.real = PyFloat_AsDouble(*pw);
541 *pw = PyComplex_FromCComplex(cval);
542 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000543 return 0;
544 }
Guido van Rossum63805962001-09-19 01:13:10 +0000545 else if (PyComplex_Check(*pw)) {
546 Py_INCREF(*pv);
547 Py_INCREF(*pw);
548 return 0;
549 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000550 return 1; /* Can't do it */
551}
552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000554complex_richcompare(PyObject *v, PyObject *w, int op)
555{
556 int c;
557 Py_complex i, j;
558 PyObject *res;
559
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000560 c = PyNumber_CoerceEx(&v, &w);
561 if (c < 0)
562 return NULL;
563 if (c > 0) {
564 Py_INCREF(Py_NotImplemented);
565 return Py_NotImplemented;
566 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000567 /* Make sure both arguments are complex. */
568 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000569 Py_DECREF(v);
570 Py_DECREF(w);
571 Py_INCREF(Py_NotImplemented);
572 return Py_NotImplemented;
573 }
574
575 i = ((PyComplexObject *)v)->cval;
576 j = ((PyComplexObject *)w)->cval;
577 Py_DECREF(v);
578 Py_DECREF(w);
579
Guido van Rossum22056422001-09-24 17:52:04 +0000580 if (op != Py_EQ && op != Py_NE) {
581 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000582 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000583 return NULL;
584 }
585
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000586 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
587 res = Py_True;
588 else
589 res = Py_False;
590
591 Py_INCREF(res);
592 return res;
593}
594
595static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000596complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000597{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000599 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000600 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000601}
602
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000604complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000605{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000607 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000608 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000609}
610
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000611static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000612complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000613{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000614 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000615 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000616 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000617}
618
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000620complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000621{
Guido van Rossum926518b1996-08-19 19:30:45 +0000622 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000623 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000624 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000625 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000626}
627
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000628static PyObject *
629complex_getnewargs(PyComplexObject *v)
630{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000631 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000632}
633
Guido van Rossumf9fca921996-01-12 00:47:05 +0000634static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000635 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000636 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637 {NULL, NULL} /* sentinel */
638};
639
Guido van Rossum6f799372001-09-20 20:46:19 +0000640static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000641 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000642 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000643 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000644 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000645 {0},
646};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000647
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000648static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000649complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000650{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000651 const char *s, *start;
652 char *end;
653 double x=0.0, y=0.0, z;
654 int got_re=0, got_im=0, done=0;
655 int digit_or_dot;
656 int sw_error=0;
657 int sign;
658 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000659#ifdef Py_USING_UNICODE
660 char s_buffer[256];
661#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000662 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663
664 if (PyString_Check(v)) {
665 s = PyString_AS_STRING(v);
666 len = PyString_GET_SIZE(v);
667 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000668#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000669 else if (PyUnicode_Check(v)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000670 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000671 PyErr_SetString(PyExc_ValueError,
672 "complex() literal too large to convert");
673 return NULL;
674 }
675 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
676 PyUnicode_GET_SIZE(v),
677 s_buffer,
678 NULL))
679 return NULL;
680 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000681 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000682 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000683#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000684 else if (PyObject_AsCharBuffer(v, &s, &len)) {
685 PyErr_SetString(PyExc_TypeError,
686 "complex() arg is not a string");
687 return NULL;
688 }
689
690 /* position on first nonblank */
691 start = s;
692 while (*s && isspace(Py_CHARMASK(*s)))
693 s++;
694 if (s[0] == '\0') {
695 PyErr_SetString(PyExc_ValueError,
696 "complex() arg is an empty string");
697 return NULL;
698 }
699
700 z = -1.0;
701 sign = 1;
702 do {
703
704 switch (*s) {
705
706 case '\0':
707 if (s-start != len) {
708 PyErr_SetString(
709 PyExc_ValueError,
710 "complex() arg contains a null byte");
711 return NULL;
712 }
713 if(!done) sw_error=1;
714 break;
715
716 case '-':
717 sign = -1;
718 /* Fallthrough */
719 case '+':
720 if (done) sw_error=1;
721 s++;
722 if ( *s=='\0'||*s=='+'||*s=='-' ||
723 isspace(Py_CHARMASK(*s)) ) sw_error=1;
724 break;
725
726 case 'J':
727 case 'j':
728 if (got_im || done) {
729 sw_error = 1;
730 break;
731 }
732 if (z<0.0) {
733 y=sign;
734 }
735 else{
736 y=sign*z;
737 }
738 got_im=1;
739 s++;
740 if (*s!='+' && *s!='-' )
741 done=1;
742 break;
743
744 default:
745 if (isspace(Py_CHARMASK(*s))) {
746 while (*s && isspace(Py_CHARMASK(*s)))
747 s++;
748 if (s[0] != '\0')
749 sw_error=1;
750 else
751 done = 1;
752 break;
753 }
754 digit_or_dot =
755 (*s=='.' || isdigit(Py_CHARMASK(*s)));
756 if (done||!digit_or_dot) {
757 sw_error=1;
758 break;
759 }
760 errno = 0;
761 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000762 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000763 PyFPE_END_PROTECT(z)
764 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000765 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000766 "float() out of range: %.150s", s);
767 PyErr_SetString(
768 PyExc_ValueError,
769 buffer);
770 return NULL;
771 }
772 s=end;
773 if (*s=='J' || *s=='j') {
774
775 break;
776 }
777 if (got_re) {
778 sw_error=1;
779 break;
780 }
781
782 /* accept a real part */
783 x=sign*z;
784 got_re=1;
785 if (got_im) done=1;
786 z = -1.0;
787 sign = 1;
788 break;
789
790 } /* end of switch */
791
Tim Peters077f2712002-04-14 22:04:03 +0000792 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793
794 if (sw_error) {
795 PyErr_SetString(PyExc_ValueError,
796 "complex() arg is a malformed string");
797 return NULL;
798 }
799
800 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000801}
802
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803static PyObject *
804complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
805{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000806 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 PyNumberMethods *nbr, *nbi = NULL;
808 Py_complex cr, ci;
809 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000810 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000811 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000812
813 r = Py_False;
814 i = NULL;
815 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
816 &r, &i))
817 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000818
Walter Dörwald5ecd6c42003-06-17 20:22:24 +0000819 /* Special-case for single argument that is already complex */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000820 if (PyComplex_CheckExact(r) && i == NULL &&
821 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000822 /* Note that we can't know whether it's safe to return
823 a complex *subclass* instance as-is, hence the restriction
824 to exact complexes here. */
825 Py_INCREF(r);
826 return r;
827 }
Fred Drake526c7a02001-12-13 19:52:22 +0000828 if (PyString_Check(r) || PyUnicode_Check(r)) {
829 if (i != NULL) {
830 PyErr_SetString(PyExc_TypeError,
831 "complex() can't take second arg"
832 " if first is a string");
833 return NULL;
834 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000835 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000836 }
837 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
838 PyErr_SetString(PyExc_TypeError,
839 "complex() second arg can't be a string");
840 return NULL;
841 }
Tim Peters2400fa42001-09-12 19:12:49 +0000842
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000843 /* XXX Hack to support classes with __complex__ method */
844 if (complexstr == NULL) {
845 complexstr = PyString_InternFromString("__complex__");
846 if (complexstr == NULL)
847 return NULL;
848 }
849 f = PyObject_GetAttr(r, complexstr);
850 if (f == NULL)
851 PyErr_Clear();
852 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000853 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000854 if (args == NULL)
855 return NULL;
856 r = PyEval_CallObject(f, args);
857 Py_DECREF(args);
858 Py_DECREF(f);
859 if (r == NULL)
860 return NULL;
861 own_r = 1;
862 }
Tim Peters2400fa42001-09-12 19:12:49 +0000863 nbr = r->ob_type->tp_as_number;
864 if (i != NULL)
865 nbi = i->ob_type->tp_as_number;
866 if (nbr == NULL || nbr->nb_float == NULL ||
867 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000868 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000869 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000870 if (own_r) {
871 Py_DECREF(r);
872 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000873 return NULL;
874 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000876 /* Note that if r is of a complex subtype, we're only
877 retaining its real & imag parts here, and the return
878 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 cr = ((PyComplexObject*)r)->cval;
880 if (own_r) {
881 Py_DECREF(r);
882 }
883 }
884 else {
885 tmp = PyNumber_Float(r);
886 if (own_r) {
887 Py_DECREF(r);
888 }
889 if (tmp == NULL)
890 return NULL;
891 if (!PyFloat_Check(tmp)) {
892 PyErr_SetString(PyExc_TypeError,
893 "float(r) didn't return a float");
894 Py_DECREF(tmp);
895 return NULL;
896 }
897 cr.real = PyFloat_AsDouble(tmp);
898 Py_DECREF(tmp);
899 cr.imag = 0.0;
900 }
901 if (i == NULL) {
902 ci.real = 0.0;
903 ci.imag = 0.0;
904 }
905 else if (PyComplex_Check(i))
906 ci = ((PyComplexObject*)i)->cval;
907 else {
908 tmp = (*nbi->nb_float)(i);
909 if (tmp == NULL)
910 return NULL;
911 ci.real = PyFloat_AsDouble(tmp);
912 Py_DECREF(tmp);
913 ci.imag = 0.;
914 }
915 cr.real -= ci.imag;
916 cr.imag += ci.real;
917 return complex_subtype_from_c_complex(type, cr);
918}
919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000920PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000921"complex(real[, imag]) -> complex number\n"
922"\n"
923"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000924"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000925
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000927 (binaryfunc)complex_add, /* nb_add */
928 (binaryfunc)complex_sub, /* nb_subtract */
929 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000930 (binaryfunc)complex_remainder, /* nb_remainder */
931 (binaryfunc)complex_divmod, /* nb_divmod */
932 (ternaryfunc)complex_pow, /* nb_power */
933 (unaryfunc)complex_neg, /* nb_negative */
934 (unaryfunc)complex_pos, /* nb_positive */
935 (unaryfunc)complex_abs, /* nb_absolute */
936 (inquiry)complex_nonzero, /* nb_nonzero */
937 0, /* nb_invert */
938 0, /* nb_lshift */
939 0, /* nb_rshift */
940 0, /* nb_and */
941 0, /* nb_xor */
942 0, /* nb_or */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000943 complex_coerce, /* nb_coerce */
944 complex_int, /* nb_int */
945 complex_long, /* nb_long */
946 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000947 0, /* nb_oct */
948 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000949 0, /* nb_inplace_add */
950 0, /* nb_inplace_subtract */
951 0, /* nb_inplace_multiply*/
Guido van Rossum4668b002001-08-08 05:00:18 +0000952 0, /* nb_inplace_remainder */
953 0, /* nb_inplace_power */
954 0, /* nb_inplace_lshift */
955 0, /* nb_inplace_rshift */
956 0, /* nb_inplace_and */
957 0, /* nb_inplace_xor */
958 0, /* nb_inplace_or */
959 (binaryfunc)complex_int_div, /* nb_floor_divide */
960 (binaryfunc)complex_div, /* nb_true_divide */
961 0, /* nb_inplace_floor_divide */
962 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000963};
964
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000965PyTypeObject PyComplex_Type = {
966 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000967 0,
968 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000969 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000970 0,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000971 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000972 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000973 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000974 0, /* tp_setattr */
975 0, /* tp_compare */
976 (reprfunc)complex_repr, /* tp_repr */
977 &complex_as_number, /* tp_as_number */
978 0, /* tp_as_sequence */
979 0, /* tp_as_mapping */
980 (hashfunc)complex_hash, /* tp_hash */
981 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +0000982 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000983 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000984 0, /* tp_setattro */
985 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000986 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
987 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000988 0, /* tp_traverse */
989 0, /* tp_clear */
990 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000991 0, /* tp_weaklistoffset */
992 0, /* tp_iter */
993 0, /* tp_iternext */
994 complex_methods, /* tp_methods */
995 complex_members, /* tp_members */
996 0, /* tp_getset */
997 0, /* tp_base */
998 0, /* tp_dict */
999 0, /* tp_descr_get */
1000 0, /* tp_descr_set */
1001 0, /* tp_dictoffset */
1002 0, /* tp_init */
1003 0, /* tp_alloc */
1004 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001005 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001006};
1007
1008#endif