diff options
| author | Sebastian Berg <sebastianb@nvidia.com> | 2022-12-21 12:20:22 +0100 |
|---|---|---|
| committer | Sebastian Berg <sebastianb@nvidia.com> | 2022-12-21 17:13:46 +0100 |
| commit | d398317bc5eda33a49c699bed0f169dfea09e901 (patch) | |
| tree | aaf4e52104db5f894a0d1ea4f494f338bdb75e65 /numpy/core/src/multiarray | |
| parent | 0d1bb8e42228776dc8d35bdcfacf2ff3af366ade (diff) | |
| download | numpy-d398317bc5eda33a49c699bed0f169dfea09e901.tar.gz | |
BUG: Fortify string casts against floating point warnings
This removes the check for floating point warnings, which is enough
in practice. (In principle ufuncs or structured dtypes can chain
casts in a way that causes us to check anyway.)
It also checks for isfinite in the scalar repr code so the warnings
shouldn't be set to begin with.
Closes gh-22843
Diffstat (limited to 'numpy/core/src/multiarray')
| -rw-r--r-- | numpy/core/src/multiarray/convert_datatype.c | 2 | ||||
| -rw-r--r-- | numpy/core/src/multiarray/scalartypes.c.src | 12 |
2 files changed, 10 insertions, 4 deletions
diff --git a/numpy/core/src/multiarray/convert_datatype.c b/numpy/core/src/multiarray/convert_datatype.c index 3973fc795..14341c103 100644 --- a/numpy/core/src/multiarray/convert_datatype.c +++ b/numpy/core/src/multiarray/convert_datatype.c @@ -2880,7 +2880,7 @@ add_other_to_and_from_string_cast( .name = "legacy_cast_to_string", .nin = 1, .nout = 1, - .flags = NPY_METH_REQUIRES_PYAPI, + .flags = NPY_METH_REQUIRES_PYAPI | NPY_METH_NO_FLOATINGPOINT_ERRORS, .dtypes = dtypes, .slots = slots, }; diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src index bb5d36ba1..57336589e 100644 --- a/numpy/core/src/multiarray/scalartypes.c.src +++ b/numpy/core/src/multiarray/scalartypes.c.src @@ -896,15 +896,21 @@ static PyObject * @name@type_@kind@_either(npy_@name@ val, TrimMode trim_pos, TrimMode trim_sci, npy_bool sign) { - npy_@name@ absval; if (npy_legacy_print_mode <= 113) { return legacy_@name@_format@kind@(val); } - absval = val < 0 ? -val : val; + int use_positional; + if (npy_isnan(val) || val == 0) { + use_positional = 1; + } + else { + npy_@name@ absval = val < 0 ? -val : val; + use_positional = absval < 1.e16L && absval >= 1.e-4L; + } - if (absval == 0 || (absval < 1.e16L && absval >= 1.e-4L) ) { + if (use_positional) { return format_@name@(val, 0, -1, sign, trim_pos, -1, -1, -1); } return format_@name@(val, 1, -1, sign, trim_sci, -1, -1, -1); |
