From: Mark Dickinson Date: Wed, 30 Apr 2008 23:30:57 +0000 (+0000) Subject: Make floating-point exception error messages slightly more verbose: in X-Git-Tag: v3.0a5~48 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a0de26c3427b63efcd0a678c5d686b4df9f105e4;p=thirdparty%2FPython%2Fcpython.git Make floating-point exception error messages slightly more verbose: in particular, the error message now allows one to distinguish between a ValueError arising from a singularity (e.g. log(0.)), which would usually produce +-infinity in non-stop mode, and a ValueError resulting from an invalid input (e.g. sqrt(-1.)), which would normally produce a NaN in non-stop mode. --- diff --git a/Lib/test/ieee754.txt b/Lib/test/ieee754.txt index 5a41c8fe5077..a07906cf4b73 100644 --- a/Lib/test/ieee754.txt +++ b/Lib/test/ieee754.txt @@ -127,31 +127,31 @@ Trigonometric Functions >>> sin(INF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> sin(NINF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> sin(NAN) nan >>> cos(INF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> cos(NINF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> cos(NAN) nan >>> tan(INF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> tan(NINF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> tan(NAN) nan @@ -169,11 +169,11 @@ True >>> asin(INF), asin(NINF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> acos(INF), acos(NINF) Traceback (most recent call last): ... -ValueError: math domain error +ValueError: math domain error (invalid argument) >>> equal(atan(INF), PI/2), equal(atan(NINF), -PI/2) (True, True) diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index da8a0e9b9dd2..379ff89bdbc9 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -741,9 +741,9 @@ class MathTests(unittest.TestCase): func = getattr(math, fn) try: result = func(ar) - except ValueError: - message = ("Unexpected ValueError in " + - "test %s:%s(%r)\n" % (id, fn, ar)) + except ValueError as exc: + message = (("Unexpected ValueError: %s\n " + + "in test %s:%s(%r)\n") % (exc.args[0], id, fn, ar)) self.fail(message) self.ftest("%s:%s(%r)" % (id, fn, ar), result, er) diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c index 3cf113383116..aa3869141def 100644 --- a/Modules/mathmodule.c +++ b/Modules/mathmodule.c @@ -174,18 +174,21 @@ math_1_to_whatever(PyObject *arg, double (*func) (double), PyFPE_START_PROTECT("in math_1", return 0); r = (*func)(x); PyFPE_END_PROTECT(r); - if (Py_IS_NAN(r)) { - if (!Py_IS_NAN(x)) - errno = EDOM; - else - errno = 0; + if (Py_IS_NAN(r) && !Py_IS_NAN(x)) { + PyErr_SetString(PyExc_ValueError, + "math domain error (invalid argument)"); + return NULL; } - else if (Py_IS_INFINITY(r)) { - if (Py_IS_FINITE(x)) - errno = can_overflow ? ERANGE : EDOM; - else - errno = 0; + if (Py_IS_INFINITY(r) && Py_IS_FINITE(x)) { + if (can_overflow) + PyErr_SetString(PyExc_OverflowError, + "math range error (overflow)"); + else + PyErr_SetString(PyExc_ValueError, + "math domain error (singularity)"); + return NULL; } + /* on most machines, errno should be 0 at this point */ if (errno && is_error(r)) return NULL; else