(self)
| 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') |
nothing calls this directly
no test coverage detected