complexobject.c 23.4 KB
Newer Older
1

2 3 4 5
/* Complex object implementation */

/* Borrows heavily from floatobject.c */

6 7
/* Submitted by Jim Hugunin */

8
#include "Python.h"
9
#include "structmember.h"
10

11 12
#ifndef WITHOUT_COMPLEX

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* Precisions used by repr() and str(), respectively.

   The repr() precision (17 significant decimal digits) is the minimal number
   that is guaranteed to have enough precision so that if the number is read
   back in the exact same binary value is recreated.  This is true for IEEE
   floating point by design, and also happens to work for all other modern
   hardware.

   The str() precision is chosen so that in most cases, the rounding noise
   created by various operations is suppressed, while giving plenty of
   precision for practical use.
*/

#define PREC_REPR	17
#define PREC_STR	12
28 29 30

/* elementary operations on complex numbers */

Guido van Rossum's avatar
Guido van Rossum committed
31
static Py_complex c_1 = {1., 0.};
32

33 34
Py_complex
c_sum(Py_complex a, Py_complex b)
35
{
Guido van Rossum's avatar
Guido van Rossum committed
36
	Py_complex r;
37 38 39 40 41
	r.real = a.real + b.real;
	r.imag = a.imag + b.imag;
	return r;
}

42 43
Py_complex
c_diff(Py_complex a, Py_complex b)
44
{
Guido van Rossum's avatar
Guido van Rossum committed
45
	Py_complex r;
46 47 48 49 50
	r.real = a.real - b.real;
	r.imag = a.imag - b.imag;
	return r;
}

51 52
Py_complex
c_neg(Py_complex a)
53
{
Guido van Rossum's avatar
Guido van Rossum committed
54
	Py_complex r;
55 56 57 58 59
	r.real = -a.real;
	r.imag = -a.imag;
	return r;
}

60 61
Py_complex
c_prod(Py_complex a, Py_complex b)
62
{
Guido van Rossum's avatar
Guido van Rossum committed
63
	Py_complex r;
64 65 66 67 68
	r.real = a.real*b.real - a.imag*b.imag;
	r.imag = a.real*b.imag + a.imag*b.real;
	return r;
}

69 70
Py_complex
c_quot(Py_complex a, Py_complex b)
71
{
72 73 74 75 76 77 78
	/******************************************************************
	This was the original algorithm.  It's grossly prone to spurious
	overflow and underflow errors.  It also merrily divides by 0 despite
	checking for that(!).  The code still serves a doc purpose here, as
	the algorithm following is a simple by-cases transformation of this
	one:

Guido van Rossum's avatar
Guido van Rossum committed
79
	Py_complex r;
80 81
	double d = b.real*b.real + b.imag*b.imag;
	if (d == 0.)
82
		errno = EDOM;
83 84 85
	r.real = (a.real*b.real + a.imag*b.imag)/d;
	r.imag = (a.imag*b.real - a.real*b.imag)/d;
	return r;
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
	******************************************************************/

	/* This algorithm is better, and is pretty obvious:  first divide the
	 * numerators and denominator by whichever of {b.real, b.imag} has
	 * larger magnitude.  The earliest reference I found was to CACM
	 * Algorithm 116 (Complex Division, Robert L. Smith, Stanford
	 * University).  As usual, though, we're still ignoring all IEEE
	 * endcases.
	 */
	 Py_complex r;	/* the result */
 	 const double abs_breal = b.real < 0 ? -b.real : b.real;
	 const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;

	 if (abs_breal >= abs_bimag) {
 		/* divide tops and bottom by b.real */
	 	if (abs_breal == 0.0) {
	 		errno = EDOM;
	 		r.real = r.imag = 0.0;
	 	}
	 	else {
	 		const double ratio = b.imag / b.real;
	 		const double denom = b.real + b.imag * ratio;
	 		r.real = (a.real + a.imag * ratio) / denom;
	 		r.imag = (a.imag - a.real * ratio) / denom;
	 	}
	}
	else {
		/* divide tops and bottom by b.imag */
		const double ratio = b.real / b.imag;
		const double denom = b.real * ratio + b.imag;
		assert(b.imag != 0.0);
		r.real = (a.real * ratio + a.imag) / denom;
		r.imag = (a.imag * ratio - a.real) / denom;
	}
	return r;
121 122
}

123 124
Py_complex
c_pow(Py_complex a, Py_complex b)
125
{
Guido van Rossum's avatar
Guido van Rossum committed
126
	Py_complex r;
127 128 129 130 131 132 133
	double vabs,len,at,phase;
	if (b.real == 0. && b.imag == 0.) {
		r.real = 1.;
		r.imag = 0.;
	}
	else if (a.real == 0. && a.imag == 0.) {
		if (b.imag != 0. || b.real < 0.)
134
			errno = EDOM;
135 136 137 138 139 140
		r.real = 0.;
		r.imag = 0.;
	}
	else {
		vabs = hypot(a.real,a.imag);
		len = pow(vabs,b.real);
141
		at = atan2(a.imag, a.real);
142 143 144 145 146 147 148 149 150 151 152
		phase = at*b.real;
		if (b.imag != 0.0) {
			len /= exp(at*b.imag);
			phase += b.imag*log(vabs);
		}
		r.real = len*cos(phase);
		r.imag = len*sin(phase);
	}
	return r;
}

153 154
static Py_complex
c_powu(Py_complex x, long n)
155
{
156
	Py_complex r, p;
157
	long mask = 1;
158 159
	r = c_1;
	p = x;
160 161 162 163 164 165 166 167 168
	while (mask > 0 && n >= mask) {
		if (n & mask)
			r = c_prod(r,p);
		mask <<= 1;
		p = c_prod(p,p);
	}
	return r;
}

169 170
static Py_complex
c_powi(Py_complex x, long n)
171
{
Guido van Rossum's avatar
Guido van Rossum committed
172
	Py_complex cn;
173 174 175 176 177 178 179 180 181 182 183 184 185

	if (n > 100 || n < -100) {
		cn.real = (double) n;
		cn.imag = 0.;
		return c_pow(x,cn);
	}
	else if (n > 0)
		return c_powu(x,n);
	else
		return c_quot(c_1,c_powu(x,-n));

}

186 187 188 189 190
static PyObject *
complex_subtype_from_c_complex(PyTypeObject *type, Py_complex cval)
{
	PyObject *op;

191
	op = type->tp_alloc(type, 0);
192 193 194 195 196
	if (op != NULL)
		((PyComplexObject *)op)->cval = cval;
	return op;
}

197
PyObject *
198
PyComplex_FromCComplex(Py_complex cval)
199
{
200 201
	register PyComplexObject *op;

202
	/* Inline PyObject_New */
203
	op = (PyComplexObject *) PyObject_MALLOC(sizeof(PyComplexObject));
204
	if (op == NULL)
205
		return PyErr_NoMemory();
206
	PyObject_INIT(op, &PyComplex_Type);
207
	op->cval = cval;
208
	return (PyObject *) op;
209 210
}

211 212 213 214 215 216 217 218 219
static PyObject *
complex_subtype_from_doubles(PyTypeObject *type, double real, double imag)
{
	Py_complex c;
	c.real = real;
	c.imag = imag;
	return complex_subtype_from_c_complex(type, c);
}

220
PyObject *
221
PyComplex_FromDoubles(double real, double imag)
222 223 224 225 226
{
	Py_complex c;
	c.real = real;
	c.imag = imag;
	return PyComplex_FromCComplex(c);
227 228 229
}

double
230
PyComplex_RealAsDouble(PyObject *op)
231 232 233
{
	if (PyComplex_Check(op)) {
		return ((PyComplexObject *)op)->cval.real;
234 235
	}
	else {
236 237
		return PyFloat_AsDouble(op);
	}
238 239 240
}

double
241
PyComplex_ImagAsDouble(PyObject *op)
242 243 244
{
	if (PyComplex_Check(op)) {
		return ((PyComplexObject *)op)->cval.imag;
245 246
	}
	else {
247 248
		return 0.0;
	}
249 250
}

Guido van Rossum's avatar
Guido van Rossum committed
251
Py_complex
252
PyComplex_AsCComplex(PyObject *op)
253
{
Guido van Rossum's avatar
Guido van Rossum committed
254
	Py_complex cv;
255 256 257 258 259
	PyObject *newop = NULL;
	static PyObject *complex_str = NULL;

	assert(op);
	/* If op is already of type PyComplex_Type, return its value */
260 261
	if (PyComplex_Check(op)) {
		return ((PyComplexObject *)op)->cval;
262
	}
263 264 265 266 267 268 269 270 271
	/* If not, use op's __complex__  method, if it exists */
	
	/* return -1 on failure */
	cv.real = -1.;
	cv.imag = 0.;
	
        {
		PyObject *complexfunc;
		if (!complex_str) {
272
			if (!(complex_str = PyUnicode_FromString("__complex__")))
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
				return cv;
		}
		complexfunc = _PyType_Lookup(op->ob_type, complex_str);
		/* complexfunc is a borrowed reference */
		if (complexfunc) {
			newop = PyObject_CallFunctionObjArgs(complexfunc, op, NULL);
			if (!newop)
				return cv;
		}
	}

	if (newop) {
		if (!PyComplex_Check(newop)) {
			PyErr_SetString(PyExc_TypeError,
				"__complex__ should return a complex object");
			Py_DECREF(newop);
			return cv;
		}
		cv = ((PyComplexObject *)newop)->cval;
		Py_DECREF(newop);
		return cv;
	}
	/* If neither of the above works, interpret op as a float giving the
	   real part of the result, and fill in the imaginary part as 0. */
297
	else {
298
		/* PyFloat_AsDouble will return -1 on failure */
299 300
		cv.real = PyFloat_AsDouble(op);
		return cv;
301
	}
302 303
}

304
static void
305
complex_dealloc(PyObject *op)
306
{
307
	op->ob_type->tp_free(op);
308 309 310
}


311
static void
312
complex_to_buf(char *buf, int bufsz, PyComplexObject *v, int precision)
313
{
314 315
	char format[32];
	if (v->cval.real == 0.) {
316 317 318
		PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
		PyOS_ascii_formatd(buf, bufsz - 1, format, v->cval.imag);
		strncat(buf, "j", 1);
319 320
	} else {
		char re[64], im[64];
321
		/* Format imaginary part with sign, real part without */
322 323 324 325
		PyOS_snprintf(format, sizeof(format), "%%.%ig", precision);
		PyOS_ascii_formatd(re, sizeof(re), format, v->cval.real);
		PyOS_snprintf(format, sizeof(format), "%%+.%ig", precision);
		PyOS_ascii_formatd(im, sizeof(im), format, v->cval.imag);
326
		PyOS_snprintf(buf, bufsz, "(%s%sj)", re, im);
327
	}
328 329
}

330
static PyObject *
331
complex_repr(PyComplexObject *v)
332 333
{
	char buf[100];
334
	complex_to_buf(buf, sizeof(buf), v, PREC_REPR);
335
	return PyUnicode_FromString(buf);
336 337 338 339 340 341
}

static PyObject *
complex_str(PyComplexObject *v)
{
	char buf[100];
342
	complex_to_buf(buf, sizeof(buf), v, PREC_STR);
343
	return PyUnicode_FromString(buf);
344 345 346
}

static long
347
complex_hash(PyComplexObject *v)
348
{
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
	long hashreal, hashimag, combined;
	hashreal = _Py_HashDouble(v->cval.real);
	if (hashreal == -1)
		return -1;
	hashimag = _Py_HashDouble(v->cval.imag);
	if (hashimag == -1)
		return -1;
	/* Note:  if the imaginary part is 0, hashimag is 0 now,
	 * so the following returns hashreal unchanged.  This is
	 * important because numbers of different types that
	 * compare equal must have the same hash value, so that
	 * hash(x + 0*j) must equal hash(x).
	 */
	combined = hashreal + 1000003 * hashimag;
	if (combined == -1)
		combined = -2;
	return combined;
366 367
}

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
/* This macro may return! */
#define TO_COMPLEX(obj, c) \
	if (PyComplex_Check(obj)) \
		c = ((PyComplexObject *)(obj))->cval; \
	else if (to_complex(&(obj), &(c)) < 0) \
		return (obj)

static int
to_complex(PyObject **pobj, Py_complex *pc)
{
    PyObject *obj = *pobj;

    pc->real = pc->imag = 0.0;
    if (PyLong_Check(obj)) {
        pc->real = PyLong_AsDouble(obj);
        if (pc->real == -1.0 && PyErr_Occurred()) {
            *pobj = NULL;
            return -1;
        }
        return 0;
    }
    if (PyFloat_Check(obj)) {
        pc->real = PyFloat_AsDouble(obj);
        return 0;
    }
    Py_INCREF(Py_NotImplemented);
    *pobj = Py_NotImplemented;
    return -1;
}
		

