blob: 1403de2e7a9694f523b42e99818484b0d1d519fb [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
Georg Brandl6b50c632006-06-01 08:27:32 +0000191 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000192 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.) {
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000277 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
278 PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
279 strncat(buf, "j", 1);
Martin v. Löwis737ea822004-06-08 18:52:54 +0000280 } else {
281 char re[64], im[64];
Georg Brandlc404ff22005-09-16 06:42:26 +0000282 /* Format imaginary part with sign, real part without */
Neal Norwitz4b0a3152006-07-16 02:22:30 +0000283 PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
284 PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
285 PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
286 PyOS_ascii_formatd(im, sizeof(im), 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 *
Guido van Rossum393661d2001-08-31 17:40:15 +0000385complex_classic_div(PyComplexObject *v, PyComplexObject *w)
386{
387 Py_complex quot;
388
Guido van Rossum1832de42001-09-04 03:51:09 +0000389 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000390 PyErr_Warn(PyExc_DeprecationWarning,
391 "classic complex division") < 0)
392 return NULL;
393
394 PyFPE_START_PROTECT("complex_classic_div", return 0)
395 errno = 0;
396 quot = c_quot(v->cval,w->cval);
397 PyFPE_END_PROTECT(quot)
398 if (errno == EDOM) {
399 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
400 return NULL;
401 }
402 return PyComplex_FromCComplex(quot);
403}
404
405static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000406complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000407{
Guido van Rossum3be12e91996-09-12 20:56:18 +0000408 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000409
410 if (PyErr_Warn(PyExc_DeprecationWarning,
411 "complex divmod(), // and % are deprecated") < 0)
412 return NULL;
413
Guido van Rossum96783941997-05-20 18:21:34 +0000414 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000415 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000416 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000418 return NULL;
419 }
420 div.real = floor(div.real); /* Use the floor of the real part. */
421 div.imag = 0.0;
422 mod = c_diff(v->cval, c_prod(w->cval, div));
423
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000425}
426
Guido van Rossumee09fc11996-09-11 13:55:55 +0000427
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000429complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000430{
431 Py_complex div, mod;
432 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000433
434 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000435 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000436 return NULL;
437
Guido van Rossum96783941997-05-20 18:21:34 +0000438 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000439 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000440 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000442 return NULL;
443 }
444 div.real = floor(div.real); /* Use the floor of the real part. */
445 div.imag = 0.0;
446 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 d = PyComplex_FromCComplex(div);
448 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000449 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000450 Py_XDECREF(d);
451 Py_XDECREF(m);
452 return z;
453}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000456complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000457{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000458 Py_complex p;
459 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000460 long int_exponent;
461
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462 if ((PyObject *)z!=Py_None) {
463 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000464 return NULL;
465 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000466 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000467 errno = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 exponent = ((PyComplexObject*)w)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000469 int_exponent = (long)exponent.real;
470 if (exponent.imag == 0. && exponent.real == int_exponent)
471 p = c_powi(v->cval,int_exponent);
472 else
473 p = c_pow(v->cval,exponent);
474
Guido van Rossum45b83911997-03-14 04:32:50 +0000475 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000476 Py_ADJUST_ERANGE2(p.real, p.imag);
477 if (errno == EDOM) {
478 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000480 return NULL;
481 }
Tim Petersbab22be2002-03-22 02:48:46 +0000482 else if (errno == ERANGE) {
483 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000484 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000485 return NULL;
486 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000488}
489
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000491complex_int_div(PyComplexObject *v, PyComplexObject *w)
492{
493 PyObject *t, *r;
494
495 t = complex_divmod(v, w);
496 if (t != NULL) {
497 r = PyTuple_GET_ITEM(t, 0);
498 Py_INCREF(r);
499 Py_DECREF(t);
500 return r;
501 }
502 return NULL;
503}
504
505static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000506complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000507{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000508 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509 neg.real = -v->cval.real;
510 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000512}
513
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000515complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000516{
Tim Peters2400fa42001-09-12 19:12:49 +0000517 if (PyComplex_CheckExact(v)) {
518 Py_INCREF(v);
519 return (PyObject *)v;
520 }
521 else
522 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000523}
524
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000526complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000527{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000528 double result;
529 PyFPE_START_PROTECT("complex_abs", return 0)
530 result = hypot(v->cval.real,v->cval.imag);
Guido van Rossum45b83911997-03-14 04:32:50 +0000531 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000532 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000533}
534
535static int
Fred Drake4288c802000-07-09 04:36:04 +0000536complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000537{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000538 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539}
540
541static int
Fred Drake4288c802000-07-09 04:36:04 +0000542complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000543{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000544 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000545 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 if (PyInt_Check(*pw)) {
547 cval.real = (double)PyInt_AsLong(*pw);
548 *pw = PyComplex_FromCComplex(cval);
549 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000550 return 0;
551 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552 else if (PyLong_Check(*pw)) {
553 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000554 if (cval.real == -1.0 && PyErr_Occurred())
555 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 *pw = PyComplex_FromCComplex(cval);
557 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000558 return 0;
559 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000560 else if (PyFloat_Check(*pw)) {
561 cval.real = PyFloat_AsDouble(*pw);
562 *pw = PyComplex_FromCComplex(cval);
563 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000564 return 0;
565 }
Guido van Rossum63805962001-09-19 01:13:10 +0000566 else if (PyComplex_Check(*pw)) {
567 Py_INCREF(*pv);
568 Py_INCREF(*pw);
569 return 0;
570 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000571 return 1; /* Can't do it */
572}
573
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000574static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000575complex_richcompare(PyObject *v, PyObject *w, int op)
576{
577 int c;
578 Py_complex i, j;
579 PyObject *res;
580
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000581 c = PyNumber_CoerceEx(&v, &w);
582 if (c < 0)
583 return NULL;
584 if (c > 0) {
585 Py_INCREF(Py_NotImplemented);
586 return Py_NotImplemented;
587 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000588 /* Make sure both arguments are complex. */
589 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000590 Py_DECREF(v);
591 Py_DECREF(w);
592 Py_INCREF(Py_NotImplemented);
593 return Py_NotImplemented;
594 }
595
596 i = ((PyComplexObject *)v)->cval;
597 j = ((PyComplexObject *)w)->cval;
598 Py_DECREF(v);
599 Py_DECREF(w);
600
Guido van Rossum22056422001-09-24 17:52:04 +0000601 if (op != Py_EQ && op != Py_NE) {
602 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000603 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000604 return NULL;
605 }
606
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000607 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
608 res = Py_True;
609 else
610 res = Py_False;
611
612 Py_INCREF(res);
613 return res;
614}
615
616static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000617complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000618{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000620 "can't convert complex to int; use int(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000621 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000622}
623
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000625complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000626{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000627 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000628 "can't convert complex to long; use long(abs(z))");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000629 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000630}
631
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000633complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000634{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger0970dba2003-08-30 23:57:36 +0000636 "can't convert complex to float; use abs(z)");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000637 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000638}
639
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000640static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000641complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000642{
Guido van Rossum926518b1996-08-19 19:30:45 +0000643 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000645 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000647}
648
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000649static PyObject *
650complex_getnewargs(PyComplexObject *v)
651{
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000652 return Py_BuildValue("(D)", &v->cval);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000653}
654
Guido van Rossumf9fca921996-01-12 00:47:05 +0000655static PyMethodDef complex_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000656 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000657 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000658 {NULL, NULL} /* sentinel */
659};
660
Guido van Rossum6f799372001-09-20 20:46:19 +0000661static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000662 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000663 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000664 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000665 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000666 {0},
667};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000668
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000670complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000671{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000672 const char *s, *start;
673 char *end;
674 double x=0.0, y=0.0, z;
Collin Wintere38051d2007-03-09 20:33:07 +0000675 int got_re=0, got_im=0, got_bracket=0, done=0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676 int digit_or_dot;
677 int sw_error=0;
678 int sign;
679 char buffer[256]; /* For errors */
Guido van Rossum70e36882001-10-25 18:07:22 +0000680#ifdef Py_USING_UNICODE
681 char s_buffer[256];
682#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000683 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000684
685 if (PyString_Check(v)) {
686 s = PyString_AS_STRING(v);
687 len = PyString_GET_SIZE(v);
688 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000689#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000690 else if (PyUnicode_Check(v)) {
Skip Montanaro429433b2006-04-18 00:35:43 +0000691 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000692 PyErr_SetString(PyExc_ValueError,
693 "complex() literal too large to convert");
694 return NULL;
695 }
696 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
697 PyUnicode_GET_SIZE(v),
698 s_buffer,
699 NULL))
700 return NULL;
701 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000702 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000703 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000704#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000705 else if (PyObject_AsCharBuffer(v, &s, &len)) {
706 PyErr_SetString(PyExc_TypeError,
707 "complex() arg is not a string");
708 return NULL;
709 }
710
711 /* position on first nonblank */
712 start = s;
713 while (*s && isspace(Py_CHARMASK(*s)))
714 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000715 if (s[0] == '\0') {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000716 PyErr_SetString(PyExc_ValueError,
717 "complex() arg is an empty string");
718 return NULL;
Collin Wintere38051d2007-03-09 20:33:07 +0000719 }
720 if (s[0] == '(') {
721 /* Skip over possible bracket from repr(). */
722 got_bracket = 1;
723 s++;
724 while (*s && isspace(Py_CHARMASK(*s)))
725 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000726 }
727
728 z = -1.0;
729 sign = 1;
730 do {
731
732 switch (*s) {
733
734 case '\0':
735 if (s-start != len) {
736 PyErr_SetString(
737 PyExc_ValueError,
738 "complex() arg contains a null byte");
739 return NULL;
740 }
741 if(!done) sw_error=1;
742 break;
743
Collin Wintere38051d2007-03-09 20:33:07 +0000744 case ')':
745 if (!got_bracket || !(got_re || got_im)) {
746 sw_error=1;
747 break;
748 }
749 got_bracket=0;
750 done=1;
751 s++;
752 while (*s && isspace(Py_CHARMASK(*s)))
753 s++;
754 if (*s) sw_error=1;
755 break;
756
Tim Peters6d6c1a32001-08-02 04:15:00 +0000757 case '-':
758 sign = -1;
759 /* Fallthrough */
760 case '+':
761 if (done) sw_error=1;
762 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000763 if ( *s=='\0'||*s=='+'||*s=='-'||*s==')'||
Tim Peters6d6c1a32001-08-02 04:15:00 +0000764 isspace(Py_CHARMASK(*s)) ) sw_error=1;
765 break;
766
767 case 'J':
768 case 'j':
769 if (got_im || done) {
770 sw_error = 1;
771 break;
772 }
773 if (z<0.0) {
774 y=sign;
775 }
776 else{
777 y=sign*z;
778 }
779 got_im=1;
780 s++;
781 if (*s!='+' && *s!='-' )
782 done=1;
783 break;
784
785 default:
786 if (isspace(Py_CHARMASK(*s))) {
787 while (*s && isspace(Py_CHARMASK(*s)))
788 s++;
Collin Wintere38051d2007-03-09 20:33:07 +0000789 if (*s && *s != ')')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790 sw_error=1;
791 else
792 done = 1;
793 break;
794 }
795 digit_or_dot =
796 (*s=='.' || isdigit(Py_CHARMASK(*s)));
797 if (done||!digit_or_dot) {
798 sw_error=1;
799 break;
800 }
801 errno = 0;
802 PyFPE_START_PROTECT("strtod", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +0000803 z = PyOS_ascii_strtod(s, &end) ;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 PyFPE_END_PROTECT(z)
805 if (errno != 0) {
Barry Warsaw01d697a2001-11-28 20:50:56 +0000806 PyOS_snprintf(buffer, sizeof(buffer),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 "float() out of range: %.150s", s);
808 PyErr_SetString(
809 PyExc_ValueError,
810 buffer);
811 return NULL;
812 }
813 s=end;
814 if (*s=='J' || *s=='j') {
815
816 break;
817 }
818 if (got_re) {
819 sw_error=1;
820 break;
821 }
822
823 /* accept a real part */
824 x=sign*z;
825 got_re=1;
826 if (got_im) done=1;
827 z = -1.0;
828 sign = 1;
829 break;
830
831 } /* end of switch */
832
Tim Peters077f2712002-04-14 22:04:03 +0000833 } while (s - start < len && !sw_error);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834
Collin Wintere38051d2007-03-09 20:33:07 +0000835 if (sw_error || got_bracket) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000836 PyErr_SetString(PyExc_ValueError,
837 "complex() arg is a malformed string");
838 return NULL;
839 }
840
841 return complex_subtype_from_doubles(type, x, y);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000842}
843
Tim Peters6d6c1a32001-08-02 04:15:00 +0000844static PyObject *
845complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
846{
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000847 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848 PyNumberMethods *nbr, *nbi = NULL;
849 Py_complex cr, ci;
850 int own_r = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000851 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000852 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853
854 r = Py_False;
855 i = NULL;
856 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
857 &r, &i))
858 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000859
Walter Dörwald5ecd6c42003-06-17 20:22:24 +0000860 /* Special-case for single argument that is already complex */
Guido van Rossum4eadfa22003-03-02 13:51:47 +0000861 if (PyComplex_CheckExact(r) && i == NULL &&
862 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +0000863 /* Note that we can't know whether it's safe to return
864 a complex *subclass* instance as-is, hence the restriction
865 to exact complexes here. */
866 Py_INCREF(r);
867 return r;
868 }
Fred Drake526c7a02001-12-13 19:52:22 +0000869 if (PyString_Check(r) || PyUnicode_Check(r)) {
870 if (i != NULL) {
871 PyErr_SetString(PyExc_TypeError,
872 "complex() can't take second arg"
873 " if first is a string");
874 return NULL;
875 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +0000877 }
878 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
879 PyErr_SetString(PyExc_TypeError,
880 "complex() second arg can't be a string");
881 return NULL;
882 }
Tim Peters2400fa42001-09-12 19:12:49 +0000883
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000884 /* XXX Hack to support classes with __complex__ method */
885 if (complexstr == NULL) {
886 complexstr = PyString_InternFromString("__complex__");
887 if (complexstr == NULL)
888 return NULL;
889 }
890 f = PyObject_GetAttr(r, complexstr);
891 if (f == NULL)
892 PyErr_Clear();
893 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000894 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000895 if (args == NULL)
896 return NULL;
897 r = PyEval_CallObject(f, args);
898 Py_DECREF(args);
899 Py_DECREF(f);
900 if (r == NULL)
901 return NULL;
902 own_r = 1;
903 }
Tim Peters2400fa42001-09-12 19:12:49 +0000904 nbr = r->ob_type->tp_as_number;
905 if (i != NULL)
906 nbi = i->ob_type->tp_as_number;
907 if (nbr == NULL || nbr->nb_float == NULL ||
908 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000909 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +0000910 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +0000911 if (own_r) {
912 Py_DECREF(r);
913 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000914 return NULL;
915 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000916 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +0000917 /* Note that if r is of a complex subtype, we're only
918 retaining its real & imag parts here, and the return
919 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000920 cr = ((PyComplexObject*)r)->cval;
921 if (own_r) {
922 Py_DECREF(r);
923 }
924 }
925 else {
926 tmp = PyNumber_Float(r);
927 if (own_r) {
928 Py_DECREF(r);
929 }
930 if (tmp == NULL)
931 return NULL;
932 if (!PyFloat_Check(tmp)) {
933 PyErr_SetString(PyExc_TypeError,
934 "float(r) didn't return a float");
935 Py_DECREF(tmp);
936 return NULL;
937 }
938 cr.real = PyFloat_AsDouble(tmp);
939 Py_DECREF(tmp);
940 cr.imag = 0.0;
941 }
942 if (i == NULL) {
943 ci.real = 0.0;
944 ci.imag = 0.0;
945 }
946 else if (PyComplex_Check(i))
947 ci = ((PyComplexObject*)i)->cval;
948 else {
949 tmp = (*nbi->nb_float)(i);
950 if (tmp == NULL)
951 return NULL;
952 ci.real = PyFloat_AsDouble(tmp);
953 Py_DECREF(tmp);
954 ci.imag = 0.;
955 }
956 cr.real -= ci.imag;
957 cr.imag += ci.real;
958 return complex_subtype_from_c_complex(type, cr);
959}
960
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000961PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +0000962"complex(real[, imag]) -> complex number\n"
963"\n"
964"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000965"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000966
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000968 (binaryfunc)complex_add, /* nb_add */
969 (binaryfunc)complex_sub, /* nb_subtract */
970 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +0000971 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000972 (binaryfunc)complex_remainder, /* nb_remainder */
973 (binaryfunc)complex_divmod, /* nb_divmod */
974 (ternaryfunc)complex_pow, /* nb_power */
975 (unaryfunc)complex_neg, /* nb_negative */
976 (unaryfunc)complex_pos, /* nb_positive */
977 (unaryfunc)complex_abs, /* nb_absolute */
978 (inquiry)complex_nonzero, /* nb_nonzero */
979 0, /* nb_invert */
980 0, /* nb_lshift */
981 0, /* nb_rshift */
982 0, /* nb_and */
983 0, /* nb_xor */
984 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +0000985 complex_coerce, /* nb_coerce */
986 complex_int, /* nb_int */
987 complex_long, /* nb_long */
988 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000989 0, /* nb_oct */
990 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +0000991 0, /* nb_inplace_add */
992 0, /* nb_inplace_subtract */
993 0, /* nb_inplace_multiply*/
994 0, /* nb_inplace_divide */
995 0, /* nb_inplace_remainder */
996 0, /* nb_inplace_power */
997 0, /* nb_inplace_lshift */
998 0, /* nb_inplace_rshift */
999 0, /* nb_inplace_and */
1000 0, /* nb_inplace_xor */
1001 0, /* nb_inplace_or */
1002 (binaryfunc)complex_int_div, /* nb_floor_divide */
1003 (binaryfunc)complex_div, /* nb_true_divide */
1004 0, /* nb_inplace_floor_divide */
1005 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001006};
1007
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008PyTypeObject PyComplex_Type = {
1009 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001010 0,
1011 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001012 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001013 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001014 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001015 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001017 0, /* tp_setattr */
1018 0, /* tp_compare */
1019 (reprfunc)complex_repr, /* tp_repr */
1020 &complex_as_number, /* tp_as_number */
1021 0, /* tp_as_sequence */
1022 0, /* tp_as_mapping */
1023 (hashfunc)complex_hash, /* tp_hash */
1024 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001025 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001027 0, /* tp_setattro */
1028 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1030 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001031 0, /* tp_traverse */
1032 0, /* tp_clear */
1033 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001034 0, /* tp_weaklistoffset */
1035 0, /* tp_iter */
1036 0, /* tp_iternext */
1037 complex_methods, /* tp_methods */
1038 complex_members, /* tp_members */
1039 0, /* tp_getset */
1040 0, /* tp_base */
1041 0, /* tp_dict */
1042 0, /* tp_descr_get */
1043 0, /* tp_descr_set */
1044 0, /* tp_dictoffset */
1045 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001046 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001047 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001048 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001049};
1050
1051#endif