From a1293eb65f2237c3783a9bf9ba9ff5557cd384b0 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sat, 19 Apr 2008 19:41:52 +0000 Subject: [PATCH] Additional special-case handling for math.pow. Windows/VS2008 doesn't like (-1)**(+-inf). --- Modules/mathmodule.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index a78b6988dc..bb97a2c102 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -521,9 +521,19 @@ math_pow(PyObject *self, PyObject *args) y = PyFloat_AsDouble(oy); if ((x == -1.0 || y == -1.0) && PyErr_Occurred()) 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.); + /* 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 */ if (Py_IS_INFINITY(x) && !Py_IS_NAN(y)) { y_is_odd = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0; @@ -539,10 +549,7 @@ math_pow(PyObject *self, PyObject *args) r = pow(x, y); PyFPE_END_PROTECT(r); if (Py_IS_NAN(r)) { - if (!Py_IS_NAN(x) && !Py_IS_NAN(y)) - errno = EDOM; - else - errno = 0; + errno = EDOM; } /* an infinite result arises either from: -- 2.40.0