diff options
-rw-r--r-- | Lib/test/test_float.py | 15 | ||||
-rw-r--r-- | Objects/floatobject.c | 6 |
2 files changed, 17 insertions, 4 deletions
diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index fb47db8eb0..d616ad9543 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -99,12 +99,25 @@ class IEEEFormatTestCase(unittest.TestCase): ('<f', LE_FLOAT_NAN)]: struct.unpack(fmt, data) +# on an IEEE platform, "overflowing" operations produce infinity + +class IEEEOperationsTestCase(unittest.TestCase): + if float.__getformat__("double").startswith("IEEE"): + def test_double_infinity(self): + big = 4.8e159 + pro = big*big + self.assertEquals(repr(pro), 'inf') + sqr = big**2 + self.assertEquals(repr(sqr), 'inf') + def test_main(): test_support.run_unittest( FormatFunctionsTestCase, UnknownFormatTestCase, - IEEEFormatTestCase) + IEEEFormatTestCase, + IEEEOperationsTestCase, + ) if __name__ == '__main__': test_main() diff --git a/Objects/floatobject.c b/Objects/floatobject.c index fa09084669..5aeabd9d93 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -821,12 +821,12 @@ float_pow(PyObject *v, PyObject *w, PyObject *z) ix = pow(iv, iw); PyFPE_END_PROTECT(ix) Py_ADJUST_ERANGE1(ix); - if (errno != 0) { + /* we need to ignore ERANGE here and just return inf */ + if (errno != 0 && errno != ERANGE) { /* We don't expect any errno value other than ERANGE, but * the range of libm bugs appears unbounded. */ - PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : - PyExc_ValueError); + PyErr_SetFromErrno(PyExc_ValueError); return NULL; } return PyFloat_FromDouble(ix); |