tests/float: Test domain errors for more combos of args to math funcs.

Instead of having a special set of arguments to test for each math-module
function, just test all functions with all sets of arguments.  This gives
improved test cases to prevent regressions.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George 2023-06-16 12:08:34 +10:00
parent 47dc7d0130
commit ed962f1f23
3 changed files with 94 additions and 44 deletions

View File

@ -10,25 +10,25 @@ inf = float("inf")
nan = float("nan") nan = float("nan")
# single argument functions # single argument functions
for name, f, args in ( for name, f in (
("fabs", math.fabs, ()), ("fabs", math.fabs),
("ceil", math.ceil, ()), ("ceil", math.ceil),
("floor", math.floor, ()), ("floor", math.floor),
("trunc", math.trunc, ()), ("trunc", math.trunc),
("sqrt", math.sqrt, (-1, 0)), ("sqrt", math.sqrt),
("exp", math.exp, ()), ("exp", math.exp),
("log", math.log, ()), ("log", math.log),
("sin", math.sin, ()), ("sin", math.sin),
("cos", math.cos, ()), ("cos", math.cos),
("tan", math.tan, ()), ("tan", math.tan),
("asin", math.asin, (-1.1, 1, 1.1)), ("asin", math.asin),
("acos", math.acos, (-1.1, 1, 1.1)), ("acos", math.acos),
("atan", math.atan, ()), ("atan", math.atan),
("ldexp", lambda x: math.ldexp(x, 0), ()), ("ldexp", lambda x: math.ldexp(x, 0)),
("radians", math.radians, ()), ("radians", math.radians),
("degrees", math.degrees, ()), ("degrees", math.degrees),
): ):
for x in args + (inf, -inf, nan): for x in (0, 1, 1.1, -1, -1.1, inf, -inf, nan):
try: try:
ans = "%.4f" % f(x) ans = "%.4f" % f(x)
except ValueError: except ValueError:
@ -38,35 +38,54 @@ for name, f, args in (
print("%s(%.4f) = %s" % (name, x, ans)) print("%s(%.4f) = %s" % (name, x, ans))
# double argument functions # double argument functions
for name, f, args in ( for name, f in (
( ("pow", math.pow),
"pow", ("log", math.log),
math.pow, ("fmod", math.fmod),
( ("atan2", math.atan2),
(0, 2), ("copysign", math.copysign),
(-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))),
("copysign", math.copysign, ()),
): ):
for x in args + ((0, inf), (inf, 0), (inf, inf), (inf, nan), (nan, inf), (nan, nan)): for x in (
(0, 0),
(0, 2),
(0, -1),
(1, 0),
(1.2, 0),
(-1, 0),
(-1, 2),
(-1, 2.3),
(0, inf),
(0.5, inf),
(0.5, -inf),
(0.9, inf),
(0.9, -inf),
(1.2, inf),
(1.2, -inf),
(-0.5, inf),
(-0.5, -inf),
(-0.9, inf),
(-0.9, -inf),
(-1.2, inf),
(-1.2, -inf),
(inf, 0),
(inf, 1.2),
(inf, -1.2),
(inf, inf),
(inf, -inf),
(-inf, inf),
(-inf, -inf),
(0, nan),
(nan, 0),
(1, nan),
(nan, 1),
(inf, nan),
(nan, inf),
(nan, nan),
):
try: try:
ans = "%.4f" % f(*x) ans = "%.4f" % f(*x)
except ValueError: except ValueError:
ans = "ValueError" ans = "ValueError"
except ZeroDivisionError:
ans = "ZeroDivisionError"
print("%s(%.4f, %.4f) = %s" % (name, x[0], x[1], ans)) print("%s(%.4f, %.4f) = %s" % (name, x[0], x[1], ans))

View File

@ -0,0 +1,26 @@
# Tests domain errors in math functions.
# This is split out from math_domain.py because math.pow(0, -inf) was changed
# in Python 3.11, and so this test requires a .py.exp file.
# (See https://github.com/python/cpython/issues/88505)
try:
import math
except ImportError:
print("SKIP")
raise SystemExit
inf = float("inf")
for name, f in (
("pow", math.pow),
("log", math.log),
("fmod", math.fmod),
("atan2", math.atan2),
("copysign", math.copysign),
):
for x in ((0, -inf),):
try:
ans = "%.4f" % f(*x)
except ValueError:
ans = "ValueError"
print("%s(%.4f, %.4f) = %s" % (name, x[0], x[1], ans))

View File

@ -0,0 +1,5 @@
pow(0.0000, -inf) = inf
log(0.0000, -inf) = ValueError
fmod(0.0000, -inf) = 0.0000
atan2(0.0000, -inf) = 3.1416
copysign(0.0000, -inf) = -0.0000