mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
bpo-44954: Fix wrong result in float.fromhex corner case (GH-27834)
(cherry picked from commit 60b93d9e49)
Co-authored-by: Mark Dickinson <mdickinson@enthought.com>
This commit is contained in:
parent
f0e2a46349
commit
838b0e975f
3 changed files with 18 additions and 2 deletions
|
|
@ -1468,6 +1468,20 @@ def test_from_hex(self):
|
||||||
self.identical(fromHex('0X1.0000000000001fp0'), 1.0+2*EPS)
|
self.identical(fromHex('0X1.0000000000001fp0'), 1.0+2*EPS)
|
||||||
self.identical(fromHex('0x1.00000000000020p0'), 1.0+2*EPS)
|
self.identical(fromHex('0x1.00000000000020p0'), 1.0+2*EPS)
|
||||||
|
|
||||||
|
# Regression test for a corner-case bug reported in b.p.o. 44954
|
||||||
|
self.identical(fromHex('0x.8p-1074'), 0.0)
|
||||||
|
self.identical(fromHex('0x.80p-1074'), 0.0)
|
||||||
|
self.identical(fromHex('0x.81p-1074'), TINY)
|
||||||
|
self.identical(fromHex('0x8p-1078'), 0.0)
|
||||||
|
self.identical(fromHex('0x8.0p-1078'), 0.0)
|
||||||
|
self.identical(fromHex('0x8.1p-1078'), TINY)
|
||||||
|
self.identical(fromHex('0x80p-1082'), 0.0)
|
||||||
|
self.identical(fromHex('0x81p-1082'), TINY)
|
||||||
|
self.identical(fromHex('.8p-1074'), 0.0)
|
||||||
|
self.identical(fromHex('8p-1078'), 0.0)
|
||||||
|
self.identical(fromHex('-.8p-1074'), -0.0)
|
||||||
|
self.identical(fromHex('+8p-1078'), 0.0)
|
||||||
|
|
||||||
def test_roundtrip(self):
|
def test_roundtrip(self):
|
||||||
def roundtrip(x):
|
def roundtrip(x):
|
||||||
return fromHex(toHex(x))
|
return fromHex(toHex(x))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fixed a corner case bug where the result of ``float.fromhex('0x.8p-1074')``
|
||||||
|
was rounded the wrong way.
|
||||||
|
|
@ -1463,8 +1463,8 @@ float_fromhex(PyTypeObject *type, PyObject *string)
|
||||||
bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */
|
bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */
|
||||||
if ((digit & half_eps) != 0) {
|
if ((digit & half_eps) != 0) {
|
||||||
round_up = 0;
|
round_up = 0;
|
||||||
if ((digit & (3*half_eps-1)) != 0 ||
|
if ((digit & (3*half_eps-1)) != 0 || (half_eps == 8 &&
|
||||||
(half_eps == 8 && (HEX_DIGIT(key_digit+1) & 1) != 0))
|
key_digit+1 < ndigits && (HEX_DIGIT(key_digit+1) & 1) != 0))
|
||||||
round_up = 1;
|
round_up = 1;
|
||||||
else
|
else
|
||||||
for (i = key_digit-1; i >= 0; i--)
|
for (i = key_digit-1; i >= 0; i--)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue