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