mirror of
https://github.com/python/cpython.git
synced 2025-10-15 03:10:29 +00:00
Issue #15882: Change _decimal to accept any coefficient tuple when
constructing infinities. This is done for backwards compatibility with decimal.py: Infinity coefficients are undefined in _decimal (in accordance with the specification).
This commit is contained in:
parent
6c4b095334
commit
dbcf103be0
3 changed files with 21 additions and 7 deletions
|
@ -1992,7 +1992,8 @@ class UsabilityTest(unittest.TestCase):
|
||||||
d = Decimal("-4.34913534E-17")
|
d = Decimal("-4.34913534E-17")
|
||||||
self.assertEqual(d.as_tuple(), (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) )
|
self.assertEqual(d.as_tuple(), (1, (4, 3, 4, 9, 1, 3, 5, 3, 4), -25) )
|
||||||
|
|
||||||
# XXX non-compliant infinity payload.
|
# The '0' coefficient is implementation specific to decimal.py.
|
||||||
|
# It has no meaning in the C-version and is ignored there.
|
||||||
d = Decimal("Infinity")
|
d = Decimal("Infinity")
|
||||||
self.assertEqual(d.as_tuple(), (0, (0,), 'F') )
|
self.assertEqual(d.as_tuple(), (0, (0,), 'F') )
|
||||||
|
|
||||||
|
@ -2012,12 +2013,14 @@ class UsabilityTest(unittest.TestCase):
|
||||||
d = Decimal( (1, (), 'n') )
|
d = Decimal( (1, (), 'n') )
|
||||||
self.assertEqual(d.as_tuple(), (1, (), 'n') )
|
self.assertEqual(d.as_tuple(), (1, (), 'n') )
|
||||||
|
|
||||||
# XXX coefficient in infinity should raise an error
|
# For infinities, decimal.py has always silently accepted any
|
||||||
if self.decimal == P:
|
# coefficient tuple.
|
||||||
d = Decimal( (0, (4, 5, 3, 4), 'F') )
|
d = Decimal( (0, (0,), 'F') )
|
||||||
self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
|
self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
|
||||||
d = Decimal( (1, (0, 2, 7, 1), 'F') )
|
d = Decimal( (0, (4, 5, 3, 4), 'F') )
|
||||||
self.assertEqual(d.as_tuple(), (1, (0,), 'F'))
|
self.assertEqual(d.as_tuple(), (0, (0,), 'F'))
|
||||||
|
d = Decimal( (1, (0, 2, 7, 1), 'F') )
|
||||||
|
self.assertEqual(d.as_tuple(), (1, (0,), 'F'))
|
||||||
|
|
||||||
def test_subclassing(self):
|
def test_subclassing(self):
|
||||||
# Different behaviours when subclassing Decimal
|
# Different behaviours when subclassing Decimal
|
||||||
|
|
|
@ -17,6 +17,10 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #15882: Change _decimal to accept any coefficient tuple when
|
||||||
|
constructing infinities. This is done for backwards compatibility
|
||||||
|
with decimal.py: Infinity coefficients are undefined in _decimal
|
||||||
|
(in accordance with the specification).
|
||||||
|
|
||||||
What's New in Python 3.3.0 Release Candidate 2?
|
What's New in Python 3.3.0 Release Candidate 2?
|
||||||
===============================================
|
===============================================
|
||||||
|
|
|
@ -2364,6 +2364,7 @@ dectuple_as_str(PyObject *dectuple)
|
||||||
long sign, l;
|
long sign, l;
|
||||||
mpd_ssize_t exp = 0;
|
mpd_ssize_t exp = 0;
|
||||||
Py_ssize_t i, mem, tsize;
|
Py_ssize_t i, mem, tsize;
|
||||||
|
int is_infinite = 0;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
assert(PyTuple_Check(dectuple));
|
assert(PyTuple_Check(dectuple));
|
||||||
|
@ -2399,6 +2400,7 @@ dectuple_as_str(PyObject *dectuple)
|
||||||
/* special */
|
/* special */
|
||||||
if (PyUnicode_CompareWithASCIIString(tmp, "F") == 0) {
|
if (PyUnicode_CompareWithASCIIString(tmp, "F") == 0) {
|
||||||
strcat(sign_special, "Inf");
|
strcat(sign_special, "Inf");
|
||||||
|
is_infinite = 1;
|
||||||
}
|
}
|
||||||
else if (PyUnicode_CompareWithASCIIString(tmp, "n") == 0) {
|
else if (PyUnicode_CompareWithASCIIString(tmp, "n") == 0) {
|
||||||
strcat(sign_special, "NaN");
|
strcat(sign_special, "NaN");
|
||||||
|
@ -2470,6 +2472,11 @@ dectuple_as_str(PyObject *dectuple)
|
||||||
"coefficient must be a tuple of digits");
|
"coefficient must be a tuple of digits");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
if (is_infinite) {
|
||||||
|
/* accept but ignore any well-formed coefficient for compatibility
|
||||||
|
with decimal.py */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
*cp++ = (char)l + '0';
|
*cp++ = (char)l + '0';
|
||||||
}
|
}
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue