summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-02-23 10:53:39 +1100
committerDamien George <damien@micropython.org>2023-02-24 15:55:12 +1100
commit2e4dda3c2072c4de15ac8d51ddb471b9c3833db7 (patch)
tree67dfb031c40e96f41b37d4a3736ce8caa9ae79bb
parent5327cd1021dc92cad428ff44cb114c4a94c0bc45 (diff)
py/modmath: Fix two-argument math function domain check.
Prior to this fix, pow(1.5, inf) and pow(0.5, -inf) (among other things) would incorrectly raise a ValueError, because the result is inf with the first argument being finite. This commit fixes this by allowing the result to be infinite if the first or second (or both) argument is infinite. This fix doesn't affect the other three math functions that have two arguments: - atan2 never returns inf, so always fails isinf(ans) - copysign returns inf only if the first argument x is inf, so will never reach the isinf(y) check - fmod never returns inf, so always fails isinf(ans) Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--py/modmath.c2
-rw-r--r--tests/float/math_domain.py21
2 files changed, 21 insertions, 2 deletions
diff --git a/py/modmath.c b/py/modmath.c
index 72b5dde51..861a23b48 100644
--- a/py/modmath.c
+++ b/py/modmath.c
@@ -54,7 +54,7 @@ STATIC mp_obj_t math_generic_2(mp_obj_t x_obj, mp_obj_t y_obj, mp_float_t (*f)(m
mp_float_t x = mp_obj_get_float(x_obj);
mp_float_t y = mp_obj_get_float(y_obj);
mp_float_t ans = f(x, y);
- if ((isnan(ans) && !isnan(x) && !isnan(y)) || (isinf(ans) && !isinf(x))) {
+ if ((isnan(ans) && !isnan(x) && !isnan(y)) || (isinf(ans) && !isinf(x) && !isinf(y))) {
math_error();
}
return mp_obj_new_float(ans);
diff --git a/tests/float/math_domain.py b/tests/float/math_domain.py
index 063d509b5..606a65528 100644
--- a/tests/float/math_domain.py
+++ b/tests/float/math_domain.py
@@ -39,7 +39,26 @@ for name, f, args in (
# double argument functions
for name, f, args in (
- ("pow", math.pow, ((0, 2), (-1, 2), (0, -1), (-1, 2.3), (nan, 0), (1, nan))),
+ (
+ "pow",
+ math.pow,
+ (
+ (0, 2),
+ (-1, 2),
+ (0, -1),
+ (-1, 2.3),
+ (0.5, inf),
+ (-0.5, inf),
+ (0.5, -inf),
+ (-0.5, -inf),
+ (1.5, inf),
+ (-1.5, inf),
+ (1.5, -inf),
+ (-1.5, -inf),
+ (nan, 0),
+ (1, nan),
+ ),
+ ),
("log", math.log, ()),
("fmod", math.fmod, ((1.2, inf), (1.2, -inf), (1.2, 0), (inf, 1.2))),
("atan2", math.atan2, ((0, 0), (-inf, inf), (-inf, -inf), (inf, -inf))),