Kaydet (Commit) a1293eb6 authored tarafından Mark Dickinson's avatar Mark Dickinson

Additional special-case handling for math.pow.

Windows/VS2008 doesn't like (-1)**(+-inf).
üst 53be57e8
...@@ -521,9 +521,19 @@ math_pow(PyObject *self, PyObject *args) ...@@ -521,9 +521,19 @@ math_pow(PyObject *self, PyObject *args)
y = PyFloat_AsDouble(oy); y = PyFloat_AsDouble(oy);
if ((x == -1.0 || y == -1.0) && PyErr_Occurred()) if ((x == -1.0 || y == -1.0) && PyErr_Occurred())
return NULL; return NULL;
/* 1**x and x**0 return 1., even if x is a NaN or infinity. */
if (x == 1.0 || y == 0.0) /* deal directly with various special cases, to cope with problems on
various platforms whose semantics don't exactly match C99 */
/* 1**x, x**0, and (-1)**(+-infinity) return 1., even if x is NaN or
an infinity. */
if (x == 1. || y == 0. || (x == -1. && Py_IS_INFINITY(y)))
return PyFloat_FromDouble(1.); return PyFloat_FromDouble(1.);
/* otherwise, return a NaN if either input was a NaN */
if (Py_IS_NAN(x))
return PyFloat_FromDouble(x);
if (Py_IS_NAN(y))
return PyFloat_FromDouble(y);
/* inf ** (nonzero, non-NaN) is one of +-0, +-infinity */ /* inf ** (nonzero, non-NaN) is one of +-0, +-infinity */
if (Py_IS_INFINITY(x) && !Py_IS_NAN(y)) { if (Py_IS_INFINITY(x) && !Py_IS_NAN(y)) {
y_is_odd = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0; y_is_odd = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;
...@@ -539,10 +549,7 @@ math_pow(PyObject *self, PyObject *args) ...@@ -539,10 +549,7 @@ math_pow(PyObject *self, PyObject *args)
r = pow(x, y); r = pow(x, y);
PyFPE_END_PROTECT(r); PyFPE_END_PROTECT(r);
if (Py_IS_NAN(r)) { if (Py_IS_NAN(r)) {
if (!Py_IS_NAN(x) && !Py_IS_NAN(y)) errno = EDOM;
errno = EDOM;
else
errno = 0;
} }
/* an infinite result arises either from: /* an infinite result arises either from:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment