summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorSebastian Berg <sebastian@sipsolutions.net>2022-06-28 09:58:12 -0700
committerSebastian Berg <sebastian@sipsolutions.net>2022-06-28 10:10:20 -0700
commit86d2a87cf97b99bcff13bbbd5c4211fdfc5ff2af (patch)
treecb29599cdc2c0c0af9e4133d2e6c2cfcaa2f03c8 /numpy
parenta2caa35dd9f2dae9f492a1af9faa1619e4fcce02 (diff)
downloadnumpy-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.src12
-rw-r--r--numpy/core/src/umath/scalarmath.c.src47
-rw-r--r--numpy/lib/tests/test_arraypad.py3
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):