From 0738b9a338fd27ff2d4456dd9c15801a8858ffd9 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Mon, 11 Dec 2023 21:29:43 +0300 Subject: gh-108303: Move `double_const` to `test_import` where it belongs (#112108) --- Lib/test/double_const.py | 30 ------------------------------ Lib/test/test_import/__init__.py | 9 ++++++--- Lib/test/test_import/data/double_const.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 33 deletions(-) delete mode 100644 Lib/test/double_const.py create mode 100644 Lib/test/test_import/data/double_const.py diff --git a/Lib/test/double_const.py b/Lib/test/double_const.py deleted file mode 100644 index 67852aa..0000000 --- a/Lib/test/double_const.py +++ /dev/null @@ -1,30 +0,0 @@ -from test.support import TestFailed - -# A test for SF bug 422177: manifest float constants varied way too much in -# precision depending on whether Python was loading a module for the first -# time, or reloading it from a precompiled .pyc. The "expected" failure -# mode is that when test_import imports this after all .pyc files have been -# erased, it passes, but when test_import imports this from -# double_const.pyc, it fails. This indicates a woeful loss of precision in -# the marshal format for doubles. It's also possible that repr() doesn't -# produce enough digits to get reasonable precision for this box. - -PI = 3.14159265358979324 -TWOPI = 6.28318530717958648 - -PI_str = "3.14159265358979324" -TWOPI_str = "6.28318530717958648" - -# Verify that the double x is within a few bits of eval(x_str). -def check_ok(x, x_str): - assert x > 0.0 - x2 = eval(x_str) - assert x2 > 0.0 - diff = abs(x - x2) - # If diff is no larger than 3 ULP (wrt x2), then diff/8 is no larger - # than 0.375 ULP, so adding diff/8 to x2 should have no effect. - if x2 + (diff / 8.) != x2: - raise TestFailed("Manifest const %s lost too much precision " % x_str) - -check_ok(PI, PI_str) -check_ok(TWOPI, TWOPI_str) diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 1ecac4f..bbfbb57 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -409,9 +409,12 @@ class ImportTests(unittest.TestCase): import RAnDoM def test_double_const(self): - # Another brief digression to test the accuracy of manifest float - # constants. - from test import double_const # don't blink -- that *was* the test + # Importing double_const checks that float constants + # serialiazed by marshal as PYC files don't lose precision + # (SF bug 422177). + from test.test_import.data import double_const + unload('test.test_import.data.double_const') + from test.test_import.data import double_const def test_import(self): def test_with_extension(ext): diff --git a/Lib/test/test_import/data/double_const.py b/Lib/test/test_import/data/double_const.py new file mode 100644 index 0000000..67852aa --- /dev/null +++ b/Lib/test/test_import/data/double_const.py @@ -0,0 +1,30 @@ +from test.support import TestFailed + +# A test for SF bug 422177: manifest float constants varied way too much in +# precision depending on whether Python was loading a module for the first +# time, or reloading it from a precompiled .pyc. The "expected" failure +# mode is that when test_import imports this after all .pyc files have been +# erased, it passes, but when test_import imports this from +# double_const.pyc, it fails. This indicates a woeful loss of precision in +# the marshal format for doubles. It's also possible that repr() doesn't +# produce enough digits to get reasonable precision for this box. + +PI = 3.14159265358979324 +TWOPI = 6.28318530717958648 + +PI_str = "3.14159265358979324" +TWOPI_str = "6.28318530717958648" + +# Verify that the double x is within a few bits of eval(x_str). +def check_ok(x, x_str): + assert x > 0.0 + x2 = eval(x_str) + assert x2 > 0.0 + diff = abs(x - x2) + # If diff is no larger than 3 ULP (wrt x2), then diff/8 is no larger + # than 0.375 ULP, so adding diff/8 to x2 should have no effect. + if x2 + (diff / 8.) != x2: + raise TestFailed("Manifest const %s lost too much precision " % x_str) + +check_ok(PI, PI_str) +check_ok(TWOPI, TWOPI_str) -- cgit v0.12