diff --git a/tests/float/math_domain.py b/tests/float/math_domain.py index 606a655284c1..26e883ea6487 100644 --- a/tests/float/math_domain.py +++ b/tests/float/math_domain.py @@ -10,25 +10,25 @@ nan = float("nan") # single argument functions -for name, f, args in ( - ("fabs", math.fabs, ()), - ("ceil", math.ceil, ()), - ("floor", math.floor, ()), - ("trunc", math.trunc, ()), - ("sqrt", math.sqrt, (-1, 0)), - ("exp", math.exp, ()), - ("log", math.log, ()), - ("sin", math.sin, ()), - ("cos", math.cos, ()), - ("tan", math.tan, ()), - ("asin", math.asin, (-1.1, 1, 1.1)), - ("acos", math.acos, (-1.1, 1, 1.1)), - ("atan", math.atan, ()), - ("ldexp", lambda x: math.ldexp(x, 0), ()), - ("radians", math.radians, ()), - ("degrees", math.degrees, ()), +for name, f in ( + ("fabs", math.fabs), + ("ceil", math.ceil), + ("floor", math.floor), + ("trunc", math.trunc), + ("sqrt", math.sqrt), + ("exp", math.exp), + ("log", math.log), + ("sin", math.sin), + ("cos", math.cos), + ("tan", math.tan), + ("asin", math.asin), + ("acos", math.acos), + ("atan", math.atan), + ("ldexp", lambda x: math.ldexp(x, 0)), + ("radians", math.radians), + ("degrees", math.degrees), ): - for x in args + (inf, -inf, nan): + for x in (0, 1, 1.1, -1, -1.1, inf, -inf, nan): try: ans = "%.4f" % f(x) except ValueError: @@ -38,35 +38,54 @@ print("%s(%.4f) = %s" % (name, x, ans)) # double argument functions -for name, f, args in ( - ( - "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))), - ("copysign", math.copysign, ()), +for name, f in ( + ("pow", math.pow), + ("log", math.log), + ("fmod", math.fmod), + ("atan2", math.atan2), + ("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: ans = "%.4f" % f(*x) except ValueError: ans = "ValueError" + except ZeroDivisionError: + ans = "ZeroDivisionError" print("%s(%.4f, %.4f) = %s" % (name, x[0], x[1], ans)) diff --git a/tests/float/math_domain_python311.py b/tests/float/math_domain_python311.py new file mode 100644 index 000000000000..f56fd5585228 --- /dev/null +++ b/tests/float/math_domain_python311.py @@ -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)) diff --git a/tests/float/math_domain_python311.py.exp b/tests/float/math_domain_python311.py.exp new file mode 100644 index 000000000000..dfc93bb5104c --- /dev/null +++ b/tests/float/math_domain_python311.py.exp @@ -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