Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2e4dda3

Browse files
committed
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 <[email protected]>
1 parent 5327cd1 commit 2e4dda3

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

py/modmath.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
5454
mp_float_t x = mp_obj_get_float(x_obj);
5555
mp_float_t y = mp_obj_get_float(y_obj);
5656
mp_float_t ans = f(x, y);
57-
if ((isnan(ans) && !isnan(x) && !isnan(y)) || (isinf(ans) && !isinf(x))) {
57+
if ((isnan(ans) && !isnan(x) && !isnan(y)) || (isinf(ans) && !isinf(x) && !isinf(y))) {
5858
math_error();
5959
}
6060
return mp_obj_new_float(ans);

tests/float/math_domain.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,26 @@
3939

4040
# double argument functions
4141
for name, f, args in (
42-
("pow", math.pow, ((0, 2), (-1, 2), (0, -1), (-1, 2.3), (nan, 0), (1, nan))),
42+
(
43+
"pow",
44+
math.pow,
45+
(
46+
(0, 2),
47+
(-1, 2),
48+
(0, -1),
49+
(-1, 2.3),
50+
(0.5, inf),
51+
(-0.5, inf),
52+
(0.5, -inf),
53+
(-0.5, -inf),
54+
(1.5, inf),
55+
(-1.5, inf),
56+
(1.5, -inf),
57+
(-1.5, -inf),
58+
(nan, 0),
59+
(1, nan),
60+
),
61+
),
4362
("log", math.log, ()),
4463
("fmod", math.fmod, ((1.2, inf), (1.2, -inf), (1.2, 0), (inf, 1.2))),
4564
("atan2", math.atan2, ((0, 0), (-inf, inf), (-inf, -inf), (inf, -inf))),

0 commit comments

Comments
 (0)