399
static PyObject *
400
complex_add(PyObject *v, PyObject *w)
401
{
402
	Py_complex result;
403 404 405
	Py_complex a, b;
        TO_COMPLEX(v, a);
        TO_COMPLEX(w, b);
406
	PyFPE_START_PROTECT("complex_add", return 0)
407
	result = c_sum(a, b);
408
	PyFPE_END_PROTECT(result)
409
	return PyComplex_FromCComplex(result);
410 411
}

412
static PyObject *
413
complex_sub(PyObject *v, PyObject *w)
414
{
415
	Py_complex result;
416 417 418
	Py_complex a, b;
        TO_COMPLEX(v, a);
        TO_COMPLEX(w, b);
419
	PyFPE_START_PROTECT("complex_sub", return 0)
420
	result = c_diff(a, b);
421
	PyFPE_END_PROTECT(result)
422
	return PyComplex_FromCComplex(result);
423 424
}

425
static PyObject *
426
complex_mul(PyObject *v, PyObject *w)
427
{
428
	Py_complex result;
429 430 431
	Py_complex a, b;
        TO_COMPLEX(v, a);
        TO_COMPLEX(w, b);
432
	PyFPE_START_PROTECT("complex_mul", return 0)
433
	result = c_prod(a, b);
434
	PyFPE_END_PROTECT(result)
435
	return PyComplex_FromCComplex(result);
436 437
}

438
static PyObject *
439
complex_div(PyObject *v, PyObject *w)
440
{
Guido van Rossum's avatar
Guido van Rossum committed
441
	Py_complex quot;
442 443 444
	Py_complex a, b;
        TO_COMPLEX(v, a);
        TO_COMPLEX(w, b);
445
	PyFPE_START_PROTECT("complex_div", return 0)
446
	errno = 0;
447
	quot = c_quot(a, b);
448
	PyFPE_END_PROTECT(quot)
449
	if (errno == EDOM) {
450
		PyErr_SetString(PyExc_ZeroDivisionError, "complex division");
451 452
		return NULL;
	}
453
	return PyComplex_FromCComplex(quot);
454 455
}

456
static PyObject *
457
complex_remainder(PyObject *v, PyObject *w)
458
{
459 460 461
	PyErr_SetString(PyExc_TypeError,
			"can't mod complex numbers.");
	return NULL;
462 463 464
}


465
static PyObject *
466
complex_divmod(PyObject *v, PyObject *w)
467
{
468 469 470
	PyErr_SetString(PyExc_TypeError,
			"can't take floor or mod of complex number.");
	return NULL;
471
}
472

473
static PyObject *
474
complex_pow(PyObject *v, PyObject *w, PyObject *z)
475
{
Guido van Rossum's avatar
Guido van Rossum committed
476 477
	Py_complex p;
	Py_complex exponent;
478
	long int_exponent;
479 480 481
	Py_complex a, b;
        TO_COMPLEX(v, a);
        TO_COMPLEX(w, b);
482

483
 	if (z != Py_None) {
484
		PyErr_SetString(PyExc_ValueError, "complex modulo");
485 486
		return NULL;
	}
487
	PyFPE_START_PROTECT("complex_pow", return 0)
488
	errno = 0;
489
	exponent = b;
490 491
	int_exponent = (long)exponent.real;
	if (exponent.imag == 0. && exponent.real == int_exponent)
492
		p = c_powi(a, int_exponent);
493
	else
494
		p = c_pow(a, exponent);
495

496
	PyFPE_END_PROTECT(p)
497 498 499
	Py_ADJUST_ERANGE2(p.real, p.imag);
	if (errno == EDOM) {
		PyErr_SetString(PyExc_ZeroDivisionError,
500
				"0.0 to a negative or complex power");
501 502
		return NULL;
	}
503 504
	else if (errno == ERANGE) {
		PyErr_SetString(PyExc_OverflowError,
505
				"complex exponentiation");
506 507
		return NULL;
	}
508
	return PyComplex_FromCComplex(p);
509 510
}

511
static PyObject *
512
complex_int_div(PyObject *v, PyObject *w)
513
{
514 515
	PyErr_SetString(PyExc_TypeError,
			"can't take floor of complex number.");
516 517 518
	return NULL;
}

519
static PyObject *
520
complex_neg(PyComplexObject *v)
521
{
Guido van Rossum's avatar
Guido van Rossum committed
522
	Py_complex neg;
523 524
	neg.real = -v->cval.real;
	neg.imag = -v->cval.imag;
525
	return PyComplex_FromCComplex(neg);
526 527
}

