mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Allow printing a leading '-' and the maximum number of exponent digits
rather than raising RuntimeError (allocated space is sufficient for the additional character).
This commit is contained in:
parent
0774e9b9f5
commit
ff3eca0cc3
2 changed files with 50 additions and 2 deletions
|
@ -4977,6 +4977,54 @@ class CWhitebox(unittest.TestCase):
|
|||
x = "1e%d" % (-sys.maxsize-1)
|
||||
self.assertRaises(InvalidOperation, Decimal, x)
|
||||
|
||||
def test_from_tuple(self):
|
||||
Decimal = C.Decimal
|
||||
localcontext = C.localcontext
|
||||
InvalidOperation = C.InvalidOperation
|
||||
Overflow = C.Overflow
|
||||
Underflow = C.Underflow
|
||||
|
||||
with localcontext() as c:
|
||||
|
||||
c.traps[InvalidOperation] = True
|
||||
c.traps[Overflow] = True
|
||||
c.traps[Underflow] = True
|
||||
|
||||
# SSIZE_MAX
|
||||
x = (1, (), sys.maxsize)
|
||||
self.assertEqual(str(c.create_decimal(x)), '-0E+999999')
|
||||
self.assertRaises(InvalidOperation, Decimal, x)
|
||||
|
||||
x = (1, (0, 1, 2), sys.maxsize)
|
||||
self.assertRaises(Overflow, c.create_decimal, x)
|
||||
self.assertRaises(InvalidOperation, Decimal, x)
|
||||
|
||||
# SSIZE_MIN
|
||||
x = (1, (), -sys.maxsize-1)
|
||||
self.assertEqual(str(c.create_decimal(x)), '-0E-1000026')
|
||||
self.assertRaises(InvalidOperation, Decimal, x)
|
||||
|
||||
x = (1, (0, 1, 2), -sys.maxsize-1)
|
||||
self.assertRaises(Underflow, c.create_decimal, x)
|
||||
self.assertRaises(InvalidOperation, Decimal, x)
|
||||
|
||||
# OverflowError
|
||||
x = (1, (), sys.maxsize+1)
|
||||
self.assertRaises(OverflowError, c.create_decimal, x)
|
||||
self.assertRaises(OverflowError, Decimal, x)
|
||||
|
||||
x = (1, (), -sys.maxsize-2)
|
||||
self.assertRaises(OverflowError, c.create_decimal, x)
|
||||
self.assertRaises(OverflowError, Decimal, x)
|
||||
|
||||
# Specials
|
||||
x = (1, (), "N")
|
||||
self.assertEqual(str(Decimal(x)), '-sNaN')
|
||||
x = (1, (0,), "N")
|
||||
self.assertEqual(str(Decimal(x)), '-sNaN')
|
||||
x = (1, (0, 1), "N")
|
||||
self.assertEqual(str(Decimal(x)), '-sNaN1')
|
||||
|
||||
|
||||
all_tests = [
|
||||
CExplicitConstructionTest, PyExplicitConstructionTest,
|
||||
|
|
|
@ -2435,8 +2435,8 @@ dectuple_as_str(PyObject *dectuple)
|
|||
if (sign_special[1] == '\0') {
|
||||
/* not a special number */
|
||||
*cp++ = 'E';
|
||||
n = snprintf(cp, MPD_EXPDIGITS+1, "%" PRI_mpd_ssize_t, exp);
|
||||
if (n < 0 || n >= MPD_EXPDIGITS+1) {
|
||||
n = snprintf(cp, MPD_EXPDIGITS+2, "%" PRI_mpd_ssize_t, exp);
|
||||
if (n < 0 || n >= MPD_EXPDIGITS+2) {
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"internal error in dec_sequence_as_str");
|
||||
goto error;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue