(self)
| 2693 | # version is known change this to: |
| 2694 | # or support.linked_to_musl() < (1, <m>, <p>) |
| 2695 | def test_fma_zero_result(self): |
| 2696 | nonnegative_finites = [0.0, 1e-300, 2.3, 1e300] |
| 2697 | |
| 2698 | # Zero results from exact zero inputs. |
| 2699 | for b in nonnegative_finites: |
| 2700 | with self.subTest(b=b): |
| 2701 | self.assertIsPositiveZero(math.fma(0.0, b, 0.0)) |
| 2702 | self.assertIsPositiveZero(math.fma(0.0, b, -0.0)) |
| 2703 | self.assertIsNegativeZero(math.fma(0.0, -b, -0.0)) |
| 2704 | self.assertIsPositiveZero(math.fma(0.0, -b, 0.0)) |
| 2705 | self.assertIsPositiveZero(math.fma(-0.0, -b, 0.0)) |
| 2706 | self.assertIsPositiveZero(math.fma(-0.0, -b, -0.0)) |
| 2707 | self.assertIsNegativeZero(math.fma(-0.0, b, -0.0)) |
| 2708 | self.assertIsPositiveZero(math.fma(-0.0, b, 0.0)) |
| 2709 | |
| 2710 | self.assertIsPositiveZero(math.fma(b, 0.0, 0.0)) |
| 2711 | self.assertIsPositiveZero(math.fma(b, 0.0, -0.0)) |
| 2712 | self.assertIsNegativeZero(math.fma(-b, 0.0, -0.0)) |
| 2713 | self.assertIsPositiveZero(math.fma(-b, 0.0, 0.0)) |
| 2714 | self.assertIsPositiveZero(math.fma(-b, -0.0, 0.0)) |
| 2715 | self.assertIsPositiveZero(math.fma(-b, -0.0, -0.0)) |
| 2716 | self.assertIsNegativeZero(math.fma(b, -0.0, -0.0)) |
| 2717 | self.assertIsPositiveZero(math.fma(b, -0.0, 0.0)) |
| 2718 | |
| 2719 | # Exact zero result from nonzero inputs. |
| 2720 | self.assertIsPositiveZero(math.fma(2.0, 2.0, -4.0)) |
| 2721 | self.assertIsPositiveZero(math.fma(2.0, -2.0, 4.0)) |
| 2722 | self.assertIsPositiveZero(math.fma(-2.0, -2.0, -4.0)) |
| 2723 | self.assertIsPositiveZero(math.fma(-2.0, 2.0, 4.0)) |
| 2724 | |
| 2725 | # Underflow to zero. |
| 2726 | tiny = 1e-300 |
| 2727 | self.assertIsPositiveZero(math.fma(tiny, tiny, 0.0)) |
| 2728 | self.assertIsNegativeZero(math.fma(tiny, -tiny, 0.0)) |
| 2729 | self.assertIsPositiveZero(math.fma(-tiny, -tiny, 0.0)) |
| 2730 | self.assertIsNegativeZero(math.fma(-tiny, tiny, 0.0)) |
| 2731 | self.assertIsPositiveZero(math.fma(tiny, tiny, -0.0)) |
| 2732 | self.assertIsNegativeZero(math.fma(tiny, -tiny, -0.0)) |
| 2733 | self.assertIsPositiveZero(math.fma(-tiny, -tiny, -0.0)) |
| 2734 | self.assertIsNegativeZero(math.fma(-tiny, tiny, -0.0)) |
| 2735 | |
| 2736 | # Corner case where rounding the multiplication would |
| 2737 | # give the wrong result. |
| 2738 | x = float.fromhex('0x1p-500') |
| 2739 | y = float.fromhex('0x1p-550') |
| 2740 | z = float.fromhex('0x1p-1000') |
| 2741 | self.assertIsNegativeZero(math.fma(x-y, x+y, -z)) |
| 2742 | self.assertIsPositiveZero(math.fma(y-x, x+y, z)) |
| 2743 | self.assertIsNegativeZero(math.fma(y-x, -(x+y), -z)) |
| 2744 | self.assertIsPositiveZero(math.fma(x-y, -(x+y), z)) |
| 2745 | |
| 2746 | def test_fma_overflow(self): |
| 2747 | a = b = float.fromhex('0x1p512') |
nothing calls this directly
no test coverage detected