mirror of
https://github.com/python/cpython.git
synced 2025-01-27 11:33:55 +08:00
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.
This commit is contained in:
parent
3cbf15f07a
commit
a0de26c342
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user