]> granicus.if.org Git - python/commitdiff
Make floating-point exception error messages slightly more verbose: in
authorMark Dickinson <dickinsm@gmail.com>
Wed, 30 Apr 2008 23:30:57 +0000 (23:30 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Wed, 30 Apr 2008 23:30:57 +0000 (23:30 +0000)
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.

Lib/test/ieee754.txt
Lib/test/test_math.py
Modules/mathmodule.c

index 5a41c8fe5077a7460752c809662e098dfeada50b..a07906cf4b7322094a0477478018d570b18d7de0 100644 (file)
@@ -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)
 
index da8a0e9b9dd2fee1471e3adaf20e6781d6c2a092..379ff89bdbc9d7e6a051c60f07e44bfa3444e851 100644 (file)
@@ -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)
 
index 3cf113383116397f84d015d24b76ca9dd7dfff33..aa3869141def86f06702b1f75c78b7b041b5b01e 100644 (file)
@@ -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