add random hard encoded test case

This commit is contained in:
PrimedErwin 2025-05-23 16:24:30 +08:00
parent 0f4acc1437
commit 0d40080d1f

View File

@ -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
# 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)