528
static PyObject *
529
complex_pos(PyComplexObject *v)
530
{
531 532 533 534 535 536
	if (PyComplex_CheckExact(v)) {
		Py_INCREF(v);
		return (PyObject *)v;
	}
	else
		return PyComplex_FromCComplex(v->cval);
537 538
}

539
static PyObject *
540
complex_abs(PyComplexObject *v)
541
{
542 543 544
	double result;
	PyFPE_START_PROTECT("complex_abs", return 0)
	result = hypot(v->cval.real,v->cval.imag);
545
	PyFPE_END_PROTECT(result)
546
	return PyFloat_FromDouble(result);
547 548 549
}

static int
550
complex_bool(PyComplexObject *v)
551
{
552
	return v->cval.real != 0.0 || v->cval.imag != 0.0;
553 554
}

555 556 557 558
static PyObject *
complex_richcompare(PyObject *v, PyObject *w, int op)
{
	PyObject *res;
559 560 561
	Py_complex i, j;
        TO_COMPLEX(v, i);
        TO_COMPLEX(w, j);
562

563
	if (op != Py_EQ && op != Py_NE) {
564
		/* XXX Should eventually return NotImplemented */
565
		PyErr_SetString(PyExc_TypeError,
566
			"no ordering relation is defined for complex numbers");
567 568 569
		return NULL;
	}

570 571 572 573 574 575 576 577 578
	if ((i.real == j.real && i.imag == j.imag) == (op == Py_EQ))
		res = Py_True;
	else
		res = Py_False;

	Py_INCREF(res);
	return res;
}

579
static PyObject *
580
complex_int(PyObject *v)
581
{
582
	PyErr_SetString(PyExc_TypeError,
583
		   "can't convert complex to int; use int(abs(z))");
584
	return NULL;
585 586
}

587
static PyObject *
588
complex_long(PyObject *v)
589
{
590
	PyErr_SetString(PyExc_TypeError,
591
		   "can't convert complex to long; use long(abs(z))");
592
	return NULL;
593 594
}

595
static PyObject *
596
complex_float(PyObject *v)
597
{
598
	PyErr_SetString(PyExc_TypeError,
599
		   "can't convert complex to float; use abs(z)");
600
	return NULL;
601 602
}

603
static PyObject *
604
complex_conjugate(PyObject *self)
605
{
606
	Py_complex c;
607
	c = ((PyComplexObject *)self)->cval;
608
	c.imag = -c.imag;
609
	return PyComplex_FromCComplex(c);
610 611
}

612 613 614 615 616
PyDoc_STRVAR(complex_conjugate_doc,
"complex.conjugate() -> complex\n"
"\n"
"Returns the complex conjugate of its argument. (3-4j).conjugate() == 3+4j.");

617 618 619
static PyObject *
complex_getnewargs(PyComplexObject *v)
{
620
	return Py_BuildValue("(D)", &v->cval);
621 622
}

623
static PyMethodDef complex_methods[] = {
624 625
	{"conjugate",	(PyCFunction)complex_conjugate,	METH_NOARGS,
	 complex_conjugate_doc},
626
	{"__getnewargs__",	(PyCFunction)complex_getnewargs,	METH_NOARGS},
627 628 629
	{NULL,		NULL}		/* sentinel */
};

630
static PyMemberDef complex_members[] = {
631
	{"real", T_DOUBLE, offsetof(PyComplexObject, cval.real), READONLY,
632
	 "the real part of a complex number"},
633
	{"imag", T_DOUBLE, offsetof(PyComplexObject, cval.imag), READONLY,
634
	 "the imaginary part of a complex number"},
635 636
	{0},
};
637

638
static PyObject *
639 640 641 642 643
complex_subtype_from_string(PyTypeObject *type, PyObject *v)
{
	const char *s, *start;
	char *end;
	double x=0.0, y=0.0, z;
644
	int got_re=0, got_im=0, got_bracket=0, done=0;
645 646 647 648
	int digit_or_dot;
	int sw_error=0;
	int sign;
	char buffer[256]; /* For errors */
649
	char s_buffer[256];
Martin v. Löwis's avatar
Martin v. Löwis committed
650
	Py_ssize_t len;
651

652
	if (PyUnicode_Check(v)) {
653
		if (PyUnicode_GET_SIZE(v) >= (Py_ssize_t)sizeof(s_buffer)) {
654 655 656 657 658 659 660 661 662 663
			PyErr_SetString(PyExc_ValueError,
				 "complex() literal too large to convert");
			return NULL;
		}
		if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
					    PyUnicode_GET_SIZE(v),
					    s_buffer,
					    NULL))
			return NULL;
		s = s_buffer;
