diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2008-04-30 23:30:57 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2008-04-30 23:30:57 (GMT) |
commit | a0de26c3427b63efcd0a678c5d686b4df9f105e4 (patch) | |
tree | 359d9467600c47eb14c3a1926e6a9ebda7720bb3 | |
parent | 3cbf15f07a72c1dad2196975448ce18725f18c08 (diff) | |
download | cpython-a0de26c3427b63efcd0a678c5d686b4df9f105e4.zip cpython-a0de26c3427b63efcd0a678c5d686b4df9f105e4.tar.gz cpython-a0de26c3427b63efcd0a678c5d686b4df9f105e4.tar.bz2 |
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.
-rw-r--r-- | Lib/test/ieee754.txt | 16 | ||||
-rw-r--r-- | Lib/test/test_math.py | 6 | ||||
-rw-r--r-- | Modules/mathmodule.c | 23 |
3 files changed, 24 insertions, 21 deletions
diff --git a/Lib/test/ieee754.txt b/Lib/test/ieee754.txt index 5a41c8f..a07906c 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 da8a0e9..379ff89 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 3cf1133..aa38691 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 |