diff Objects/complexobject.c @ 22540:75ef1f16725e 2.2

backport tim_one's checkin of revision 2.55 of complexobject.c SF bug 533198: Complex power underflow raises exception. Konrad was too kind. Not only did it raise an exception, the specific exception it raised made no sense. These are old bugs in complex_pow() and friends: 1. Raising 0 to a negative power isn't a range error, it's a domain error, so changed c_pow() to set errno to EDOM in that case instead of ERANGE. 2. Changed complex_pow() to: A. Used the Py_ADJUST_ERANGE2 macro to try to clear errno of a spurious ERANGE error due to underflow in the libm pow() called by c_pow(). B. Produced different exceptions depending on the errno value: i) For errno==EDOM, raise ZeroDivisionError instead of ValueError. This is for consistency with the non-complex cases 0.0**-2 and 0**-2 and 0L**-2. ii) For errno==ERANGE, raise OverflowError. Bugfix candidate.
author Michael W. Hudson <mwh@python.net>
date Mon, 25 Mar 2002 13:21:41 +0000
parents 4e996314f8fb
children 0ba23341e5cf 72778ec94dec
line wrap: on
line diff
--- a/Objects/complexobject.c	Mon Mar 25 13:15:52 2002 +0000
+++ b/Objects/complexobject.c	Mon Mar 25 13:21:41 2002 +0000
@@ -131,7 +131,7 @@
 	}
 	else if (a.real == 0. && a.imag == 0.) {
 		if (b.imag != 0. || b.real < 0.)
-			errno = ERANGE;
+			errno = EDOM;
 		r.real = 0.;
 		r.imag = 0.;
 	}
@@ -456,11 +456,17 @@
 		p = c_pow(v->cval,exponent);
 
 	PyFPE_END_PROTECT(p)
-	if (errno == ERANGE) {
-		PyErr_SetString(PyExc_ValueError,
+	Py_ADJUST_ERANGE2(p.real, p.imag);
+	if (errno == EDOM) {
+		PyErr_SetString(PyExc_ZeroDivisionError,
 				"0.0 to a negative or complex power");
 		return NULL;
 	}
+	else if (errno == ERANGE) {
+		PyErr_SetString(PyExc_OverflowError,
+				"complex exponentiaion");
+		return NULL;
+	}
 	return PyComplex_FromCComplex(p);
 }