Martin v. Löwis's avatar
Martin v. Löwis committed
664
		len = strlen(s);
665 666 667 668 669 670 671 672 673 674 675
	}
	else if (PyObject_AsCharBuffer(v, &s, &len)) {
		PyErr_SetString(PyExc_TypeError,
				"complex() arg is not a string");
		return NULL;
	}

	/* position on first nonblank */
	start = s;
	while (*s && isspace(Py_CHARMASK(*s)))
		s++;
676
    if (s[0] == '\0') {
677 678 679
		PyErr_SetString(PyExc_ValueError,
				"complex() arg is an empty string");
		return NULL;
680 681 682 683 684 685 686
    }
	if (s[0] == '(') {
		/* Skip over possible bracket from repr(). */
		got_bracket = 1;
		s++;
		while (*s && isspace(Py_CHARMASK(*s)))
			s++;
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
	}

	z = -1.0;
	sign = 1;
	do {

		switch (*s) {

		case '\0':
			if (s-start != len) {
				PyErr_SetString(
					PyExc_ValueError,
					"complex() arg contains a null byte");
				return NULL;
			}
			if(!done) sw_error=1;
			break;

705 706 707 708 709 710 711 712 713 714 715 716 717
		case ')':
			if (!got_bracket || !(got_re || got_im)) {
				sw_error=1;
				break;
			}
			got_bracket=0;
			done=1;
			s++;
			while (*s && isspace(Py_CHARMASK(*s)))
				s++;
			if (*s) sw_error=1;
			break;

718 719 720 721 722 723
		case '-':
			sign = -1;
				/* Fallthrough */
		case '+':
			if (done)  sw_error=1;
			s++;
724
			if  (  *s=='\0'||*s=='+'||*s=='-'||*s==')'||
725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749
			       isspace(Py_CHARMASK(*s))  )  sw_error=1;
			break;

		case 'J':
		case 'j':
			if (got_im || done) {
				sw_error = 1;
				break;
			}
			if  (z<0.0) {
				y=sign;
			}
			else{
				y=sign*z;
			}
			got_im=1;
			s++;
			if  (*s!='+' && *s!='-' )
				done=1;
			break;

		default:
			if (isspace(Py_CHARMASK(*s))) {
				while (*s && isspace(Py_CHARMASK(*s)))
					s++;
750
				if (*s && *s != ')')
751 752 753 754 755 756 757 758 759 760 761 762 763
					sw_error=1;
				else
					done = 1;
				break;
			}
			digit_or_dot =
				(*s=='.' || isdigit(Py_CHARMASK(*s)));
			if  (done||!digit_or_dot) {
				sw_error=1;
				break;
			}
			errno = 0;
			PyFPE_START_PROTECT("strtod", return 0)
764
				z = PyOS_ascii_strtod(s, &end) ;
765 766
			PyFPE_END_PROTECT(z)
				if (errno != 0) {
767
					PyOS_snprintf(buffer, sizeof(buffer),
768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
					  "float() out of range: %.150s", s);
					PyErr_SetString(
						PyExc_ValueError,
						buffer);
					return NULL;
				}
			s=end;
			if  (*s=='J' || *s=='j') {

				break;
			}
			if  (got_re) {
				sw_error=1;
				break;
			}

				/* accept a real part */
			x=sign*z;
			got_re=1;
			if  (got_im)  done=1;
			z = -1.0;
			sign = 1;
			break;

		}  /* end of switch  */

794
	} while (s - start < len && !sw_error);
795

796
	if (sw_error || got_bracket) {
797 798 799 800 801 802 803 804 805 806 807
		PyErr_SetString(PyExc_ValueError,
				"complex() arg is a malformed string");
		return NULL;
	}

	return complex_subtype_from_doubles(type, x, y);
}

static PyObject *
complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
808
	PyObject *r, *i, *tmp, *f;
809 810 811
	PyNumberMethods *nbr, *nbi = NULL;
	Py_complex cr, ci;
	int own_r = 0;
812
	static PyObject *complexstr;
813
	static char *kwlist[] = {"real", "imag", 0};
