diff --git a/tests/93_deterministic_float.py b/tests/93_deterministic_float.py index 4b9a7bd4..dc024b0c 100644 --- a/tests/93_deterministic_float.py +++ b/tests/93_deterministic_float.py @@ -1,98 +1,162 @@ import math +import pkpy -assert math.pi == 3.14159265358979323846 -assert math.e == 2.7182818284590452354 -assert math.inf == math.inf +config = pkpy.configmacros +if config["PK_ENABLE_DETERMINISM"] == 0: + exit(0) + +def assertEqual(a, b): + if a == b: + return + print(f'{a} != {b}') + raise AssertionError + +# test constants +assertEqual(math.pi, 3.14159265358979323846) +assertEqual(math.e, 2.7182818284590452354) +assert math.inf, math.inf assert math.nan != math.nan -assert math.ceil(math.pi) == 4.0 -assert math.ceil(-math.e) == -2.0 -assert math.ceil(math.inf) == math.inf -assert math.fabs(math.pi) == 3.14159265358979323846 -assert math.fabs(-math.pi) == 3.14159265358979323846 -assert math.floor(math.pi) == 3.0 -assert math.floor(-math.e) == -3.0 -assert math.trunc(math.pi) == 3.0 +# test ceil +assertEqual(math.ceil(math.pi), 4.0) +assertEqual(math.ceil(-math.e), -2.0) +assertEqual(math.ceil(math.inf), math.inf) -assert math.gcd(10, 5) == 5 -assert math.gcd(10, 6) == 2 -assert math.gcd(10, 7) == 1 -assert math.gcd(10, 10) == 10 -assert math.gcd(-10, 10) == 10 +# test floor +assertEqual(math.floor(math.pi), 3.0) +assertEqual(math.floor(-math.e), -3.0) -assert math.isfinite(math.pi) == 1 -assert math.isfinite(math.inf) == 0 -assert math.isfinite(math.nan) == 0 -assert math.isinf(math.pi) == 0 -assert math.isinf(math.inf) == 1 -assert math.isinf(math.nan) == 0 -assert math.isnan(math.pi) == 0 -assert math.isnan(math.inf) == 0 -assert math.isnan(math.nan) == 1 +# test trunc +assertEqual(math.trunc(math.pi), 3.0) -assert math.isclose(math.pi, 3.14159265358979323846) -assert math.isclose(math.sqrt(3), 1.732050807568877) +# test fabs +assertEqual(math.fabs(math.pi), 3.14159265358979323846) +assertEqual(math.fabs(-math.pi), 3.14159265358979323846) -assert math.exp(0) == 1.0 -assert math.exp(1) == math.e -assert math.exp(1.5) == 4.481689070338065 - 8.881784197001252e-16 -assert math.exp(3) == 20.08553692318767 - 3.552713678800501e-15 -assert math.exp(-3) == 0.04978706836786394 + 6.938893903907228e-18 -assert math.log(0) == -math.inf -assert math.log(1) == 0.0 -assert math.log(2) == 0.69314718055994530942 -assert math.log(math.e) == 1.0 -assert math.log(10) == 2.30258509299404568402 -assert math.log2(math.e) == 1.4426950408889634074 -assert math.log10(math.e) == 0.43429448190325182765 +# test gcd +assertEqual(math.gcd(10, 5), 5) +assertEqual(math.gcd(10, 6), 2) +assertEqual(math.gcd(10, 7), 1) +assertEqual(math.gcd(10, 10), 10) +assertEqual(math.gcd(-10, 10), 10) -assert math.pow(2,2) == 4.0 -assert math.pow(1.41421356237309504880, 2) == 2.0 + 4.440892098500626e-16 -assert math.pow(0.70710678118654752440, 2) == 0.5000000000000001 -assert math.sqrt(2) == 1.41421356237309504880 -assert math.sqrt(math.pi) == 1.772453850905516 - 2.220446049250313e-16 +# test isfinite, isinf, isnan +assertEqual(math.isfinite(math.pi), 1) +assertEqual(math.isfinite(math.inf), 0) +assertEqual(math.isfinite(math.nan), 0) +assertEqual(math.isinf(math.pi), 0) +assertEqual(math.isinf(math.inf), 1) +assertEqual(math.isinf(math.nan), 0) +assertEqual(math.isnan(math.pi), 0) +assertEqual(math.isnan(math.inf), 0) +assertEqual(math.isnan(math.nan), 1) -assert math.cos(0) == 1.0 -assert math.cos(math.pi/2) == 6.123233995736766e-17 -assert math.cos(math.pi) == -1.0 -assert math.sin(0) == 0.0 -assert math.sin(math.pi/2) == 1.0 -assert math.sin(math.pi) == 1.224646799147353e-16 + 2.465190328815662e-32 -assert math.tan(0) == 0.0 -assert math.tan(math.pi/2) == 1.633123935319537e+16 -assert math.tan(math.pi) == -1.224646799147353e-16 - 2.465190328815662e-32 +# test exp +assertEqual(math.exp(0), 1.0) +assertEqual(math.exp(1), math.e) +assertEqual(math.exp(1.5), 4.481689070338065 - 8.881784197001252e-16) +assertEqual(math.exp(3), 20.08553692318767 - 3.552713678800501e-15) +assertEqual(math.exp(-3), 0.04978706836786394 + 6.938893903907228e-18) +assertEqual(math.exp(-2.253647), 0.1050155336754953 - 1.387778780781446e-17) +assertEqual(math.exp(4.729036), 113.1863980522005 - 4.263256414560601e-14) -assert math.acos(0) == 1.570796326794897 - 4.440892098500626e-16 -assert math.acos(1) == 0.0 -assert math.asin(0) == 0.0 -assert math.asin(1) == 1.570796326794897 - 4.440892098500626e-16 -assert math.atan(0) == 0.0 -assert math.atan(1) == 0.7853981633974483 +# test log series +assertEqual(math.log(0), -math.inf) +assertEqual(math.log(1), 0.0) +assertEqual(math.log(2), 0.69314718055994530942) +assertEqual(math.log(math.e), 1.0) +assertEqual(math.log(10), 2.30258509299404568402) +assertEqual(math.log(28.897124), 3.363742074595449) +assertEqual(math.log2(math.e), 1.4426950408889634074) +assertEqual(math.log2(78.781291), 6.299781153677818) +assertEqual(math.log10(math.e), 0.43429448190325182765) +assertEqual(math.log10(56.907822), 1.755171964426069 + 4.440892098500626e-16) -assert math.atan2(math.pi/4, math.pi/4) == 0.7853981633974483 -assert math.atan2(-math.pi/4, math.pi/4) == -0.7853981633974483 -assert math.atan2(-math.pi/4, -math.pi/4) == -2.356194490192345 -assert math.atan2(math.pi/4, -math.pi/4) == 2.356194490192345 +# test pow +assertEqual(math.pow(2,2), 4.0) +assertEqual(math.pow(1.41421356237309504880, 2), 2.0 + 4.440892098500626e-16) +assertEqual(math.pow(0.70710678118654752440, 2), 0.5000000000000001) +assertEqual(math.pow(-1.255782,-3), -0.5049603042167915) +assertEqual(math.pow(6.127042, 4.071529), 1604.407546456745 + 2.273736754432321e-13) -assert math.fsum([math.sin(i) for i in range(5000)] + [math.cos(i) for i in range(5000, 9999)]) == 3.217215564632461 - 4.440892098500626e-16 -assert sum([math.sin(i) for i in range(5000)] + [math.cos(i) for i in range(5000, 9999)]) == 3.21721556463248 +# test sqrt +assertEqual(math.sqrt(2), 1.41421356237309504880) +assertEqual(math.sqrt(math.pi), 1.772453850905516 - 2.220446049250313e-16) +assertEqual(math.sqrt(125.872509), 11.21929182257062) +assertEqual(math.sqrt(1225.296280), 35.00423231553579) -assert math.fmod(-2.0, 3.0) == -2.0 -assert math.fmod(2.0, 3.0) == 2.0 -assert math.fmod(4.0, 3.0) == 1.0 -assert math.fmod(-4.0, 3.0) == -1.0 +# test cos, sin, tan +assertEqual(math.cos(0), 1.0) +assertEqual(math.cos(math.pi/2), 6.123233995736766e-17) +assertEqual(math.cos(math.pi), -1.0) +assertEqual(math.cos(-11.352808), 0.3496839289707818 - 5.551115123125783e-17) +assertEqual(math.cos(7.294708), 0.530570640518482) +assertEqual(math.sin(0), 0.0) +assertEqual(math.sin(math.pi/2), 1.0) +assertEqual(math.sin(math.pi), 1.224646799147353e-16 + 2.465190328815662e-32) +assertEqual(math.sin(-2.837592), -0.2993398018896187) +assertEqual(math.sin(9.294782), 0.1296301374714747) +assertEqual(math.tan(0), 0.0) +assertEqual(math.tan(math.pi/2), 1.633123935319537e+16) +assertEqual(math.tan(math.pi), -1.224646799147353e-16 - 2.465190328815662e-32) +assertEqual(math.tan(-4.812975), 9.908188146466314) +assertEqual(math.tan(1.875814), -3.176189742032396 - 4.440892098500626e-16) +# test acos, asin, atan +assertEqual(math.acos(0), 1.570796326794897 - 4.440892098500626e-16) +assertEqual(math.acos(1), 0.0) +assertEqual(math.acos(-0.758293), 2.431486995121896 + 4.440892098500626e-16) +assertEqual(math.acos(0.024758), 1.546035796825635) +assertEqual(math.asin(0), 0.0) +assertEqual(math.asin(1), 1.570796326794897 - 4.440892098500626e-16) +assertEqual(math.asin(-0.225895), -0.2278616865773913 + 2.775557561562891e-17) +assertEqual(math.asin(0.955658), 1.271886195819423 + 4.440892098500626e-16) +assertEqual(math.atan(0), 0.0) +assertEqual(math.atan(1), 0.7853981633974483) +assertEqual(math.atan(-3.758927), -1.310785284610617 - 4.440892098500626e-16) +assertEqual(math.atan(35.789293), 1.542862277280122) + +# test atan2 +assertEqual(math.atan2(math.pi/4, math.pi/4), 0.7853981633974483) +assertEqual(math.atan2(-math.pi/4, math.pi/4), -0.7853981633974483) +assertEqual(math.atan2(-math.pi/4, -math.pi/4), -2.356194490192345) +assertEqual(math.atan2(math.pi/4, -math.pi/4), 2.356194490192345) +assertEqual(math.atan2(1.573823, 0.685329), 1.160103682924653) +assertEqual(math.atan2(-0.899663, 0.668972), -0.9314162757114095) +assertEqual(math.atan2(-0.762894, -0.126497), -1.735113347173296 - 4.440892098500626e-16) +assertEqual(math.atan2(0.468463, -0.992734), 2.700683410692374 - 4.440892098500626e-16) + +# test fsum, sum +fsum_sin = math.fsum([math.sin(i) for i in range(5000)]) +fsum_cos = math.fsum([math.cos(i) for i in range(5000, 9999)]) +assertEqual(fsum_sin, 1.267667771014267 + 2.220446049250313e-16) +assertEqual(fsum_cos, 1.949547793618193 - 4.440892098500626e-16) +assertEqual(fsum_sin + fsum_cos, 3.21721556463246) +sum_sin = sum([math.sin(i) for i in range(5000)]) +sum_cos = sum([math.cos(i) for i in range(5000, 9999)]) +assertEqual(sum_sin, 1.267667771014264 - 2.220446049250313e-16) +assertEqual(sum_cos, 1.949547793618197 - 4.440892098500626e-16) +assertEqual(sum_sin + sum_cos, 3.21721556463246 + 4.440892098500626e-16) + +# test fmod +assertEqual(math.fmod(-2.0, 3.0), -2.0) +assertEqual(math.fmod(2.0, 3.0), 2.0) +assertEqual(math.fmod(4.0, 3.0), 1.0) +assertEqual(math.fmod(-4.0, 3.0), -1.0) + +# test modf x, y = math.modf(math.pi) -assert x == 0.14159265358979323846 - 1.110223024625157e-16 -assert y == 3.0 +assertEqual(x, 0.14159265358979323846 - 1.110223024625157e-16) +assertEqual(y, 3.0) x, y = math.modf(-math.e) -assert x == -0.7182818284590451 -assert y == -2.0 +assertEqual(x, -0.7182818284590451) +assertEqual(y, -2.0) -assert math.factorial(0) == 1 -assert math.factorial(1) == 1 -assert math.factorial(2) == 2 -assert math.factorial(3) == 6 -assert math.factorial(4) == 24 -assert math.factorial(5) == 120 \ No newline at end of file +# test factorial +assertEqual(math.factorial(0), 1) +assertEqual(math.factorial(1), 1) +assertEqual(math.factorial(2), 2) +assertEqual(math.factorial(3), 6) +assertEqual(math.factorial(4), 24) +assertEqual(math.factorial(5), 120) \ No newline at end of file