mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
Merge
This commit is contained in:
commit
8d649ef951
4 changed files with 42 additions and 2 deletions
|
@ -1601,7 +1601,13 @@ class Decimal(object):
|
||||||
|
|
||||||
def __float__(self):
|
def __float__(self):
|
||||||
"""Float representation."""
|
"""Float representation."""
|
||||||
return float(str(self))
|
if self._isnan():
|
||||||
|
if self.is_snan():
|
||||||
|
raise ValueError("Cannot convert signaling NaN to float")
|
||||||
|
s = "-nan" if self._sign else "nan"
|
||||||
|
else:
|
||||||
|
s = str(self)
|
||||||
|
return float(s)
|
||||||
|
|
||||||
def __int__(self):
|
def __int__(self):
|
||||||
"""Converts self to an int, truncating if necessary."""
|
"""Converts self to an int, truncating if necessary."""
|
||||||
|
|
|
@ -1942,6 +1942,22 @@ class UsabilityTest(unittest.TestCase):
|
||||||
for d, n, r in test_triples:
|
for d, n, r in test_triples:
|
||||||
self.assertEqual(str(round(Decimal(d), n)), r)
|
self.assertEqual(str(round(Decimal(d), n)), r)
|
||||||
|
|
||||||
|
def test_nan_to_float(self):
|
||||||
|
# Test conversions of decimal NANs to float.
|
||||||
|
# See http://bugs.python.org/issue15544
|
||||||
|
Decimal = self.decimal.Decimal
|
||||||
|
for s in ('nan', 'nan1234', '-nan', '-nan2468'):
|
||||||
|
f = float(Decimal(s))
|
||||||
|
self.assertTrue(math.isnan(f))
|
||||||
|
sign = math.copysign(1.0, f)
|
||||||
|
self.assertEqual(sign, -1.0 if s.startswith('-') else 1.0)
|
||||||
|
|
||||||
|
def test_snan_to_float(self):
|
||||||
|
Decimal = self.decimal.Decimal
|
||||||
|
for s in ('snan', '-snan', 'snan1357', '-snan1234'):
|
||||||
|
d = Decimal(s)
|
||||||
|
self.assertRaises(ValueError, float, d)
|
||||||
|
|
||||||
def test_eval_round_trip(self):
|
def test_eval_round_trip(self):
|
||||||
Decimal = self.decimal.Decimal
|
Decimal = self.decimal.Decimal
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #15544: Fix Decimal.__float__ to work with payload-carrying NaNs.
|
||||||
|
|
||||||
- Issue #15776: Allow pyvenv to work in existing directory with --clean.
|
- Issue #15776: Allow pyvenv to work in existing directory with --clean.
|
||||||
|
|
||||||
- Issue #15249: BytesGenerator now correctly mangles From lines (when
|
- Issue #15249: BytesGenerator now correctly mangles From lines (when
|
||||||
|
|
|
@ -3357,7 +3357,23 @@ PyDec_AsFloat(PyObject *dec)
|
||||||
{
|
{
|
||||||
PyObject *f, *s;
|
PyObject *f, *s;
|
||||||
|
|
||||||
s = dec_str(dec);
|
if (mpd_isnan(MPD(dec))) {
|
||||||
|
if (mpd_issnan(MPD(dec))) {
|
||||||
|
PyErr_SetString(PyExc_ValueError,
|
||||||
|
"cannot convert signaling NaN to float");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (mpd_isnegative(MPD(dec))) {
|
||||||
|
s = PyUnicode_FromString("-nan");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
s = PyUnicode_FromString("nan");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
s = dec_str(dec);
|
||||||
|
}
|
||||||
|
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue