[3.12] gh-118164: str(10**10000) hangs if the C _decimal module is missing (GH-118503) (GH-118584)

Serhiy and I independently concluded that exact powers of 10
aren't possible in these contexts, so just checking the
string length is sufficient.

(cherry picked from commit 999f0c5122)

Co-authored-by: Tim Peters <tim.peters@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2024-05-05 08:34:43 +02:00 committed by GitHub
parent 53e8bdd1e6
commit 0c605244a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 40 additions and 5 deletions

View file

@ -4722,9 +4722,33 @@ class PyWhitebox(unittest.TestCase):
c.prec = 1
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('3e-6'))
c.prec = 2
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.6e-6'))
c.prec = 3
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.56e-6'))
c.prec = 28
x = Decimal("152587890625") ** Decimal('-0.5')
self.assertEqual(x, Decimal('2.56e-6'))
c.prec = 201
x = Decimal(2**578) ** Decimal("-0.5")
# See https://github.com/python/cpython/issues/118027
# Testing for an exact power could appear to hang, in the Python
# version, as it attempted to compute 10**(MAX_EMAX + 1).
# Fixed via https://github.com/python/cpython/pull/118503.
c.prec = P.MAX_PREC
c.Emax = P.MAX_EMAX
c.Emin = P.MIN_EMIN
c.traps[P.Inexact] = 1
D2 = Decimal(2)
# If the bug is still present, the next statement won't complete.
res = D2 ** 117
self.assertEqual(res, 1 << 117)
def test_py_immutability_operations(self):
# Do operations and check that it didn't change internal objects.
Decimal = P.Decimal
@ -5737,7 +5761,6 @@ class CWhitebox(unittest.TestCase):
with C.localcontext(rounding=C.ROUND_DOWN):
self.assertEqual(format(y, '#.1f'), '6.0')
@requires_docstrings
@requires_cdecimal
class SignatureTest(unittest.TestCase):