diff options
author | Sebastian Berg <sebastian@sipsolutions.net> | 2022-06-28 09:58:12 -0700 |
---|---|---|
committer | Sebastian Berg <sebastian@sipsolutions.net> | 2022-06-28 10:10:20 -0700 |
commit | 86d2a87cf97b99bcff13bbbd5c4211fdfc5ff2af (patch) | |
tree | cb29599cdc2c0c0af9e4133d2e6c2cfcaa2f03c8 /numpy | |
parent | a2caa35dd9f2dae9f492a1af9faa1619e4fcce02 (diff) | |
download | numpy-86d2a87cf97b99bcff13bbbd5c4211fdfc5ff2af.tar.gz |
ENH,MAINT: Improve and simplify scalar floating point warnings
This makes the scalar operations warnings read e.g.:
overflow encountered in scalar multiply
rather than:
overflow encountered in float_scalars
It also fixes one case where "assignment" rather than "cast" was
used when I added the FPEs for casts.
Otherwise, uses the helper that I intrudced for for the floating
point casts in all places to simplify the code, the only
"complicated" thing is that I try to give "scalar divide" rather
than "scalar true_divide" as warnings, since "true_divide" should
not really be something that end-users need be aware of.
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/src/multiarray/arraytypes.c.src | 12 | ||||
-rw-r--r-- | numpy/core/src/umath/scalarmath.c.src | 47 | ||||
-rw-r--r-- | numpy/lib/tests/test_arraypad.py | 3 |
3 files changed, 16 insertions, 46 deletions
diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src index 2539fdb57..7cd80ba9a 100644 --- a/numpy/core/src/multiarray/arraytypes.c.src +++ b/numpy/core/src/multiarray/arraytypes.c.src @@ -394,19 +394,9 @@ static int /* Overflow could have occured converting double to float */ if (NPY_UNLIKELY((npy_isinf(temp.real) && !npy_isinf(oop.real)) || (npy_isinf(temp.imag) && !npy_isinf(oop.imag)))) { - int bufsize, errmask; - PyObject *errobj; - - if (PyUFunc_GetPyValues("assignment", &bufsize, &errmask, - &errobj) < 0) { - return -1; - } - int first = 1; - if (PyUFunc_handlefperr(errmask, errobj, NPY_FPE_OVERFLOW, &first)) { - Py_XDECREF(errobj); + if (PyUFunc_GiveFloatingpointErrors("cast", NPY_FPE_OVERFLOW) < 0) { return -1; } - Py_XDECREF(errobj); } #endif } diff --git a/numpy/core/src/umath/scalarmath.c.src b/numpy/core/src/umath/scalarmath.c.src index ef608378a..c322ca33d 100644 --- a/numpy/core/src/umath/scalarmath.c.src +++ b/numpy/core/src/umath/scalarmath.c.src @@ -29,6 +29,8 @@ #include "array_coercion.h" #include "common.h" #include "can_cast_table.h" +#include "umathmodule.h" + /* TODO: Used for some functions, should possibly move these to npy_math.h */ #include "loops.h" @@ -1162,6 +1164,14 @@ convert_to_@name@(PyObject *value, @type@ *result, npy_bool *may_need_deferring) * (Half, Float, Double, LongDouble)*3# */ #define IS_@name@ +/* drop the "true_" from "true_divide" for floating point warnings: */ +#define IS_@oper@ +#ifdef IS_true_divide + #define OP_NAME "divide" +#else + #define OP_NAME "@oper@" +#endif +#undef IS_@oper@ static PyObject * @name@_@oper@(PyObject *a, PyObject *b) @@ -1281,19 +1291,9 @@ static PyObject * retstatus |= npy_get_floatstatus_barrier((char*)&out); #endif if (retstatus) { - int bufsize, errmask; - PyObject *errobj; - - if (PyUFunc_GetPyValues("@name@_scalars", &bufsize, &errmask, - &errobj) < 0) { - return NULL; - } - int first = 1; - if (PyUFunc_handlefperr(errmask, errobj, retstatus, &first)) { - Py_XDECREF(errobj); + if (PyUFunc_GiveFloatingpointErrors("scalar " OP_NAME, retstatus) < 0) { return NULL; } - Py_XDECREF(errobj); } @@ -1327,6 +1327,7 @@ static PyObject * } +#undef OP_NAME #undef IS_@name@ /**end repeat**/ @@ -1449,19 +1450,9 @@ static PyObject * retstatus |= npy_get_floatstatus_barrier((char*)&out); #endif if (retstatus) { - int bufsize, errmask; - PyObject *errobj; - - if (PyUFunc_GetPyValues("@name@_scalars", &bufsize, &errmask, - &errobj) < 0) { - return NULL; - } - int first = 1; - if (PyUFunc_handlefperr(errmask, errobj, retstatus, &first)) { - Py_XDECREF(errobj); + if (PyUFunc_GiveFloatingpointErrors("scalar power", retstatus) < 0) { return NULL; } - Py_XDECREF(errobj); } ret = PyArrayScalar_New(@Name@); @@ -1581,19 +1572,9 @@ static PyObject * int retstatus = @name@_ctype_@oper@(val, &out); if (retstatus) { - int bufsize, errmask; - PyObject *errobj; - - if (PyUFunc_GetPyValues("@name@_scalars", &bufsize, &errmask, - &errobj) < 0) { - return NULL; - } - int first = 1; - if (PyUFunc_handlefperr(errmask, errobj, retstatus, &first)) { - Py_XDECREF(errobj); + if (PyUFunc_GiveFloatingpointErrors("scalar @oper@", retstatus) < 0) { return NULL; } - Py_XDECREF(errobj); } /* diff --git a/numpy/lib/tests/test_arraypad.py b/numpy/lib/tests/test_arraypad.py index ca3c35335..64b6a2e18 100644 --- a/numpy/lib/tests/test_arraypad.py +++ b/numpy/lib/tests/test_arraypad.py @@ -474,8 +474,7 @@ class TestStatistic: @pytest.mark.filterwarnings("ignore:Mean of empty slice:RuntimeWarning") @pytest.mark.filterwarnings( - "ignore:invalid value encountered in (divide|double_scalars):" - "RuntimeWarning" + "ignore:invalid value encountered in( scalar)? divide:RuntimeWarning" ) @pytest.mark.parametrize("mode", ["mean", "median"]) def test_zero_stat_length_valid(self, mode): |