MCPcopy Index your code
hub / github.com/python/cpython / test_fma_zero_result

Method test_fma_zero_result

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

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 4

assertIsPositiveZeroMethod · 0.95
assertIsNegativeZeroMethod · 0.95
subTestMethod · 0.45
fmaMethod · 0.45

Tested by

no test coverage detected