814 815 816 817 818 819

	r = Py_False;
	i = NULL;
	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:complex", kwlist,
					 &r, &i))
		return NULL;
820

821
	/* Special-case for a single argument when type(arg) is complex. */
822 823
	if (PyComplex_CheckExact(r) && i == NULL &&
	    type == &PyComplex_Type) {
824 825
		/* Note that we can't know whether it's safe to return
		   a complex *subclass* instance as-is, hence the restriction
826 827 828
		   to exact complexes here.  If either the input or the
		   output is a complex subclass, it will be handled below 
		   as a non-orthogonal vector.  */
829 830 831
		Py_INCREF(r);
		return r;
	}
832
	if (PyUnicode_Check(r)) {
833 834 835 836 837 838
		if (i != NULL) {
			PyErr_SetString(PyExc_TypeError,
					"complex() can't take second arg"
					" if first is a string");
			return NULL;
                }
839
		return complex_subtype_from_string(type, r);
840
	}
841
	if (i != NULL && PyUnicode_Check(i)) {
842 843 844 845
		PyErr_SetString(PyExc_TypeError,
				"complex() second arg can't be a string");
		return NULL;
	}
846

847 848
	/* XXX Hack to support classes with __complex__ method */
	if (complexstr == NULL) {
849
		complexstr = PyUnicode_InternFromString("__complex__");
850 851 852 853 854 855 856
		if (complexstr == NULL)
			return NULL;
	}
	f = PyObject_GetAttr(r, complexstr);
	if (f == NULL)
		PyErr_Clear();
	else {
857
		PyObject *args = PyTuple_New(0);
858 859 860 861 862 863 864 865 866
		if (args == NULL)
			return NULL;
		r = PyEval_CallObject(f, args);
		Py_DECREF(args);
		Py_DECREF(f);
		if (r == NULL)
			return NULL;
		own_r = 1;
	}
867 868 869 870 871
	nbr = r->ob_type->tp_as_number;
	if (i != NULL)
		nbi = i->ob_type->tp_as_number;
	if (nbr == NULL || nbr->nb_float == NULL ||
	    ((i != NULL) && (nbi == NULL || nbi->nb_float == NULL))) {
872
		PyErr_SetString(PyExc_TypeError,
873
			   "complex() argument must be a string or a number");
874 875 876
		if (own_r) {
			Py_DECREF(r);
		}
877 878
		return NULL;
	}
879 880 881 882 883 884 885 886

	/* If we get this far, then the "real" and "imag" parts should
	   both be treated as numbers, and the constructor should return a
	   complex number equal to (real + imag*1j).

 	   Note that we do NOT assume the input to already be in canonical
	   form; the "real" and "imag" parts might themselves be complex
	   numbers, which slightly complicates the code below. */
887
	if (PyComplex_Check(r)) {
888 889 890
		/* Note that if r is of a complex subtype, we're only
		   retaining its real & imag parts here, and the return
		   value is (properly) of the builtin complex type. */
891 892 893 894 895 896
		cr = ((PyComplexObject*)r)->cval;
		if (own_r) {
			Py_DECREF(r);
		}
	}
	else {
897 898 899 900
		/* The "real" part really is entirely real, and contributes
		   nothing in the imaginary direction.  
		   Just treat it as a double. */
		cr.imag = 0.0;  
901 902
		tmp = PyNumber_Float(r);
		if (own_r) {
903 904
			/* r was a newly created complex number, rather
			   than the original "real" argument. */
905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
			Py_DECREF(r);
		}
		if (tmp == NULL)
			return NULL;
		if (!PyFloat_Check(tmp)) {
			PyErr_SetString(PyExc_TypeError,
					"float(r) didn't return a float");
			Py_DECREF(tmp);
			return NULL;
		}
		cr.real = PyFloat_AsDouble(tmp);
		Py_DECREF(tmp);
	}
	if (i == NULL) {
		ci.real = 0.0;
		ci.imag = 0.0;
	}
	else if (PyComplex_Check(i))
		ci = ((PyComplexObject*)i)->cval;
	else {
925 926 927 928
		/* The "imag" part really is entirely imaginary, and
		   contributes nothing in the real direction.
		   Just treat it as a double. */
		ci.imag = 0.0;
929 930 931 932 933 934
		tmp = (*nbi->nb_float)(i);
		if (tmp == NULL)
			return NULL;
		ci.real = PyFloat_AsDouble(tmp);
		Py_DECREF(tmp);
	}
935 936 937
	/*  If the input was in canonical form, then the "real" and "imag"
	    parts are real numbers, so that ci.real and cr.imag are zero.
	    We need this correction in case they were not real numbers. */
938 939 940
	cr.real -= ci.imag;
	cr.imag += ci.real;
	return complex_subtype_from_c_complex(type, cr);
941 942
}

943
PyDoc_STRVAR(complex_doc,
944 945 946
"complex(real[, imag]) -> complex number\n"
"\n"
"Create a complex number from a real part and an optional imaginary part.\n"
947
"This is equivalent to (real + imag*1j) where imag defaults to 0.");
948

949
static PyNumberMethods complex_as_number = {
950 951 952 953 954 955 956 957 958
	(binaryfunc)complex_add, 		/* nb_add */
	(binaryfunc)complex_sub, 		/* nb_subtract */
	(binaryfunc)complex_mul, 		/* nb_multiply */
	(binaryfunc)complex_remainder,		/* nb_remainder */
	(binaryfunc)complex_divmod,		/* nb_divmod */
	(ternaryfunc)complex_pow,		/* nb_power */
	(unaryfunc)complex_neg,			/* nb_negative */
	(unaryfunc)complex_pos,			/* nb_positive */
	(unaryfunc)complex_abs,			/* nb_absolute */
959
	(inquiry)complex_bool,			/* nb_bool */
960 961 962 963 964 965
	0,					/* nb_invert */
	0,					/* nb_lshift */
	0,					/* nb_rshift */
	0,					/* nb_and */
	0,					/* nb_xor */
	0,					/* nb_or */
966
	(coercion)0,				/* nb_coerce */
967 968 969
	complex_int,				/* nb_int */
	complex_long,				/* nb_long */
	complex_float,				/* nb_float */
970 971
	0,					/* nb_oct */
	0,					/* nb_hex */
972 973 974 975 976 977 978 979 980 981 982 983 984 985
	0,					/* nb_inplace_add */
	0,					/* nb_inplace_subtract */
	0,					/* nb_inplace_multiply*/
	0,					/* nb_inplace_remainder */
	0, 					/* nb_inplace_power */
	0,					/* nb_inplace_lshift */
	0,					/* nb_inplace_rshift */
	0,					/* nb_inplace_and */
	0,					/* nb_inplace_xor */
	0,					/* nb_inplace_or */
	(binaryfunc)complex_int_div,		/* nb_floor_divide */
	(binaryfunc)complex_div,		/* nb_true_divide */
	0,					/* nb_inplace_floor_divide */
	0,					/* nb_inplace_true_divide */
986 987
};

988
PyTypeObject PyComplex_Type = {
989
	PyVarObject_HEAD_INIT(&PyType_Type, 0)
990
	"complex",
991
	sizeof(PyComplexObject),
992
	0,
993
	complex_dealloc,			/* tp_dealloc */
994
	0,					/* tp_print */
995
	0,					/* tp_getattr */
996 997 998 999 1000 1001 1002 1003
	0,					/* tp_setattr */
	0,					/* tp_compare */
	(reprfunc)complex_repr,			/* tp_repr */
	&complex_as_number,    			/* tp_as_number */
	0,					/* tp_as_sequence */
	0,					/* tp_as_mapping */
	(hashfunc)complex_hash, 		/* tp_hash */
	0,					/* tp_call */
1004
	(reprfunc)complex_str,			/* tp_str */
1005
	PyObject_GenericGetAttr,		/* tp_getattro */
1006 1007
	0,					/* tp_setattro */
	0,					/* tp_as_buffer */
1008 1009
	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
	complex_doc,				/* tp_doc */
1010 1011 1012
	0,					/* tp_traverse */
	0,					/* tp_clear */
	complex_richcompare,			/* tp_richcompare */
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
	0,					/* tp_weaklistoffset */
	0,					/* tp_iter */
	0,					/* tp_iternext */
	complex_methods,			/* tp_methods */
	complex_members,			/* tp_members */
	0,					/* tp_getset */
	0,					/* tp_base */
	0,					/* tp_dict */
	0,					/* tp_descr_get */
	0,					/* tp_descr_set */
	0,					/* tp_dictoffset */
	0,					/* tp_init */
1025
	PyType_GenericAlloc,			/* tp_alloc */
1026
	complex_new,				/* tp_new */
1027
	PyObject_Del,           		/* tp_free */
1028 1029 1030
};

#endif