1
0

930_deterministic_float.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import math
  2. import pkpy
  3. config = pkpy.configmacros
  4. if config["PK_ENABLE_DETERMINISM"] == 0:
  5. exit(0)
  6. def assertEqual(a, b):
  7. if a == b:
  8. return
  9. print(f'{a} != {b} ({a-b})')
  10. raise AssertionError
  11. # test constants
  12. assertEqual(math.pi, 3.14159265358979323846)
  13. assertEqual(math.e, 2.7182818284590452354)
  14. assert math.inf, math.inf
  15. assert math.nan != math.nan
  16. # test ceil
  17. assertEqual(math.ceil(math.pi), 4.0)
  18. assertEqual(math.ceil(-math.e), -2.0)
  19. assertEqual(math.ceil(math.inf), math.inf)
  20. # test floor
  21. assertEqual(math.floor(math.pi), 3.0)
  22. assertEqual(math.floor(-math.e), -3.0)
  23. # test trunc
  24. assertEqual(math.trunc(math.pi), 3.0)
  25. # test fabs
  26. assertEqual(math.fabs(math.pi), 3.14159265358979323846)
  27. assertEqual(math.fabs(-math.pi), 3.14159265358979323846)
  28. # test gcd
  29. assertEqual(math.gcd(10, 5), 5)
  30. assertEqual(math.gcd(10, 6), 2)
  31. assertEqual(math.gcd(10, 7), 1)
  32. assertEqual(math.gcd(10, 10), 10)
  33. assertEqual(math.gcd(-10, 10), 10)
  34. # test isfinite, isinf, isnan
  35. assertEqual(math.isfinite(math.pi), True)
  36. assertEqual(math.isfinite(math.inf), False)
  37. assertEqual(math.isfinite(math.nan), False)
  38. assertEqual(math.isinf(math.pi), False)
  39. assertEqual(math.isinf(math.inf), True)
  40. assertEqual(math.isinf(math.nan), False)
  41. assertEqual(math.isnan(math.pi), False)
  42. assertEqual(math.isnan(math.inf), False)
  43. assertEqual(math.isnan(math.nan), True)
  44. # test exp
  45. assertEqual(math.exp(0), 1.0)
  46. assertEqual(math.exp(1), math.e)
  47. assertEqual(math.exp(1.5), 4.48168907033806362960604019463) #4.481689070338065 - 8.881784197001252e-16)
  48. assertEqual(math.exp(3), 20.0855369231876608182574273087) #20.08553692318767 - 3.552713678800501e-15)
  49. assertEqual(math.exp(-3), 0.04978706836786396527916309651) #0.04978706836786394 + 6.938893903907228e-18)
  50. assertEqual(math.exp(-2.253647), 0.1050155336754953 - 1.387778780781446e-17)
  51. assertEqual(math.exp(4.729036), 113.186398052200445363268954679) #113.1863980522005 - 4.263256414560601e-14)
  52. # test log series
  53. assertEqual(math.log(0), -math.inf)
  54. assertEqual(math.log(1), 0.0)
  55. assertEqual(math.log(2), 0.69314718055994530942)
  56. assertEqual(math.log(math.e), 1.0)
  57. assertEqual(math.log(10), 2.30258509299404545700440394284) #2.30258509299404568402)
  58. assertEqual(math.log(28.897124), 3.363742074595449)
  59. assertEqual(math.log2(math.e), 1.4426950408889634074)
  60. assertEqual(math.log2(78.781291), 6.299781153677818)
  61. assertEqual(math.log10(math.e), 0.43429448190325182765)
  62. assertEqual(math.log10(56.907822), 1.755171964426069 + 4.440892098500626e-16)
  63. # test pow
  64. assertEqual(math.pow(2,2), 4.0)
  65. assertEqual(math.pow(1.41421356237309504880, 2), 2.0 + 4.440892098500626e-16)
  66. assertEqual(math.pow(0.70710678118654752440, 2), 0.5000000000000001)
  67. assertEqual(math.pow(-1.255782,-3), -0.5049603042167915)
  68. assertEqual(math.pow(6.127042, 4.071529), 1604.40754645674428502388764172) #1604.407546456745 + 2.273736754432321e-13)
  69. # test sqrt
  70. assertEqual(math.sqrt(2), 1.41421356237309492343001693370) #1.41421356237309504880)
  71. assertEqual(math.sqrt(math.pi), 1.772453850905516 - 2.220446049250313e-16)
  72. assertEqual(math.sqrt(125.872509), 11.21929182257062)
  73. assertEqual(math.sqrt(1225.296280), 35.0042323155358019448613049462) #35.00423231553579)
  74. # test cos, sin, tan
  75. assertEqual(math.cos(0), 1.0)
  76. assertEqual(math.cos(math.pi/2), 6.123233995736766e-17)
  77. assertEqual(math.cos(math.pi), -1.0)
  78. assertEqual(math.cos(-11.352808), 0.3496839289707818 - 5.551115123125783e-17)
  79. assertEqual(math.cos(7.294708), 0.530570640518482)
  80. assertEqual(math.sin(0), 0.0)
  81. assertEqual(math.sin(math.pi/2), 1.0)
  82. assertEqual(math.sin(math.pi), 1.224646799147353e-16 + 2.465190328815662e-32)
  83. assertEqual(math.sin(-2.837592), -0.2993398018896187)
  84. assertEqual(math.sin(9.294782), 0.1296301374714747)
  85. assertEqual(math.tan(0), 0.0)
  86. assertEqual(math.tan(math.pi/2), 1.633123935319537e+16)
  87. assertEqual(math.tan(math.pi), -1.224646799147353e-16 - 2.465190328815662e-32)
  88. assertEqual(math.tan(-4.812975), 9.908188146466314)
  89. assertEqual(math.tan(1.875814), -3.176189742032396 - 4.440892098500626e-16)
  90. # test acos, asin, atan
  91. assertEqual(math.acos(0), 1.570796326794897 - 4.440892098500626e-16)
  92. assertEqual(math.acos(1), 0.0)
  93. assertEqual(math.acos(-0.758293), 2.431486995121896 + 4.440892098500626e-16)
  94. assertEqual(math.acos(0.024758), 1.546035796825635)
  95. assertEqual(math.asin(0), 0.0)
  96. assertEqual(math.asin(1), 1.570796326794897 - 4.440892098500626e-16)
  97. assertEqual(math.asin(-0.225895), -0.2278616865773913 + 2.775557561562891e-17)
  98. assertEqual(math.asin(0.955658), 1.271886195819423 + 4.440892098500626e-16)
  99. assertEqual(math.atan(0), 0.0)
  100. assertEqual(math.atan(1), 0.78539816339744839002179332965) #0.7853981633974483)
  101. assertEqual(math.atan(-3.758927), -1.3107852846106160527028805518) #-1.310785284610617 - 4.440892098500626e-16)
  102. assertEqual(math.atan(35.789293), 1.54286227728011748894232368911) #1.542862277280122)
  103. # test atan2
  104. assertEqual(math.atan2(math.pi/4, math.pi/4), 0.78539816339744839002179332965) #0.7853981633974483)
  105. assertEqual(math.atan2(-math.pi/4, math.pi/4), -0.7853981633974483900217933296) #-0.7853981633974483)
  106. assertEqual(math.atan2(-math.pi/4, -math.pi/4), -2.356194490192345)
  107. assertEqual(math.atan2(math.pi/4, -math.pi/4), 2.356194490192345)
  108. assertEqual(math.atan2(1.573823, 0.685329), 1.16010368292465315676054160576) #1.160103682924653)
  109. assertEqual(math.atan2(-0.899663, 0.668972), -0.9314162757114096136135117376) #-0.9314162757114095)
  110. assertEqual(math.atan2(-0.762894, -0.126497), -1.7351133471732969049128314509) #-1.735113347173296 - 4.440892098500626e-16)
  111. assertEqual(math.atan2(0.468463, -0.992734), 2.70068341069237316531825854326) #2.700683410692374 - 4.440892098500626e-16)
  112. # test fsum, sum
  113. fsum_sin = math.fsum([math.sin(i) for i in range(5000)])
  114. fsum_cos = math.fsum([math.cos(i) for i in range(5000, 9999)])
  115. assertEqual(fsum_sin, 1.267667771014267 + 2.220446049250313e-16)
  116. assertEqual(fsum_cos, 1.949547793618193 - 4.440892098500626e-16)
  117. assertEqual(fsum_sin + fsum_cos, 3.21721556463246)
  118. sum_sin = sum([math.sin(i) for i in range(5000)])
  119. sum_cos = sum([math.cos(i) for i in range(5000, 9999)])
  120. assertEqual(sum_sin, 1.267667771014264 - 2.220446049250313e-16)
  121. assertEqual(sum_cos, 1.949547793618197 - 4.440892098500626e-16)
  122. assertEqual(sum_sin + sum_cos, 3.21721556463246 + 4.440892098500626e-16)
  123. # test fmod
  124. assertEqual(math.fmod(-2.0, 3.0), -2.0)
  125. assertEqual(math.fmod(2.0, 3.0), 2.0)
  126. assertEqual(math.fmod(4.0, 3.0), 1.0)
  127. assertEqual(math.fmod(-4.0, 3.0), -1.0)
  128. # test modf
  129. x, y = math.modf(math.pi)
  130. assertEqual(x, 0.14159265358979323846 - 1.110223024625157e-16)
  131. assertEqual(y, 3.0)
  132. x, y = math.modf(-math.e)
  133. assertEqual(x, -0.7182818284590451)
  134. assertEqual(y, -2.0)
  135. # test factorial
  136. assertEqual(math.factorial(0), 1)
  137. assertEqual(math.factorial(1), 1)
  138. assertEqual(math.factorial(2), 2)
  139. assertEqual(math.factorial(3), 6)
  140. assertEqual(math.factorial(4), 24)
  141. assertEqual(math.factorial(5), 120)