]> granicus.if.org Git - python/commitdiff
SF bug 533198: Complex power underflow raises exception.
authorTim Peters <tim.peters@gmail.com>
Fri, 22 Mar 2002 02:48:46 +0000 (02:48 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 22 Mar 2002 02:48:46 +0000 (02:48 +0000)
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.

Objects/complexobject.c

index 0bc388b896b5267d532e1641ec218b25c769db5d..48a9afa2e7fafcc591ff4b199d604c8a504fc3fa 100644 (file)
@@ -131,7 +131,7 @@ c_pow(Py_complex a, Py_complex b)
        }
        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 @@ complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z)
                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);
 }