import functools import unittest from math import isnan, nextafter from test.support import requires_IEEE_754 from test.support.hypothesis_helper import hypothesis floats = hypothesis.strategies.floats integers = hypothesis.strategies.integers def assert_equal_float(x, y): assert isnan(x) and isnan(y) or x == y def via_reduce(x, y, steps): return functools.reduce(nextafter, [y] * steps, x) class NextafterTests(unittest.TestCase): @requires_IEEE_754 @hypothesis.given( x=floats(), y=floats(), steps=integers(min_value=0, max_value=2**16)) def test_count(self, x, y, steps): assert_equal_float(via_reduce(x, y, steps), nextafter(x, y, steps=steps)) @requires_IEEE_754 @hypothesis.given( x=floats(), y=floats(), a=integers(min_value=0), b=integers(min_value=0)) def test_addition_commutes(self, x, y, a, b): first = nextafter(x, y, steps=a) second = nextafter(first, y, steps=b) combined = nextafter(x, y, steps=a+b) hypothesis.note(f"{first} -> {second} == {combined}") assert_equal_float(second, combined)