blob: b976b6de520dcceb7421be5f39a5a05f51d23538 [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
Neal Norwitz9fdfaaf2008-03-28 05:34:59 +000011#ifdef HAVE_IEEEFP_H
12#include <ieeefp.h>
13#endif
14
Guido van Rossum65ce6de2002-06-13 17:07:07 +000015#ifndef WITHOUT_COMPLEX
16
Tim Peters70695122001-03-11 08:37:29 +000017/* Precisions used by repr() and str(), respectively.
18
19 The repr() precision (17 significant decimal digits) is the minimal number
20 that is guaranteed to have enough precision so that if the number is read
21 back in the exact same binary value is recreated. This is true for IEEE
22 floating point by design, and also happens to work for all other modern
23 hardware.
24
25 The str() precision is chosen so that in most cases, the rounding noise
26 created by various operations is suppressed, while giving plenty of
27 precision for practical use.
28*/
29
30#define PREC_REPR 17
31#define PREC_STR 12
Guido van Rossumf9fca921996-01-12 00:47:05 +000032
33/* elementary operations on complex numbers */
34
Guido van Rossum9e720e31996-07-21 02:31:35 +000035static Py_complex c_1 = {1., 0.};
Guido van Rossumf9fca921996-01-12 00:47:05 +000036
Tim Peters0f336042001-03-18 08:21:57 +000037Py_complex
38c_sum(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000039{
Guido van Rossum9e720e31996-07-21 02:31:35 +000040 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000041 r.real = a.real + b.real;
42 r.imag = a.imag + b.imag;
43 return r;
44}
45
Tim Peters0f336042001-03-18 08:21:57 +000046Py_complex
47c_diff(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000048{
Guido van Rossum9e720e31996-07-21 02:31:35 +000049 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000050 r.real = a.real - b.real;
51 r.imag = a.imag - b.imag;
52 return r;
53}
54
Tim Peters0f336042001-03-18 08:21:57 +000055Py_complex
56c_neg(Py_complex a)
Guido van Rossumf9fca921996-01-12 00:47:05 +000057{
Guido van Rossum9e720e31996-07-21 02:31:35 +000058 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000059 r.real = -a.real;
60 r.imag = -a.imag;
61 return r;
62}
63
Tim Peters0f336042001-03-18 08:21:57 +000064Py_complex
65c_prod(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000066{
Guido van Rossum9e720e31996-07-21 02:31:35 +000067 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000068 r.real = a.real*b.real - a.imag*b.imag;
69 r.imag = a.real*b.imag + a.imag*b.real;
70 return r;
71}
72
Tim Peters0f336042001-03-18 08:21:57 +000073Py_complex
74c_quot(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +000075{
Tim Peters0f336042001-03-18 08:21:57 +000076 /******************************************************************
77 This was the original algorithm. It's grossly prone to spurious
78 overflow and underflow errors. It also merrily divides by 0 despite
79 checking for that(!). The code still serves a doc purpose here, as
80 the algorithm following is a simple by-cases transformation of this
81 one:
82
Guido van Rossum9e720e31996-07-21 02:31:35 +000083 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +000084 double d = b.real*b.real + b.imag*b.imag;
85 if (d == 0.)
Guido van Rossum96783941997-05-20 18:21:34 +000086 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +000087 r.real = (a.real*b.real + a.imag*b.imag)/d;
88 r.imag = (a.imag*b.real - a.real*b.imag)/d;
89 return r;
Tim Peters0f336042001-03-18 08:21:57 +000090 ******************************************************************/
91
92 /* This algorithm is better, and is pretty obvious: first divide the
93 * numerators and denominator by whichever of {b.real, b.imag} has
94 * larger magnitude. The earliest reference I found was to CACM
95 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
96 * University). As usual, though, we're still ignoring all IEEE
97 * endcases.
98 */
99 Py_complex r; /* the result */
100 const double abs_breal = b.real < 0 ? -b.real : b.real;
101 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;
102
103 if (abs_breal >= abs_bimag) {
104 /* divide tops and bottom by b.real */
105 if (abs_breal == 0.0) {
106 errno = EDOM;
107 r.real = r.imag = 0.0;
108 }
109 else {
110 const double ratio = b.imag / b.real;
111 const double denom = b.real + b.imag * ratio;
112 r.real = (a.real + a.imag * ratio) / denom;
113 r.imag = (a.imag - a.real * ratio) / denom;
114 }
115 }
116 else {
117 /* divide tops and bottom by b.imag */
118 const double ratio = b.real / b.imag;
119 const double denom = b.real * ratio + b.imag;
120 assert(b.imag != 0.0);
121 r.real = (a.real * ratio + a.imag) / denom;
122 r.imag = (a.imag * ratio - a.real) / denom;
123 }
124 return r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000125}
126
Tim Peters0f336042001-03-18 08:21:57 +0000127Py_complex
128c_pow(Py_complex a, Py_complex b)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000129{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000130 Py_complex r;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000131 double vabs,len,at,phase;
132 if (b.real == 0. && b.imag == 0.) {
133 r.real = 1.;
134 r.imag = 0.;
135 }
136 else if (a.real == 0. && a.imag == 0.) {
137 if (b.imag != 0. || b.real < 0.)
Tim Petersbab22be2002-03-22 02:48:46 +0000138 errno = EDOM;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000139 r.real = 0.;
140 r.imag = 0.;
141 }
142 else {
143 vabs = hypot(a.real,a.imag);
144 len = pow(vabs,b.real);
Martin v. Löwis387c5472001-09-06 08:16:17 +0000145 at = atan2(a.imag, a.real);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000146 phase = at*b.real;
147 if (b.imag != 0.0) {
148 len /= exp(at*b.imag);
149 phase += b.imag*log(vabs);
150 }
151 r.real = len*cos(phase);
152 r.imag = len*sin(phase);
153 }
154 return r;
155}
156
Tim Peters0f336042001-03-18 08:21:57 +0000157static Py_complex
158c_powu(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000159{
Guido van Rossum926518b1996-08-19 19:30:45 +0000160 Py_complex r, p;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000161 long mask = 1;
Guido van Rossum926518b1996-08-19 19:30:45 +0000162 r = c_1;
163 p = x;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000164 while (mask > 0 && n >= mask) {
165 if (n & mask)
166 r = c_prod(r,p);
167 mask <<= 1;
168 p = c_prod(p,p);
169 }
170 return r;
171}
172
Tim Peters0f336042001-03-18 08:21:57 +0000173static Py_complex
174c_powi(Py_complex x, long n)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000175{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000176 Py_complex cn;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000177
178 if (n > 100 || n < -100) {
179 cn.real = (double) n;
180 cn.imag = 0.;
181 return c_pow(x,cn);
182 }
183 else if (n > 0)
184 return c_powu(x,n);
185 else
186 return c_quot(c_1,c_powu(x,-n));
187
188}
189
Christian Heimes6f341092008-04-18 23:13:07 +0000190double
191c_abs(Py_complex z)
192{
193 /* sets errno = ERANGE on overflow; otherwise errno = 0 */
194 double result;
195
196 if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {
197 /* C99 rules: if either the real or the imaginary part is an
198 infinity, return infinity, even if the other part is a
199 NaN. */
200 if (Py_IS_INFINITY(z.real)) {
201 result = fabs(z.real);
202 errno = 0;
203 return result;
204 }
205 if (Py_IS_INFINITY(z.imag)) {
206 result = fabs(z.imag);
207 errno = 0;
208 return result;
209 }
210 /* either the real or imaginary part is a NaN,
211 and neither is infinite. Result should be NaN. */
212 return Py_NAN;
213 }
214 result = hypot(z.real, z.imag);
215 if (!Py_IS_FINITE(result))
216 errno = ERANGE;
217 else
218 errno = 0;
219 return result;
220}
221
Tim Peters6d6c1a32001-08-02 04:15:00 +0000222static PyObject *
223complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
224{
225 PyObject *op;
226
Georg Brandl6b50c632006-06-01 08:27:32 +0000227 op = type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000228 if (op != NULL)
229 ((PyComplexObject *)op)->cval = cval;
230 return op;
231}
232
Guido van Rossumf9fca921996-01-12 00:47:05 +0000233PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000234PyComplex_FromCComplex(Py_complex cval)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000235{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000236 register PyComplexObject *op;
237
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000238 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000239 op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
Guido van Rossumf9fca921996-01-12 00:47:05 +0000240 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000242 PyObject_INIT(op, &PyComplex_Type);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000243 op->cval = cval;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 return (PyObject *) op;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000245}
246
Tim Peters6d6c1a32001-08-02 04:15:00 +0000247static PyObject *
248complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
249{
250 Py_complex c;
251 c.real = real;
252 c.imag = imag;
253 return complex_subtype_from_c_complex(type, c);
254}
255
Guido van Rossumf9fca921996-01-12 00:47:05 +0000256PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000257PyComplex_FromDoubles(double real, double imag)
Guido van Rossum926518b1996-08-19 19:30:45 +0000258{
259 Py_complex c;
260 c.real = real;
261 c.imag = imag;
262 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000263}
264
265double
Fred Drake4288c802000-07-09 04:36:04 +0000266PyComplex_RealAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000267{
268 if (PyComplex_Check(op)) {
269 return ((PyComplexObject *)op)->cval.real;
Fred Drake4288c802000-07-09 04:36:04 +0000270 }
271 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000272 return PyFloat_AsDouble(op);
273 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000274}
275
276double
Fred Drake4288c802000-07-09 04:36:04 +0000277PyComplex_ImagAsDouble(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000278{
279 if (PyComplex_Check(op)) {
280 return ((PyComplexObject *)op)->cval.imag;
Fred Drake4288c802000-07-09 04:36:04 +0000281 }
282 else {
Guido van Rossum926518b1996-08-19 19:30:45 +0000283 return 0.0;
284 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000285}
286
Guido van Rossum9e720e31996-07-21 02:31:35 +0000287Py_complex
Fred Drake4288c802000-07-09 04:36:04 +0000288PyComplex_AsCComplex(PyObject *op)
Guido van Rossum926518b1996-08-19 19:30:45 +0000289{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000290 Py_complex cv;
Georg Brandl2b869942007-03-17 16:08:45 +0000291 PyObject *newop = NULL;
292 static PyObject *complex_str = NULL;
293
294 assert(op);
295 /* If op is already of type PyComplex_Type, return its value */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000296 if (PyComplex_Check(op)) {
297 return ((PyComplexObject *)op)->cval;
Fred Drake4288c802000-07-09 04:36:04 +0000298 }
Georg Brandl2b869942007-03-17 16:08:45 +0000299 /* If not, use op's __complex__ method, if it exists */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000300
Georg Brandl2b869942007-03-17 16:08:45 +0000301 /* return -1 on failure */
302 cv.real = -1.;
303 cv.imag = 0.;
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000304
305 if (complex_str == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000306 if (!(complex_str = PyString_InternFromString("__complex__")))
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000307 return cv;
308 }
Georg Brandl2b869942007-03-17 16:08:45 +0000309
310 if (PyInstance_Check(op)) {
311 /* this can go away in python 3000 */
Christian Heimesd7e1b2b2008-01-28 02:07:53 +0000312 if (PyObject_HasAttr(op, complex_str)) {
Georg Brandl2b869942007-03-17 16:08:45 +0000313 newop = PyObject_CallMethod(op, "__complex__", NULL);
314 if (!newop)
315 return cv;
316 }
317 /* else try __float__ */
318 } else {
319 PyObject *complexfunc;
Georg Brandl2b869942007-03-17 16:08:45 +0000320 complexfunc = _PyType_Lookup(op->ob_type, complex_str);
321 /* complexfunc is a borrowed reference */
322 if (complexfunc) {
323 newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
324 if (!newop)
325 return cv;
326 }
327 }
328
329 if (newop) {
330 if (!PyComplex_Check(newop)) {
331 PyErr_SetString(PyExc_TypeError,
332 "__complex__ should return a complex object");
333 Py_DECREF(newop);
334 return cv;
335 }
336 cv = ((PyComplexObject *)newop)->cval;
337 Py_DECREF(newop);
338 return cv;
339 }
340 /* If neither of the above works, interpret op as a float giving the
341 real part of the result, and fill in the imaginary part as 0. */
Fred Drake4288c802000-07-09 04:36:04 +0000342 else {
Georg Brandl2b869942007-03-17 16:08:45 +0000343 /* PyFloat_AsDouble will return -1 on failure */
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000344 cv.real = PyFloat_AsDouble(op);
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000345 return cv;
Tim Peters70695122001-03-11 08:37:29 +0000346 }
Guido van Rossumcf3d1081996-01-12 01:21:14 +0000347}
348
Guido van Rossumf9fca921996-01-12 00:47:05 +0000349static void
Fred Drake4288c802000-07-09 04:36:04 +0000350complex_dealloc(PyObject *op)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000351{
Guido van Rossum9475a232001-10-05 20:51:39 +0000352 op->ob_type->tp_free(op);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000353}
354
355
Mark Dickinson95bc9802009-04-24 12:46:53 +0000356static PyObject *
Eric Smitha985a3a2009-05-05 18:26:08 +0000357complex_format(PyComplexObject *v, int precision, char format_code)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000358{
Mark Dickinson95bc9802009-04-24 12:46:53 +0000359 PyObject *result = NULL;
360 Py_ssize_t len;
361
362 /* If these are non-NULL, they'll need to be freed. */
363 char *pre = NULL;
364 char *im = NULL;
365 char *buf = NULL;
366
367 /* These do not need to be freed. re is either an alias
368 for pre or a pointer to a constant. lead and tail
369 are pointers to constants. */
370 char *re = NULL;
371 char *lead = "";
372 char *tail = "";
373
374 if (v->cval.real == 0. && copysign(1.0, v->cval.real)==1.0) {
375 re = "";
376 im = PyOS_double_to_string(v->cval.imag, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000377 precision, 0, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000378 if (!im) {
379 PyErr_NoMemory();
380 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000381 }
Martin v. Löwis737ea822004-06-08 18:52:54 +0000382 } else {
Georg Brandlc404ff22005-09-16 06:42:26 +0000383 /* Format imaginary part with sign, real part without */
Mark Dickinson95bc9802009-04-24 12:46:53 +0000384 pre = PyOS_double_to_string(v->cval.real, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000385 precision, 0, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000386 if (!pre) {
387 PyErr_NoMemory();
388 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000389 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000390 re = pre;
391
392 im = PyOS_double_to_string(v->cval.imag, format_code,
Eric Smitha985a3a2009-05-05 18:26:08 +0000393 precision, Py_DTSF_SIGN, NULL);
Mark Dickinson95bc9802009-04-24 12:46:53 +0000394 if (!im) {
395 PyErr_NoMemory();
396 goto done;
Christian Heimes2f0da532008-02-15 06:57:08 +0000397 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000398 lead = "(";
399 tail = ")";
Martin v. Löwis737ea822004-06-08 18:52:54 +0000400 }
Mark Dickinson95bc9802009-04-24 12:46:53 +0000401 /* Alloc the final buffer. Add one for the "j" in the format string,
402 and one for the trailing zero. */
403 len = strlen(lead) + strlen(re) + strlen(im) + strlen(tail) + 2;
404 buf = PyMem_Malloc(len);
405 if (!buf) {
406 PyErr_NoMemory();
407 goto done;
408 }
409 PyOS_snprintf(buf, len, "%s%s%sj%s", lead, re, im, tail);
410 result = PyString_FromString(buf);
411 done:
412 PyMem_Free(im);
413 PyMem_Free(pre);
414 PyMem_Free(buf);
415
416 return result;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000417}
418
419static int
Fred Drake4288c802000-07-09 04:36:04 +0000420complex_print(PyComplexObject *v, FILE *fp, int flags)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000421{
Mark Dickinson95bc9802009-04-24 12:46:53 +0000422 PyObject *formatv;
423 char *buf;
Eric Smitha985a3a2009-05-05 18:26:08 +0000424 if (flags & Py_PRINT_RAW)
425 formatv = complex_format(v, PyFloat_STR_PRECISION, 'g');
426 else
427 formatv = complex_format(v, 0, 'r');
Mark Dickinson95bc9802009-04-24 12:46:53 +0000428 if (formatv == NULL)
429 return -1;
430 buf = PyString_AS_STRING(formatv);
Brett Cannon01531592007-09-17 03:28:34 +0000431 Py_BEGIN_ALLOW_THREADS
Guido van Rossumf9fca921996-01-12 00:47:05 +0000432 fputs(buf, fp);
Brett Cannon01531592007-09-17 03:28:34 +0000433 Py_END_ALLOW_THREADS
Mark Dickinson95bc9802009-04-24 12:46:53 +0000434 Py_DECREF(formatv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000435 return 0;
436}
437
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000439complex_repr(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000440{
Eric Smitha985a3a2009-05-05 18:26:08 +0000441 return complex_format(v, 0, 'r');
Tim Peters70695122001-03-11 08:37:29 +0000442}
443
444static PyObject *
445complex_str(PyComplexObject *v)
446{
Eric Smitha985a3a2009-05-05 18:26:08 +0000447 return complex_format(v, PyFloat_STR_PRECISION, 'g');
Guido van Rossumf9fca921996-01-12 00:47:05 +0000448}
449
Guido van Rossumf9fca921996-01-12 00:47:05 +0000450static long
Fred Drake4288c802000-07-09 04:36:04 +0000451complex_hash(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000452{
Tim Peters39dce292000-08-15 03:34:48 +0000453 long hashreal, hashimag, combined;
454 hashreal = _Py_HashDouble(v->cval.real);
455 if (hashreal == -1)
456 return -1;
457 hashimag = _Py_HashDouble(v->cval.imag);
458 if (hashimag == -1)
459 return -1;
460 /* Note: if the imaginary part is 0, hashimag is 0 now,
461 * so the following returns hashreal unchanged. This is
462 * important because numbers of different types that
463 * compare equal must have the same hash value, so that
464 * hash(x + 0*j) must equal hash(x).
465 */
466 combined = hashreal + 1000003 * hashimag;
467 if (combined == -1)
468 combined = -2;
469 return combined;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000470}
471
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000472/* This macro may return! */
473#define TO_COMPLEX(obj, c) \
474 if (PyComplex_Check(obj)) \
475 c = ((PyComplexObject *)(obj))->cval; \
476 else if (to_complex(&(obj), &(c)) < 0) \
477 return (obj)
478
479static int
480to_complex(PyObject **pobj, Py_complex *pc)
481{
482 PyObject *obj = *pobj;
483
484 pc->real = pc->imag = 0.0;
485 if (PyInt_Check(obj)) {
486 pc->real = PyInt_AS_LONG(obj);
487 return 0;
488 }
489 if (PyLong_Check(obj)) {
490 pc->real = PyLong_AsDouble(obj);
491 if (pc->real == -1.0 && PyErr_Occurred()) {
492 *pobj = NULL;
493 return -1;
494 }
495 return 0;
496 }
497 if (PyFloat_Check(obj)) {
498 pc->real = PyFloat_AsDouble(obj);
499 return 0;
500 }
501 Py_INCREF(Py_NotImplemented);
502 *pobj = Py_NotImplemented;
503 return -1;
504}
505
506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000508complex_add(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000509{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000510 Py_complex result;
511 PyFPE_START_PROTECT("complex_add", return 0)
512 result = c_sum(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000513 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 return PyComplex_FromCComplex(result);
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_sub(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000519{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000520 Py_complex result;
521 PyFPE_START_PROTECT("complex_sub", return 0)
522 result = c_diff(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000523 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000525}
526
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000528complex_mul(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000529{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000530 Py_complex result;
531 PyFPE_START_PROTECT("complex_mul", return 0)
532 result = c_prod(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000533 PyFPE_END_PROTECT(result)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 return PyComplex_FromCComplex(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000535}
536
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000538complex_div(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000539{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000540 Py_complex quot;
Christian Heimes6f341092008-04-18 23:13:07 +0000541
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000542 PyFPE_START_PROTECT("complex_div", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000543 errno = 0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000544 quot = c_quot(v->cval,w->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000545 PyFPE_END_PROTECT(quot)
Guido van Rossum96783941997-05-20 18:21:34 +0000546 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000548 return NULL;
549 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 return PyComplex_FromCComplex(quot);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000551}
552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyObject *
Guido van Rossum393661d2001-08-31 17:40:15 +0000554complex_classic_div(PyComplexObject *v, PyComplexObject *w)
555{
556 Py_complex quot;
557
Guido van Rossum1832de42001-09-04 03:51:09 +0000558 if (Py_DivisionWarningFlag >= 2 &&
Guido van Rossum393661d2001-08-31 17:40:15 +0000559 PyErr_Warn(PyExc_DeprecationWarning,
560 "classic complex division") < 0)
561 return NULL;
562
563 PyFPE_START_PROTECT("complex_classic_div", return 0)
564 errno = 0;
565 quot = c_quot(v->cval,w->cval);
566 PyFPE_END_PROTECT(quot)
567 if (errno == EDOM) {
568 PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
569 return NULL;
570 }
571 return PyComplex_FromCComplex(quot);
572}
573
574static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000575complex_remainder(PyComplexObject *v, PyComplexObject *w)
Guido van Rossumee09fc11996-09-11 13:55:55 +0000576{
Georg Brandl96f21842008-01-19 10:18:07 +0000577 Py_complex div, mod;
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000578
579 if (PyErr_Warn(PyExc_DeprecationWarning,
580 "complex divmod(), // and % are deprecated") < 0)
581 return NULL;
582
Guido van Rossum96783941997-05-20 18:21:34 +0000583 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000584 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000585 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 PyErr_SetString(PyExc_ZeroDivisionError, "complex remainder");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000587 return NULL;
588 }
589 div.real = floor(div.real); /* Use the floor of the real part. */
590 div.imag = 0.0;
591 mod = c_diff(v->cval, c_prod(w->cval, div));
592
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000593 return PyComplex_FromCComplex(mod);
Guido van Rossumee09fc11996-09-11 13:55:55 +0000594}
595
Guido van Rossumee09fc11996-09-11 13:55:55 +0000596
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000598complex_divmod(PyComplexObject *v, PyComplexObject *w)
Guido van Rossum3be12e91996-09-12 20:56:18 +0000599{
Georg Brandl96f21842008-01-19 10:18:07 +0000600 Py_complex div, mod;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000601 PyObject *d, *m, *z;
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000602
603 if (PyErr_Warn(PyExc_DeprecationWarning,
Guido van Rossum69cf3c72002-04-15 12:39:12 +0000604 "complex divmod(), // and % are deprecated") < 0)
Guido van Rossum9ec4c782002-04-15 01:41:56 +0000605 return NULL;
606
Guido van Rossum96783941997-05-20 18:21:34 +0000607 errno = 0;
Guido van Rossum3be12e91996-09-12 20:56:18 +0000608 div = c_quot(v->cval,w->cval); /* The raw divisor value. */
Guido van Rossum96783941997-05-20 18:21:34 +0000609 if (errno == EDOM) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610 PyErr_SetString(PyExc_ZeroDivisionError, "complex divmod()");
Guido van Rossum3be12e91996-09-12 20:56:18 +0000611 return NULL;
612 }
613 div.real = floor(div.real); /* Use the floor of the real part. */
614 div.imag = 0.0;
615 mod = c_diff(v->cval, c_prod(w->cval, div));
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 d = PyComplex_FromCComplex(div);
617 m = PyComplex_FromCComplex(mod);
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000618 z = PyTuple_Pack(2, d, m);
Guido van Rossum3be12e91996-09-12 20:56:18 +0000619 Py_XDECREF(d);
620 Py_XDECREF(m);
621 return z;
622}
Guido van Rossumf9fca921996-01-12 00:47:05 +0000623
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000624static PyObject *
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000625complex_pow(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000626{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000627 Py_complex p;
628 Py_complex exponent;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000629 long int_exponent;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000630 Py_complex a, b;
Georg Brandl96f21842008-01-19 10:18:07 +0000631 TO_COMPLEX(v, a);
632 TO_COMPLEX(w, b);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000633
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000634 if (z!=Py_None) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 PyErr_SetString(PyExc_ValueError, "complex modulo");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000636 return NULL;
637 }
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000638 PyFPE_START_PROTECT("complex_pow", return 0)
Guido van Rossum96783941997-05-20 18:21:34 +0000639 errno = 0;
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000640 exponent = b;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000641 int_exponent = (long)exponent.real;
642 if (exponent.imag == 0. && exponent.real == int_exponent)
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000643 p = c_powi(a,int_exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000644 else
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000645 p = c_pow(a,exponent);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000646
Guido van Rossum45b83911997-03-14 04:32:50 +0000647 PyFPE_END_PROTECT(p)
Tim Petersbab22be2002-03-22 02:48:46 +0000648 Py_ADJUST_ERANGE2(p.real, p.imag);
649 if (errno == EDOM) {
650 PyErr_SetString(PyExc_ZeroDivisionError,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 "0.0 to a negative or complex power");
Guido van Rossumf9fca921996-01-12 00:47:05 +0000652 return NULL;
653 }
Tim Petersbab22be2002-03-22 02:48:46 +0000654 else if (errno == ERANGE) {
655 PyErr_SetString(PyExc_OverflowError,
Neal Norwitz0593de32007-03-09 05:59:01 +0000656 "complex exponentiation");
Tim Petersbab22be2002-03-22 02:48:46 +0000657 return NULL;
658 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000659 return PyComplex_FromCComplex(p);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000660}
661
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662static PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000663complex_int_div(PyComplexObject *v, PyComplexObject *w)
664{
665 PyObject *t, *r;
666
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000667 if (PyErr_Warn(PyExc_DeprecationWarning,
668 "complex divmod(), // and % are deprecated") < 0)
669 return NULL;
670
Guido van Rossum4668b002001-08-08 05:00:18 +0000671 t = complex_divmod(v, w);
672 if (t != NULL) {
673 r = PyTuple_GET_ITEM(t, 0);
674 Py_INCREF(r);
675 Py_DECREF(t);
676 return r;
677 }
678 return NULL;
679}
680
681static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000682complex_neg(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000683{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000684 Py_complex neg;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000685 neg.real = -v->cval.real;
686 neg.imag = -v->cval.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000687 return PyComplex_FromCComplex(neg);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000688}
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000691complex_pos(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000692{
Tim Peters2400fa42001-09-12 19:12:49 +0000693 if (PyComplex_CheckExact(v)) {
694 Py_INCREF(v);
695 return (PyObject *)v;
696 }
697 else
698 return PyComplex_FromCComplex(v->cval);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000699}
700
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000701static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000702complex_abs(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000703{
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000704 double result;
Christian Heimes6f341092008-04-18 23:13:07 +0000705
Guido van Rossum09e6ad01997-02-14 22:54:21 +0000706 PyFPE_START_PROTECT("complex_abs", return 0)
Christian Heimes6f341092008-04-18 23:13:07 +0000707 result = c_abs(v->cval);
Guido van Rossum45b83911997-03-14 04:32:50 +0000708 PyFPE_END_PROTECT(result)
Christian Heimes6f341092008-04-18 23:13:07 +0000709
710 if (errno == ERANGE) {
711 PyErr_SetString(PyExc_OverflowError,
712 "absolute value too large");
713 return NULL;
714 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 return PyFloat_FromDouble(result);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000716}
717
718static int
Fred Drake4288c802000-07-09 04:36:04 +0000719complex_nonzero(PyComplexObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000720{
Guido van Rossum3bbef601999-01-25 19:42:19 +0000721 return v->cval.real != 0.0 || v->cval.imag != 0.0;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000722}
723
724static int
Fred Drake4288c802000-07-09 04:36:04 +0000725complex_coerce(PyObject **pv, PyObject **pw)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000726{
Guido van Rossum9e720e31996-07-21 02:31:35 +0000727 Py_complex cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000728 cval.imag = 0.;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000729 if (PyInt_Check(*pw)) {
730 cval.real = (double)PyInt_AsLong(*pw);
731 *pw = PyComplex_FromCComplex(cval);
732 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000733 return 0;
734 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735 else if (PyLong_Check(*pw)) {
736 cval.real = PyLong_AsDouble(*pw);
Tim Peters9fffa3e2001-09-04 05:14:19 +0000737 if (cval.real == -1.0 && PyErr_Occurred())
738 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739 *pw = PyComplex_FromCComplex(cval);
740 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000741 return 0;
742 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743 else if (PyFloat_Check(*pw)) {
744 cval.real = PyFloat_AsDouble(*pw);
745 *pw = PyComplex_FromCComplex(cval);
746 Py_INCREF(*pv);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000747 return 0;
748 }
Guido van Rossum63805962001-09-19 01:13:10 +0000749 else if (PyComplex_Check(*pw)) {
750 Py_INCREF(*pv);
751 Py_INCREF(*pw);
752 return 0;
753 }
Guido van Rossumf9fca921996-01-12 00:47:05 +0000754 return 1; /* Can't do it */
755}
756
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000757static PyObject *
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000758complex_richcompare(PyObject *v, PyObject *w, int op)
759{
760 int c;
761 Py_complex i, j;
762 PyObject *res;
763
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000764 c = PyNumber_CoerceEx(&v, &w);
765 if (c < 0)
766 return NULL;
767 if (c > 0) {
768 Py_INCREF(Py_NotImplemented);
769 return Py_NotImplemented;
770 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +0000771 /* Make sure both arguments are complex. */
772 if (!(PyComplex_Check(v) && PyComplex_Check(w))) {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000773 Py_DECREF(v);
774 Py_DECREF(w);
775 Py_INCREF(Py_NotImplemented);
776 return Py_NotImplemented;
777 }
778
779 i = ((PyComplexObject *)v)->cval;
780 j = ((PyComplexObject *)w)->cval;
781 Py_DECREF(v);
782 Py_DECREF(w);
783
Guido van Rossum22056422001-09-24 17:52:04 +0000784 if (op != Py_EQ && op != Py_NE) {
785 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger5d01aa42004-12-19 20:45:20 +0000786 "no ordering relation is defined for complex numbers");
Guido van Rossum22056422001-09-24 17:52:04 +0000787 return NULL;
788 }
789
Guido van Rossumbe4cbb12001-01-18 01:12:39 +0000790 if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
791 res = Py_True;
792 else
793 res = Py_False;
794
795 Py_INCREF(res);
796 return res;
797}
798
799static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000800complex_int(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000801{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000802 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000803 "can't convert complex to int");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000804 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000805}
806
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000807static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000808complex_long(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000809{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000810 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000811 "can't convert complex to long");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000812 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000813}
814
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000815static PyObject *
Fred Drake4288c802000-07-09 04:36:04 +0000816complex_float(PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000817{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000818 PyErr_SetString(PyExc_TypeError,
Mark Dickinson50626db2009-05-17 10:38:30 +0000819 "can't convert complex to float");
Guido van Rossumd4ab3cd1996-09-11 22:54:37 +0000820 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000821}
822
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000823static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000824complex_conjugate(PyObject *self)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000825{
Guido van Rossum926518b1996-08-19 19:30:45 +0000826 Py_complex c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 c = ((PyComplexObject *)self)->cval;
Guido van Rossumf9fca921996-01-12 00:47:05 +0000828 c.imag = -c.imag;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829 return PyComplex_FromCComplex(c);
Guido van Rossumf9fca921996-01-12 00:47:05 +0000830}
831
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000832PyDoc_STRVAR(complex_conjugate_doc,
833"complex.conjugate() -> complex\n"
834"\n"
835"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");
836
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000837static PyObject *
838complex_getnewargs(PyComplexObject *v)
839{
Alexandre Vassalotti80af6da2008-06-04 20:41:44 +0000840 Py_complex c = v->cval;
841 return Py_BuildValue("(dd)", c.real, c.imag);
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000842}
843
Eric Smith9139cc62009-04-30 00:58:58 +0000844PyDoc_STRVAR(complex__format__doc,
845"complex.__format__() -> str\n"
846"\n"
847"Converts to a string according to format_spec.");
848
849static PyObject *
850complex__format__(PyObject* self, PyObject* args)
851{
852 PyObject *format_spec;
853
854 if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
855 return NULL;
856 if (PyBytes_Check(format_spec))
857 return _PyComplex_FormatAdvanced(self,
858 PyBytes_AS_STRING(format_spec),
859 PyBytes_GET_SIZE(format_spec));
860 if (PyUnicode_Check(format_spec)) {
861 /* Convert format_spec to a str */
862 PyObject *result;
863 PyObject *str_spec = PyObject_Str(format_spec);
864
865 if (str_spec == NULL)
866 return NULL;
867
868 result = _PyComplex_FormatAdvanced(self,
869 PyBytes_AS_STRING(str_spec),
870 PyBytes_GET_SIZE(str_spec));
871
872 Py_DECREF(str_spec);
873 return result;
874 }
875 PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
876 return NULL;
877}
878
Christian Heimes6f341092008-04-18 23:13:07 +0000879#if 0
880static PyObject *
881complex_is_finite(PyObject *self)
882{
883 Py_complex c;
884 c = ((PyComplexObject *)self)->cval;
885 return PyBool_FromLong((long)(Py_IS_FINITE(c.real) &&
886 Py_IS_FINITE(c.imag)));
887}
888
889PyDoc_STRVAR(complex_is_finite_doc,
890"complex.is_finite() -> bool\n"
891"\n"
892"Returns True if the real and the imaginary part is finite.");
893#endif
894
Guido van Rossumf9fca921996-01-12 00:47:05 +0000895static PyMethodDef complex_methods[] = {
Jeffrey Yasskin2f3c16b2008-01-03 02:21:52 +0000896 {"conjugate", (PyCFunction)complex_conjugate, METH_NOARGS,
897 complex_conjugate_doc},
Christian Heimes6f341092008-04-18 23:13:07 +0000898#if 0
899 {"is_finite", (PyCFunction)complex_is_finite, METH_NOARGS,
900 complex_is_finite_doc},
901#endif
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000902 {"__getnewargs__", (PyCFunction)complex_getnewargs, METH_NOARGS},
Eric Smith9139cc62009-04-30 00:58:58 +0000903 {"__format__", (PyCFunction)complex__format__,
904 METH_VARARGS, complex__format__doc},
Guido van Rossumf9fca921996-01-12 00:47:05 +0000905 {NULL, NULL} /* sentinel */
906};
907
Guido van Rossum6f799372001-09-20 20:46:19 +0000908static PyMemberDef complex_members[] = {
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000909 {"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000910 "the real part of a complex number"},
Guido van Rossumfa2e4c22002-02-08 21:26:07 +0000911 {"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
Guido van Rossum6f799372001-09-20 20:46:19 +0000912 "the imaginary part of a complex number"},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000913 {0},
914};
Guido van Rossumf9fca921996-01-12 00:47:05 +0000915
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000916static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000917complex_subtype_from_string(PyTypeObject *type, PyObject *v)
Guido van Rossumf9fca921996-01-12 00:47:05 +0000918{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000919 const char *s, *start;
920 char *end;
921 double x=0.0, y=0.0, z;
Mark Dickinson95bc9802009-04-24 12:46:53 +0000922 int got_bracket=0;
Guido van Rossum70e36882001-10-25 18:07:22 +0000923#ifdef Py_USING_UNICODE
924 char s_buffer[256];
925#endif
Martin v. Löwis18e16552006-02-15 17:27:45 +0000926 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000927
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000928 if (PyString_Check(v)) {
929 s = PyString_AS_STRING(v);
930 len = PyString_GET_SIZE(v);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000932#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +0000933 else if (PyUnicode_Check(v)) {
Skip Montanaro429433b2006-04-18 00:35:43 +0000934 if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000935 PyErr_SetString(PyExc_ValueError,
936 "complex() literal too large to convert");
937 return NULL;
938 }
939 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
940 PyUnicode_GET_SIZE(v),
941 s_buffer,
942 NULL))
943 return NULL;
944 s = s_buffer;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000945 len = strlen(s);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000946 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000947#endif
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948 else if (PyObject_AsCharBuffer(v, &s, &len)) {
949 PyErr_SetString(PyExc_TypeError,
950 "complex() arg is not a string");
951 return NULL;
952 }
953
954 /* position on first nonblank */
955 start = s;
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000956 while (Py_ISSPACE(*s))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +0000958 if (*s == '(') {
Collin Wintere38051d2007-03-09 20:33:07 +0000959 /* Skip over possible bracket from repr(). */
960 got_bracket = 1;
961 s++;
Mark Dickinson777e4ff2009-05-03 20:59:48 +0000962 while (Py_ISSPACE(*s))
Collin Wintere38051d2007-03-09 20:33:07 +0000963 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000964 }
965
Mark Dickinson95bc9802009-04-24 12:46:53 +0000966 /* a valid complex string usually takes one of the three forms:
Tim Peters6d6c1a32001-08-02 04:15:00 +0000967
Mark Dickinson95bc9802009-04-24 12:46:53 +0000968 <float> - real part only
969 <float>j - imaginary part only
970 <float><signed-float>j - real and imaginary parts
Tim Peters6d6c1a32001-08-02 04:15:00 +0000971
Mark Dickinson95bc9802009-04-24 12:46:53 +0000972 where <float> represents any numeric string that's accepted by the
973 float constructor (including 'nan', 'inf', 'infinity', etc.), and
974 <signed-float> is any string of the form <float> whose first
975 character is '+' or '-'.
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976
Mark Dickinson95bc9802009-04-24 12:46:53 +0000977 For backwards compatibility, the extra forms
978
979 <float><sign>j
980 <sign>j
981 j
982
983 are also accepted, though support for these forms may be removed from
984 a future version of Python.
985 */
986
987 /* first look for forms starting with <float> */
Mark Dickinson944c6ae2009-04-26 14:00:08 +0000988 errno = 0;
Mark Dickinson95bc9802009-04-24 12:46:53 +0000989 z = PyOS_ascii_strtod(s, &end);
990 if (end == s && errno == ENOMEM)
991 return PyErr_NoMemory();
Mark Dickinson95bc9802009-04-24 12:46:53 +0000992
993 if (end != s) {
994 /* all 4 forms starting with <float> land here */
995 s = end;
996 if (*s == '+' || *s == '-') {
997 /* <float><signed-float>j | <float><sign>j */
998 x = z;
Mark Dickinson944c6ae2009-04-26 14:00:08 +0000999 errno = 0;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001000 y = PyOS_ascii_strtod(s, &end);
1001 if (end == s && errno == ENOMEM)
1002 return PyErr_NoMemory();
Mark Dickinson95bc9802009-04-24 12:46:53 +00001003 if (end != s)
1004 /* <float><signed-float>j */
1005 s = end;
1006 else {
1007 /* <float><sign>j */
1008 y = *s == '+' ? 1.0 : -1.0;
Collin Wintere38051d2007-03-09 20:33:07 +00001009 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001010 }
1011 if (!(*s == 'j' || *s == 'J'))
1012 goto parse_error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001014 }
1015 else if (*s == 'j' || *s == 'J') {
1016 /* <float>j */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 s++;
Mark Dickinson95bc9802009-04-24 12:46:53 +00001018 y = z;
1019 }
1020 else
1021 /* <float> */
1022 x = z;
1023 }
1024 else {
1025 /* not starting with <float>; must be <sign>j or j */
1026 if (*s == '+' || *s == '-') {
1027 /* <sign>j */
1028 y = *s == '+' ? 1.0 : -1.0;
1029 s++;
1030 }
1031 else
1032 /* j */
1033 y = 1.0;
1034 if (!(*s == 'j' || *s == 'J'))
1035 goto parse_error;
1036 s++;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001037 }
1038
Mark Dickinson95bc9802009-04-24 12:46:53 +00001039 /* trailing whitespace and closing bracket */
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001040 while (Py_ISSPACE(*s))
Mark Dickinson95bc9802009-04-24 12:46:53 +00001041 s++;
1042 if (got_bracket) {
1043 /* if there was an opening parenthesis, then the corresponding
1044 closing parenthesis should be right here */
1045 if (*s != ')')
1046 goto parse_error;
1047 s++;
Mark Dickinson777e4ff2009-05-03 20:59:48 +00001048 while (Py_ISSPACE(*s))
Mark Dickinson95bc9802009-04-24 12:46:53 +00001049 s++;
1050 }
1051
1052 /* we should now be at the end of the string */
1053 if (s-start != len)
1054 goto parse_error;
1055
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056 return complex_subtype_from_doubles(type, x, y);
Mark Dickinson95bc9802009-04-24 12:46:53 +00001057
1058 parse_error:
1059 PyErr_SetString(PyExc_ValueError,
1060 "complex() arg is a malformed string");
1061 return NULL;
Guido van Rossumf9fca921996-01-12 00:47:05 +00001062}
1063
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064static PyObject *
1065complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1066{
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001067 PyObject *r, *i, *tmp, *f;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001068 PyNumberMethods *nbr, *nbi = NULL;
1069 Py_complex cr, ci;
1070 int own_r = 0;
Guido van Rossum715ec182007-11-27 22:38:36 +00001071 int cr_is_complex = 0;
1072 int ci_is_complex = 0;
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001073 static PyObject *complexstr;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001074 static char *kwlist[] = {"real", "imag", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001075
1076 r = Py_False;
1077 i = NULL;
1078 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
1079 &r, &i))
1080 return NULL;
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001081
Georg Brandl8f032cb2007-03-13 07:57:51 +00001082 /* Special-case for a single argument when type(arg) is complex. */
Guido van Rossum4eadfa22003-03-02 13:51:47 +00001083 if (PyComplex_CheckExact(r) && i == NULL &&
1084 type == &PyComplex_Type) {
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001085 /* Note that we can't know whether it's safe to return
1086 a complex *subclass* instance as-is, hence the restriction
Georg Brandl8f032cb2007-03-13 07:57:51 +00001087 to exact complexes here. If either the input or the
1088 output is a complex subclass, it will be handled below
1089 as a non-orthogonal vector. */
Raymond Hettinger604cd6a2002-08-29 14:22:51 +00001090 Py_INCREF(r);
1091 return r;
1092 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001093 if (PyString_Check(r) || PyUnicode_Check(r)) {
Fred Drake526c7a02001-12-13 19:52:22 +00001094 if (i != NULL) {
1095 PyErr_SetString(PyExc_TypeError,
1096 "complex() can't take second arg"
1097 " if first is a string");
1098 return NULL;
Georg Brandl96f21842008-01-19 10:18:07 +00001099 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001100 return complex_subtype_from_string(type, r);
Fred Drake526c7a02001-12-13 19:52:22 +00001101 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001102 if (i != NULL && (PyString_Check(i) || PyUnicode_Check(i))) {
Fred Drake526c7a02001-12-13 19:52:22 +00001103 PyErr_SetString(PyExc_TypeError,
1104 "complex() second arg can't be a string");
1105 return NULL;
1106 }
Tim Peters2400fa42001-09-12 19:12:49 +00001107
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001108 /* XXX Hack to support classes with __complex__ method */
1109 if (complexstr == NULL) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001110 complexstr = PyString_InternFromString("__complex__");
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001111 if (complexstr == NULL)
1112 return NULL;
1113 }
1114 f = PyObject_GetAttr(r, complexstr);
1115 if (f == NULL)
1116 PyErr_Clear();
1117 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001118 PyObject *args = PyTuple_New(0);
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001119 if (args == NULL)
1120 return NULL;
1121 r = PyEval_CallObject(f, args);
1122 Py_DECREF(args);
1123 Py_DECREF(f);
1124 if (r == NULL)
1125 return NULL;
1126 own_r = 1;
1127 }
Tim Peters2400fa42001-09-12 19:12:49 +00001128 nbr = r->ob_type->tp_as_number;
1129 if (i != NULL)
1130 nbi = i->ob_type->tp_as_number;
1131 if (nbr == NULL || nbr->nb_float == NULL ||
1132 ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133 PyErr_SetString(PyExc_TypeError,
Raymond Hettinger478d47a2002-06-06 15:45:38 +00001134 "complex() argument must be a string or a number");
Tim Peters465fa3d2003-08-15 01:16:37 +00001135 if (own_r) {
1136 Py_DECREF(r);
1137 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001138 return NULL;
1139 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001140
1141 /* If we get this far, then the "real" and "imag" parts should
1142 both be treated as numbers, and the constructor should return a
1143 complex number equal to (real + imag*1j).
1144
1145 Note that we do NOT assume the input to already be in canonical
1146 form; the "real" and "imag" parts might themselves be complex
1147 numbers, which slightly complicates the code below. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001148 if (PyComplex_Check(r)) {
Tim Peters2400fa42001-09-12 19:12:49 +00001149 /* Note that if r is of a complex subtype, we're only
1150 retaining its real & imag parts here, and the return
1151 value is (properly) of the builtin complex type. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001152 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001153 cr_is_complex = 1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001154 if (own_r) {
1155 Py_DECREF(r);
1156 }
1157 }
1158 else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001159 /* The "real" part really is entirely real, and contributes
1160 nothing in the imaginary direction.
1161 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001162 tmp = PyNumber_Float(r);
1163 if (own_r) {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001164 /* r was a newly created complex number, rather
1165 than the original "real" argument. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001166 Py_DECREF(r);
1167 }
1168 if (tmp == NULL)
1169 return NULL;
1170 if (!PyFloat_Check(tmp)) {
1171 PyErr_SetString(PyExc_TypeError,
1172 "float(r) didn't return a float");
1173 Py_DECREF(tmp);
1174 return NULL;
1175 }
1176 cr.real = PyFloat_AsDouble(tmp);
Georg Brandl96f21842008-01-19 10:18:07 +00001177 cr.imag = 0.0; /* Shut up compiler warning */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001178 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001179 }
1180 if (i == NULL) {
1181 ci.real = 0.0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001182 }
Guido van Rossum715ec182007-11-27 22:38:36 +00001183 else if (PyComplex_Check(i)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001184 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum715ec182007-11-27 22:38:36 +00001185 ci_is_complex = 1;
1186 } else {
Georg Brandl8f032cb2007-03-13 07:57:51 +00001187 /* The "imag" part really is entirely imaginary, and
1188 contributes nothing in the real direction.
1189 Just treat it as a double. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001190 tmp = (*nbi->nb_float)(i);
1191 if (tmp == NULL)
1192 return NULL;
1193 ci.real = PyFloat_AsDouble(tmp);
1194 Py_DECREF(tmp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001195 }
Georg Brandl8f032cb2007-03-13 07:57:51 +00001196 /* If the input was in canonical form, then the "real" and "imag"
Guido van Rossum715ec182007-11-27 22:38:36 +00001197 parts are real numbers, so that ci.imag and cr.imag are zero.
Georg Brandl8f032cb2007-03-13 07:57:51 +00001198 We need this correction in case they were not real numbers. */
Guido van Rossum715ec182007-11-27 22:38:36 +00001199
1200 if (ci_is_complex) {
1201 cr.real -= ci.imag;
1202 }
1203 if (cr_is_complex) {
1204 ci.real += cr.imag;
1205 }
1206 return complex_subtype_from_doubles(type, cr.real, ci.real);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001207}
1208
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001209PyDoc_STRVAR(complex_doc,
Tim Peters2400fa42001-09-12 19:12:49 +00001210"complex(real[, imag]) -> complex number\n"
1211"\n"
1212"Create a complex number from a real part and an optional imaginary part.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001213"This is equivalent to (real + imag*1j) where imag defaults to 0.");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001214
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001215static PyNumberMethods complex_as_number = {
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001216 (binaryfunc)complex_add, /* nb_add */
1217 (binaryfunc)complex_sub, /* nb_subtract */
1218 (binaryfunc)complex_mul, /* nb_multiply */
Guido van Rossum393661d2001-08-31 17:40:15 +00001219 (binaryfunc)complex_classic_div, /* nb_divide */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001220 (binaryfunc)complex_remainder, /* nb_remainder */
1221 (binaryfunc)complex_divmod, /* nb_divmod */
1222 (ternaryfunc)complex_pow, /* nb_power */
1223 (unaryfunc)complex_neg, /* nb_negative */
1224 (unaryfunc)complex_pos, /* nb_positive */
1225 (unaryfunc)complex_abs, /* nb_absolute */
1226 (inquiry)complex_nonzero, /* nb_nonzero */
1227 0, /* nb_invert */
1228 0, /* nb_lshift */
1229 0, /* nb_rshift */
1230 0, /* nb_and */
1231 0, /* nb_xor */
1232 0, /* nb_or */
Georg Brandl347b3002006-03-30 11:57:00 +00001233 complex_coerce, /* nb_coerce */
1234 complex_int, /* nb_int */
1235 complex_long, /* nb_long */
1236 complex_float, /* nb_float */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001237 0, /* nb_oct */
1238 0, /* nb_hex */
Guido van Rossum4668b002001-08-08 05:00:18 +00001239 0, /* nb_inplace_add */
1240 0, /* nb_inplace_subtract */
1241 0, /* nb_inplace_multiply*/
1242 0, /* nb_inplace_divide */
1243 0, /* nb_inplace_remainder */
1244 0, /* nb_inplace_power */
1245 0, /* nb_inplace_lshift */
1246 0, /* nb_inplace_rshift */
1247 0, /* nb_inplace_and */
1248 0, /* nb_inplace_xor */
1249 0, /* nb_inplace_or */
1250 (binaryfunc)complex_int_div, /* nb_floor_divide */
1251 (binaryfunc)complex_div, /* nb_true_divide */
1252 0, /* nb_inplace_floor_divide */
1253 0, /* nb_inplace_true_divide */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001254};
1255
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256PyTypeObject PyComplex_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001257 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossumf9fca921996-01-12 00:47:05 +00001258 "complex",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001259 sizeof(PyComplexObject),
Guido van Rossumf9fca921996-01-12 00:47:05 +00001260 0,
Georg Brandl347b3002006-03-30 11:57:00 +00001261 complex_dealloc, /* tp_dealloc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001262 (printfunc)complex_print, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001263 0, /* tp_getattr */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001264 0, /* tp_setattr */
1265 0, /* tp_compare */
1266 (reprfunc)complex_repr, /* tp_repr */
1267 &complex_as_number, /* tp_as_number */
1268 0, /* tp_as_sequence */
1269 0, /* tp_as_mapping */
1270 (hashfunc)complex_hash, /* tp_hash */
1271 0, /* tp_call */
Tim Peters70695122001-03-11 08:37:29 +00001272 (reprfunc)complex_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001273 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001274 0, /* tp_setattro */
1275 0, /* tp_as_buffer */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001276 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1277 complex_doc, /* tp_doc */
Guido van Rossumbe4cbb12001-01-18 01:12:39 +00001278 0, /* tp_traverse */
1279 0, /* tp_clear */
1280 complex_richcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001281 0, /* tp_weaklistoffset */
1282 0, /* tp_iter */
1283 0, /* tp_iternext */
1284 complex_methods, /* tp_methods */
1285 complex_members, /* tp_members */
1286 0, /* tp_getset */
1287 0, /* tp_base */
1288 0, /* tp_dict */
1289 0, /* tp_descr_get */
1290 0, /* tp_descr_set */
1291 0, /* tp_dictoffset */
1292 0, /* tp_init */
Georg Brandl6b50c632006-06-01 08:27:32 +00001293 PyType_GenericAlloc, /* tp_alloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001294 complex_new, /* tp_new */
Neil Schemenaueraa769ae2002-04-12 02:44:10 +00001295 PyObject_Del, /* tp_free */
Guido van Rossumf9fca921996-01-12 00:47:05 +00001296};
1297
1298#endif