mirror of
https://github.com/python/cpython.git
synced 2025-07-30 06:34:15 +00:00
Issue #3166: Make long -> float (and int -> float) conversions
correctly rounded, using round-half-to-even. This ensures that the value of float(n) doesn't depend on whether we're using 15-bit digits or 30-bit digits for Python longs.
This commit is contained in:
parent
cccfc825e4
commit
6736cf8d20
5 changed files with 318 additions and 29 deletions
|
@ -275,6 +275,40 @@ class IntTestCases(unittest.TestCase):
|
|||
self.assertEqual((a+1).bit_length(), i+1)
|
||||
self.assertEqual((-a-1).bit_length(), i+1)
|
||||
|
||||
@unittest.skipUnless(float.__getformat__("double").startswith("IEEE"),
|
||||
"test requires IEEE 754 doubles")
|
||||
def test_float_conversion(self):
|
||||
# values exactly representable as floats
|
||||
exact_values = [-2, -1, 0, 1, 2, 2**52, 2**53-1, 2**53, 2**53+2,
|
||||
2**53+4, 2**54-4, 2**54-2, 2**63, -2**63, 2**64,
|
||||
-2**64, 10**20, 10**21, 10**22]
|
||||
for value in exact_values:
|
||||
self.assertEqual(int(float(int(value))), value)
|
||||
|
||||
# test round-half-to-even
|
||||
self.assertEqual(int(float(2**53+1)), 2**53)
|
||||
self.assertEqual(int(float(2**53+2)), 2**53+2)
|
||||
self.assertEqual(int(float(2**53+3)), 2**53+4)
|
||||
self.assertEqual(int(float(2**53+5)), 2**53+4)
|
||||
self.assertEqual(int(float(2**53+6)), 2**53+6)
|
||||
self.assertEqual(int(float(2**53+7)), 2**53+8)
|
||||
|
||||
self.assertEqual(int(float(-2**53-1)), -2**53)
|
||||
self.assertEqual(int(float(-2**53-2)), -2**53-2)
|
||||
self.assertEqual(int(float(-2**53-3)), -2**53-4)
|
||||
self.assertEqual(int(float(-2**53-5)), -2**53-4)
|
||||
self.assertEqual(int(float(-2**53-6)), -2**53-6)
|
||||
self.assertEqual(int(float(-2**53-7)), -2**53-8)
|
||||
|
||||
self.assertEqual(int(float(2**54-2)), 2**54-2)
|
||||
self.assertEqual(int(float(2**54-1)), 2**54)
|
||||
self.assertEqual(int(float(2**54+2)), 2**54)
|
||||
self.assertEqual(int(float(2**54+3)), 2**54+4)
|
||||
self.assertEqual(int(float(2**54+5)), 2**54+4)
|
||||
self.assertEqual(int(float(2**54+6)), 2**54+8)
|
||||
self.assertEqual(int(float(2**54+10)), 2**54+8)
|
||||
self.assertEqual(int(float(2**54+11)), 2**54+12)
|
||||
|
||||
def test_intconversion(self):
|
||||
# Test __int__()
|
||||
class ClassicMissingMethods:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue