mirror of
https://github.com/python/cpython.git
synced 2025-09-01 14:38:00 +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)
|
x = "1e%d" % (-sys.maxsize-1)
|
||||||
self.assertRaises(InvalidOperation, Decimal, x)
|
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 = [
|
all_tests = [
|
||||||
CExplicitConstructionTest, PyExplicitConstructionTest,
|
CExplicitConstructionTest, PyExplicitConstructionTest,
|
||||||
|
|
|
@ -2435,8 +2435,8 @@ dectuple_as_str(PyObject *dectuple)
|
||||||
if (sign_special[1] == '\0') {
|
if (sign_special[1] == '\0') {
|
||||||
/* not a special number */
|
/* not a special number */
|
||||||
*cp++ = 'E';
|
*cp++ = 'E';
|
||||||
n = snprintf(cp, MPD_EXPDIGITS+1, "%" PRI_mpd_ssize_t, exp);
|
n = snprintf(cp, MPD_EXPDIGITS+2, "%" PRI_mpd_ssize_t, exp);
|
||||||
if (n < 0 || n >= MPD_EXPDIGITS+1) {
|
if (n < 0 || n >= MPD_EXPDIGITS+2) {
|
||||||
PyErr_SetString(PyExc_RuntimeError,
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
"internal error in dec_sequence_as_str");
|
"internal error in dec_sequence_as_str");
|
||||||
goto error;
|
goto error;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue