MCPcopy Index your code
hub / github.com/RustPython/RustPython / test_fma_zero_result

Method test_fma_zero_result

Lib/test/test_math.py:2788–2837  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

2786 # version is known change this to:
2787 # or support.linked_to_musl() < (1, <m>, <p>)
2788 def test_fma_zero_result(self):
2789 nonnegative_finites = [0.0, 1e-300, 2.3, 1e300]
2790
2791 # Zero results from exact zero inputs.
2792 for b in nonnegative_finites:
2793 with self.subTest(b=b):
2794 self.assertIsPositiveZero(math.fma(0.0, b, 0.0))
2795 self.assertIsPositiveZero(math.fma(0.0, b, -0.0))
2796 self.assertIsNegativeZero(math.fma(0.0, -b, -0.0))
2797 self.assertIsPositiveZero(math.fma(0.0, -b, 0.0))
2798 self.assertIsPositiveZero(math.fma(-0.0, -b, 0.0))
2799 self.assertIsPositiveZero(math.fma(-0.0, -b, -0.0))
2800 self.assertIsNegativeZero(math.fma(-0.0, b, -0.0))
2801 self.assertIsPositiveZero(math.fma(-0.0, b, 0.0))
2802
2803 self.assertIsPositiveZero(math.fma(b, 0.0, 0.0))
2804 self.assertIsPositiveZero(math.fma(b, 0.0, -0.0))
2805 self.assertIsNegativeZero(math.fma(-b, 0.0, -0.0))
2806 self.assertIsPositiveZero(math.fma(-b, 0.0, 0.0))
2807 self.assertIsPositiveZero(math.fma(-b, -0.0, 0.0))
2808 self.assertIsPositiveZero(math.fma(-b, -0.0, -0.0))
2809 self.assertIsNegativeZero(math.fma(b, -0.0, -0.0))
2810 self.assertIsPositiveZero(math.fma(b, -0.0, 0.0))
2811
2812 # Exact zero result from nonzero inputs.
2813 self.assertIsPositiveZero(math.fma(2.0, 2.0, -4.0))
2814 self.assertIsPositiveZero(math.fma(2.0, -2.0, 4.0))
2815 self.assertIsPositiveZero(math.fma(-2.0, -2.0, -4.0))
2816 self.assertIsPositiveZero(math.fma(-2.0, 2.0, 4.0))
2817
2818 # Underflow to zero.
2819 tiny = 1e-300
2820 self.assertIsPositiveZero(math.fma(tiny, tiny, 0.0))
2821 self.assertIsNegativeZero(math.fma(tiny, -tiny, 0.0))
2822 self.assertIsPositiveZero(math.fma(-tiny, -tiny, 0.0))
2823 self.assertIsNegativeZero(math.fma(-tiny, tiny, 0.0))
2824 self.assertIsPositiveZero(math.fma(tiny, tiny, -0.0))
2825 self.assertIsNegativeZero(math.fma(tiny, -tiny, -0.0))
2826 self.assertIsPositiveZero(math.fma(-tiny, -tiny, -0.0))
2827 self.assertIsNegativeZero(math.fma(-tiny, tiny, -0.0))
2828
2829 # Corner case where rounding the multiplication would
2830 # give the wrong result.
2831 x = float.fromhex('0x1p-500')
2832 y = float.fromhex('0x1p-550')
2833 z = float.fromhex('0x1p-1000')
2834 self.assertIsNegativeZero(math.fma(x-y, x+y, -z))
2835 self.assertIsPositiveZero(math.fma(y-x, x+y, z))
2836 self.assertIsNegativeZero(math.fma(y-x, -(x+y), -z))
2837 self.assertIsPositiveZero(math.fma(x-y, -(x+y), z))
2838
2839 def test_fma_overflow(self):
2840 a = b = float.fromhex('0x1p512')

Callers

nothing calls this directly

Calls 5

assertIsPositiveZeroMethod · 0.95
assertIsNegativeZeroMethod · 0.95
subTestMethod · 0.80
fmaMethod · 0.45
fromhexMethod · 0.45

Tested by

no test coverage detected