blob: 81bcca87c65e163e462f160c5c0214a35f73d8d0 [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];
Martin v. Löwis70aa1f22004-08-22 21:09:15 +0000282 char *fmt;
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);
285 PyOS_ascii_formatd(im, 64, format, v->cval.imag);
Martin v. Löwis70aa1f22004-08-22 21:09:15 +0000286 if (v->cval.imag < 0.)
287 fmt = "(%s%sj)";
288 else
289 fmt = "(%s+%sj)";
290 PyOS_snprintf(buf, bufsz, fmt, re, im);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000291 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000292}
293
294static int
Fred Drake4288c802000-07-09 04:36:04 +0000295complex_print(PyComplexObject *v, FILE *fp, int flags)
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,
Tim Peters70695122001-03-11 08:37:29 +0000299 (flags & Py_PRINT_RAW) ? PREC_STR : PREC_REPR);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000300 fputs(buf, fp);
301 return 0;
302}
303
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000305complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000306{
307 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000308 complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
Tim Peters70695122001-03-11 08:37:29 +0000309 return PyString_FromString(buf);
310}
311
312static PyObject *
313complex_str(PyComplexObject *v)
314{
315 char buf[100];
Barry Warsaw01d697a2001-11-28 20:50:56 +0000316 complex_to_buf(buf, sizeof(buf), v, PREC_STR);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 return PyString_FromString(buf);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000318}
319
Guido van Rossumf9fca921996-01-12 00:47:05 +0000320static long
Fred Drake4288c802000-07-09 04:36:04 +0000321complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000322{
Tim Peters39dce292000-08-15 03:34:48 +0000323 long hashreal, hashimag, combined;
324 hashreal = _Py_HashDouble(v->cval.real);
325 if (hashreal == -1)
326 return -1;
327 hashimag = _Py_HashDouble(v->cval.imag);
328 if (hashimag == -1)
329 return -1;
330 /* Note: if the imaginary part is 0, hashimag is 0 now,
331 * so the following returns hashreal unchanged. This is
332 * important because numbers of different types that
333 * compare equal must have the same hash value, so that
334 * hash(x + 0*j) must equal hash(x).
335 */
336 combined = hashreal + 1000003 * hashimag;
337 if (combined == -1)
338 combined = -2;
339 return combined;
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_add(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_add", return 0)
347 result = c_sum(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_sub(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_sub", return 0)
357 result = c_diff(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_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000364{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000365 Py_complex result;
366 PyFPE_START_PROTECT("complex_mul", return 0)
367 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000368 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000370}
371
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000373complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000374{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000375 Py_complex quot;
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000376 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000377 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000378 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000379 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000380 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000382 return NULL;
383 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000385}
386
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000388complex_classic_div(PyComplexObject *v, PyComplexObject *w)
389{
390 Py_complex quot;
391
Guido van Rossum1832de42001-09-04 03:51:09 +0000392 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000393 PyErr_Warn(PyExc_DeprecationWarning,
394 "classic complex division") < 0)
395 return NULL;
396
397 PyFPE_START_PROTECT("complex_classic_div", return 0)
398 errno = 0;
399 quot = c_quot(v->cval,w->cval);
400 PyFPE_END_PROTECT(quot)
401 if (errno == EDOM) {
402 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
403 return NULL;
404 }
405 return PyComplex_FromCComplex(quot);
406}
407
408static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000409complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000410{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000411 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000412
413 if (PyErr_Warn(PyExc_DeprecationWarning,
414 "complex divmod(), // and % are deprecated") < 0)
415 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 remainder");
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));
426
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000428}
429
Guido van Rossumee09fc11996-09-11 13:55:55 +0000430
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000432complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000433{
434 Py_complex div, mod;
435 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000436
437 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000438 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000439 return NULL;
440
Guido van Rossum96783941997-05-20 18:21:34 +0000441 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000442 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000443 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000445 return NULL;
446 }
447 div.real = floor(div.real); /* Use the floor of the real part. */
448 div.imag = 0.0;
449 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 d = PyComplex_FromCComplex(div);
451 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000452 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000453 Py_XDECREF(d);
454 Py_XDECREF(m);
455 return z;
456}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000457
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000459complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000460{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000461 Py_complex p;
462 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000463 long int_exponent;
464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 if ((PyObject *)z!=Py_None) {
466 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000467 return NULL;
468 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000469 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000470 errno = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 exponent = ((PyComplexObject*)w)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000472 int_exponent = (long)exponent.real;
473 if (exponent.imag == 0. && exponent.real == int_exponent)
474 p = c_powi(v->cval,int_exponent);
475 else
476 p = c_pow(v->cval,exponent);
477
Guido van Rossum45b83911997-03-14 04:32:50 +0000478 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000479 Py_ADJUST_ERANGE2(p.real, p.imag);
480 if (errno == EDOM) {
481 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000483 return NULL;
484 }
Tim Petersbab22be2002-03-22 02:48:46 +0000485 else if (errno == ERANGE) {
486 PyErr_SetString(PyExc_OverflowError,
487 "complex exponentiaion");
488 return NULL;
489 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000491}
492
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000494complex_int_div(PyComplexObject *v, PyComplexObject *w)
495{
496 PyObject *t, *r;
497
498 t = complex_divmod(v, w);
499 if (t != NULL) {
500 r = PyTuple_GET_ITEM(t, 0);
501 Py_INCREF(r);
502 Py_DECREF(t);
503 return r;
504 }
505 return NULL;
506}
507
508static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000509complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000510{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000511 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000512 neg.real = -v->cval.real;
513 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000515}
516
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000518complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000519{
Tim Peters2400fa42001-09-12 19:12:49 +0000520 if (PyComplex_CheckExact(v)) {
521 Py_INCREF(v);
522 return (PyObject *)v;
523 }
524 else
525 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000526}
527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000529complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000530{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000531 double result;
532 PyFPE_START_PROTECT("complex_abs", return 0)
533 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000534 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000536}
537
538static int
Fred Drake4288c802000-07-09 04:36:04 +0000539complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000540{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000541 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000542}
543
544static int
Fred Drake4288c802000-07-09 04:36:04 +0000545complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000546{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000547 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000548 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 if (PyInt_Check(*pw)) {
550 cval.real = (double)PyInt_AsLong(*pw);
551 *pw = PyComplex_FromCComplex(cval);
552 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000553 return 0;
554 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 else if (PyLong_Check(*pw)) {
556 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000557 if (cval.real == -1.0 && PyErr_Occurred())
558 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 *pw = PyComplex_FromCComplex(cval);
560 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000561 return 0;
562 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563 else if (PyFloat_Check(*pw)) {
564 cval.real = PyFloat_AsDouble(*pw);
565 *pw = PyComplex_FromCComplex(cval);
566 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000567 return 0;
568 }
Guido van Rossum63805962001-09-19 01:13:10 +0000569 else if (PyComplex_Check(*pw)) {
570 Py_INCREF(*pv);
571 Py_INCREF(*pw);
572 return 0;
573 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000574 return 1; /* Can't do it */
575}
576
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000578complex_richcompare(PyObject *v, PyObject *w, int op)
579{
580 int c;
581 Py_complex i, j;
582 PyObject *res;
583
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000584 c = PyNumber_CoerceEx(&v, &w);
585 if (c < 0)
586 return NULL;
587 if (c > 0) {
588 Py_INCREF(Py_NotImplemented);
589 return Py_NotImplemented;
590 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000591 /* Make sure both arguments are complex. */
592 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000593 Py_DECREF(v);
594 Py_DECREF(w);
595 Py_INCREF(Py_NotImplemented);
596 return Py_NotImplemented;
597 }
598
599 i = ((PyComplexObject *)v)->cval;
600 j = ((PyComplexObject *)w)->cval;
601 Py_DECREF(v);
602 Py_DECREF(w);
603
Guido van Rossum22056422001-09-24 17:52:04 +0000604 if (op != Py_EQ && op != Py_NE) {
605 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000606 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000607 return NULL;
608 }
609
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000610 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
611 res = Py_True;
612 else
613 res = Py_False;
614
615 Py_INCREF(res);
616 return res;
617}
618
619static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000620complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000621{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000623 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000624 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000625}
626
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000628complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000629{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000631 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000632 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000633}
634
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000636complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000637{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000639 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000640 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000641}
642
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000643static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000644complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000645{
Guido van Rossum926518b1996-08-19 19:30:45 +0000646 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000647 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000648 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000649 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000650}
651
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000652static PyObject *
653complex_getnewargs(PyComplexObject *v)
654{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000655 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000656}
657
Guido van Rossumf9fca921996-01-12 00:47:05 +0000658static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000659 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000660 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000661 {NULL, NULL} /* sentinel */
662};
663
Guido van Rossum6f799372001-09-20 20:46:19 +0000664static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000665 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000666 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000667 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000668 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000669 {0},
670};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000671
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000672static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000674{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 const char *s, *start;
676 char *end;
677 double x=0.0, y=0.0, z;
678 int got_re=0, got_im=0, done=0;
679 int digit_or_dot;
680 int sw_error=0;
681 int sign;
682 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000683#ifdef Py_USING_UNICODE
684 char s_buffer[256];
685#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000686 int len;
687
688 if (PyString_Check(v)) {
689 s = PyString_AS_STRING(v);
690 len = PyString_GET_SIZE(v);
691 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000692#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000693 else if (PyUnicode_Check(v)) {
694 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
695 PyErr_SetString(PyExc_ValueError,
696 "complex() literal too large to convert");
697 return NULL;
698 }
699 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
700 PyUnicode_GET_SIZE(v),
701 s_buffer,
702 NULL))
703 return NULL;
704 s = s_buffer;
705 len = (int)strlen(s);
706 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000707#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000708 else if (PyObject_AsCharBuffer(v, &s, &len)) {
709 PyErr_SetString(PyExc_TypeError,
710 "complex() arg is not a string");
711 return NULL;
712 }
713
714 /* position on first nonblank */
715 start = s;
716 while (*s && isspace(Py_CHARMASK(*s)))
717 s++;
718 if (s[0] == '\0') {
719 PyErr_SetString(PyExc_ValueError,
720 "complex() arg is an empty string");
721 return NULL;
722 }
723
724 z = -1.0;
725 sign = 1;
726 do {
727
728 switch (*s) {
729
730 case '\0':
731 if (s-start != len) {
732 PyErr_SetString(
733 PyExc_ValueError,
734 "complex() arg contains a null byte");
735 return NULL;
736 }
737 if(!done) sw_error=1;
738 break;
739
740 case '-':
741 sign = -1;
742 /* Fallthrough */
743 case '+':
744 if (done) sw_error=1;
745 s++;
746 if ( *s=='\0'||*s=='+'||*s=='-' ||
747 isspace(Py_CHARMASK(*s)) ) sw_error=1;
748 break;
749
750 case 'J':
751 case 'j':
752 if (got_im || done) {
753 sw_error = 1;
754 break;
755 }
756 if (z<0.0) {
757 y=sign;
758 }
759 else{
760 y=sign*z;
761 }
762 got_im=1;
763 s++;
764 if (*s!='+' && *s!='-' )
765 done=1;
766 break;
767
768 default:
769 if (isspace(Py_CHARMASK(*s))) {
770 while (*s && isspace(Py_CHARMASK(*s)))
771 s++;
772 if (s[0] != '\0')
773 sw_error=1;
774 else
775 done = 1;
776 break;
777 }
778 digit_or_dot =
779 (*s=='.' || isdigit(Py_CHARMASK(*s)));
780 if (done||!digit_or_dot) {
781 sw_error=1;
782 break;
783 }
784 errno = 0;
785 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000786 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000787 PyFPE_END_PROTECT(z)
788 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000789 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790 "float() out of range: %.150s", s);
791 PyErr_SetString(
792 PyExc_ValueError,
793 buffer);
794 return NULL;
795 }
796 s=end;
797 if (*s=='J' || *s=='j') {
798
799 break;
800 }
801 if (got_re) {
802 sw_error=1;
803 break;
804 }
805
806 /* accept a real part */
807 x=sign*z;
808 got_re=1;
809 if (got_im) done=1;
810 z = -1.0;
811 sign = 1;
812 break;
813
814 } /* end of switch */
815
Tim Peters077f2712002-04-14 22:04:03 +0000816 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817
818 if (sw_error) {
819 PyErr_SetString(PyExc_ValueError,
820 "complex() arg is a malformed string");
821 return NULL;
822 }
823
824 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000825}
826
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827static PyObject *
828complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
829{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000830 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831 PyNumberMethods *nbr, *nbi = NULL;
832 Py_complex cr, ci;
833 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000834 static PyObject *complexstr;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000835 static char *kwlist[] = {"real", "imag", 0};
836
837 r = Py_False;
838 i = NULL;
839 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
840 &r, &i))
841 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000842
Walter Dörwald5ecd6c42003-06-17 20:22:24 +0000843 /* Special-case for single argument that is already complex */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000844 if (PyComplex_CheckExact(r) && i == NULL &&
845 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000846 /* Note that we can't know whether it's safe to return
847 a complex *subclass* instance as-is, hence the restriction
848 to exact complexes here. */
849 Py_INCREF(r);
850 return r;
851 }
Fred Drake526c7a02001-12-13 19:52:22 +0000852 if (PyString_Check(r) || PyUnicode_Check(r)) {
853 if (i != NULL) {
854 PyErr_SetString(PyExc_TypeError,
855 "complex() can't take second arg"
856 " if first is a string");
857 return NULL;
858 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000860 }
861 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
862 PyErr_SetString(PyExc_TypeError,
863 "complex() second arg can't be a string");
864 return NULL;
865 }
Tim Peters2400fa42001-09-12 19:12:49 +0000866
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000867 /* XXX Hack to support classes with __complex__ method */
868 if (complexstr == NULL) {
869 complexstr = PyString_InternFromString("__complex__");
870 if (complexstr == NULL)
871 return NULL;
872 }
873 f = PyObject_GetAttr(r, complexstr);
874 if (f == NULL)
875 PyErr_Clear();
876 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000877 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000878 if (args == NULL)
879 return NULL;
880 r = PyEval_CallObject(f, args);
881 Py_DECREF(args);
882 Py_DECREF(f);
883 if (r == NULL)
884 return NULL;
885 own_r = 1;
886 }
Tim Peters2400fa42001-09-12 19:12:49 +0000887 nbr = r->ob_type->tp_as_number;
888 if (i != NULL)
889 nbi = i->ob_type->tp_as_number;
890 if (nbr == NULL || nbr->nb_float == NULL ||
891 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000892 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000893 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000894 if (own_r) {
895 Py_DECREF(r);
896 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000897 return NULL;
898 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000899 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000900 /* Note that if r is of a complex subtype, we're only
901 retaining its real & imag parts here, and the return
902 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000903 cr = ((PyComplexObject*)r)->cval;
904 if (own_r) {
905 Py_DECREF(r);
906 }
907 }
908 else {
909 tmp = PyNumber_Float(r);
910 if (own_r) {
911 Py_DECREF(r);
912 }
913 if (tmp == NULL)
914 return NULL;
915 if (!PyFloat_Check(tmp)) {
916 PyErr_SetString(PyExc_TypeError,
917 "float(r) didn't return a float");
918 Py_DECREF(tmp);
919 return NULL;
920 }
921 cr.real = PyFloat_AsDouble(tmp);
922 Py_DECREF(tmp);
923 cr.imag = 0.0;
924 }
925 if (i == NULL) {
926 ci.real = 0.0;
927 ci.imag = 0.0;
928 }
929 else if (PyComplex_Check(i))
930 ci = ((PyComplexObject*)i)->cval;
931 else {
932 tmp = (*nbi->nb_float)(i);
933 if (tmp == NULL)
934 return NULL;
935 ci.real = PyFloat_AsDouble(tmp);
936 Py_DECREF(tmp);
937 ci.imag = 0.;
938 }
939 cr.real -= ci.imag;
940 cr.imag += ci.real;
941 return complex_subtype_from_c_complex(type, cr);
942}
943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000944PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000945"complex(real[, imag]) -> complex number\n"
946"\n"
947"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000948"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000951 (binaryfunc)complex_add, /* nb_add */
952 (binaryfunc)complex_sub, /* nb_subtract */
953 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +0000954 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000955 (binaryfunc)complex_remainder, /* nb_remainder */
956 (binaryfunc)complex_divmod, /* nb_divmod */
957 (ternaryfunc)complex_pow, /* nb_power */
958 (unaryfunc)complex_neg, /* nb_negative */
959 (unaryfunc)complex_pos, /* nb_positive */
960 (unaryfunc)complex_abs, /* nb_absolute */
961 (inquiry)complex_nonzero, /* nb_nonzero */
962 0, /* nb_invert */
963 0, /* nb_lshift */
964 0, /* nb_rshift */
965 0, /* nb_and */
966 0, /* nb_xor */
967 0, /* nb_or */
968 (coercion)complex_coerce, /* nb_coerce */
969 (unaryfunc)complex_int, /* nb_int */
970 (unaryfunc)complex_long, /* nb_long */
971 (unaryfunc)complex_float, /* nb_float */
972 0, /* nb_oct */
973 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000974 0, /* nb_inplace_add */
975 0, /* nb_inplace_subtract */
976 0, /* nb_inplace_multiply*/
977 0, /* nb_inplace_divide */
978 0, /* nb_inplace_remainder */
979 0, /* nb_inplace_power */
980 0, /* nb_inplace_lshift */
981 0, /* nb_inplace_rshift */
982 0, /* nb_inplace_and */
983 0, /* nb_inplace_xor */
984 0, /* nb_inplace_or */
985 (binaryfunc)complex_int_div, /* nb_floor_divide */
986 (binaryfunc)complex_div, /* nb_true_divide */
987 0, /* nb_inplace_floor_divide */
988 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +0000989};
990
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000991PyTypeObject PyComplex_Type = {
992 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000993 0,
994 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000995 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +0000996 0,
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000997 (destructor)complex_dealloc, /* tp_dealloc */
998 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000999 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001000 0, /* tp_setattr */
1001 0, /* tp_compare */
1002 (reprfunc)complex_repr, /* tp_repr */
1003 &complex_as_number, /* tp_as_number */
1004 0, /* tp_as_sequence */
1005 0, /* tp_as_mapping */
1006 (hashfunc)complex_hash, /* tp_hash */
1007 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001008 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001010 0, /* tp_setattro */
1011 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1013 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001014 0, /* tp_traverse */
1015 0, /* tp_clear */
1016 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 0, /* tp_weaklistoffset */
1018 0, /* tp_iter */
1019 0, /* tp_iternext */
1020 complex_methods, /* tp_methods */
1021 complex_members, /* tp_members */
1022 0, /* tp_getset */
1023 0, /* tp_base */
1024 0, /* tp_dict */
1025 0, /* tp_descr_get */
1026 0, /* tp_descr_set */
1027 0, /* tp_dictoffset */
1028 0, /* tp_init */
1029 0, /* tp_alloc */
1030 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001031 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001032};
1033
1034#endif