aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/test/test_capi/test_float.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_capi/test_float.py')
-rw-r--r--Lib/test/test_capi/test_float.py26
1 files changed, 15 insertions, 11 deletions
diff --git a/Lib/test/test_capi/test_float.py b/Lib/test/test_capi/test_float.py
index c857959d569..f7efe0d0254 100644
--- a/Lib/test/test_capi/test_float.py
+++ b/Lib/test/test_capi/test_float.py
@@ -183,31 +183,35 @@ class CAPIFloatTest(unittest.TestCase):
def test_pack_unpack_roundtrip_for_nans(self):
pack = _testcapi.float_pack
unpack = _testcapi.float_unpack
- for _ in range(1000):
+
+ for _ in range(10):
for size in (2, 4, 8):
sign = random.randint(0, 1)
- signaling = random.randint(0, 1)
+ if sys.maxsize != 2147483647: # not it 32-bit mode
+ signaling = random.randint(0, 1)
+ else:
+ # Skip sNaN's on x86 (32-bit). The problem is that sNaN
+ # doubles become qNaN doubles just by the C calling
+ # convention, there is no way to preserve sNaN doubles
+ # between C function calls with the current
+ # PyFloat_Pack/Unpack*() API. See also gh-130317 and
+ # e.g. https://developercommunity.visualstudio.com/t/155064
+ signaling = 0
quiet = int(not signaling)
if size == 8:
- payload = random.randint(signaling, 1 << 50)
+ payload = random.randint(signaling, 0x7ffffffffffff)
i = (sign << 63) + (0x7ff << 52) + (quiet << 51) + payload
elif size == 4:
- payload = random.randint(signaling, 1 << 21)
+ payload = random.randint(signaling, 0x3fffff)
i = (sign << 31) + (0xff << 23) + (quiet << 22) + payload
elif size == 2:
- payload = random.randint(signaling, 1 << 8)
+ payload = random.randint(signaling, 0x1ff)
i = (sign << 15) + (0x1f << 10) + (quiet << 9) + payload
data = bytes.fromhex(f'{i:x}')
for endian in (BIG_ENDIAN, LITTLE_ENDIAN):
with self.subTest(data=data, size=size, endian=endian):
data1 = data if endian == BIG_ENDIAN else data[::-1]
value = unpack(data1, endian)
- if signaling and sys.platform == 'win32':
- # On this platform sNaN becomes qNaN when returned
- # from function. That's a known bug, e.g.
- # https://developercommunity.visualstudio.com/t/155064
- # (see also gh-130317).
- value = _testcapi.float_set_snan(value)
data2 = pack(size, value, endian)
self.assertTrue(math.isnan(value))
self.assertEqual(data1, data2)