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:
parent
47dc7d0130
commit
ed962f1f23
|
@ -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))
|
||||||
|
|
|
@ -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))
|
|
@ -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
|
Loading…
Reference in New Issue