Manually merge r68095,68186,68187,68188,68190 from 2.6 branch.
This commit is contained in:
parent
c63785db86
commit
fe427895b5
|
@ -1923,13 +1923,14 @@ suggest, so we trap :const:`Inexact` to signal a need for more precision:
|
|||
def float_to_decimal(f):
|
||||
"Convert a floating point number to a Decimal with no loss of information"
|
||||
n, d = f.as_integer_ratio()
|
||||
with localcontext() as ctx:
|
||||
ctx.traps[Inexact] = True
|
||||
while True:
|
||||
try:
|
||||
return Decimal(n) / Decimal(d)
|
||||
except Inexact:
|
||||
ctx.prec += 1
|
||||
numerator, denominator = Decimal(n), Decimal(d)
|
||||
ctx = Context(prec=60)
|
||||
result = ctx.divide(numerator, denominator)
|
||||
while ctx.flags[Inexact]:
|
||||
ctx.flags[Inexact] = False
|
||||
ctx.prec *= 2
|
||||
result = ctx.divide(numerator, denominator)
|
||||
return result
|
||||
|
||||
.. doctest::
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ class Fraction(Rational):
|
|||
|
||||
"""
|
||||
if isinstance(f, numbers.Integral):
|
||||
f = float(f)
|
||||
return cls(f)
|
||||
elif not isinstance(f, float):
|
||||
raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
|
||||
(cls.__name__, f, type(f).__name__))
|
||||
|
|
|
@ -354,6 +354,10 @@ def nsmallest(n, iterable, key=None):
|
|||
|
||||
Equivalent to: sorted(iterable, key=key)[:n]
|
||||
"""
|
||||
if key is None:
|
||||
it = izip(iterable, count()) # decorate
|
||||
result = _nsmallest(n, it)
|
||||
return map(itemgetter(0), result) # undecorate
|
||||
in1, in2 = tee(iterable)
|
||||
it = izip(imap(key, in1), count(), in2) # decorate
|
||||
result = _nsmallest(n, it)
|
||||
|
@ -365,6 +369,10 @@ def nlargest(n, iterable, key=None):
|
|||
|
||||
Equivalent to: sorted(iterable, key=key, reverse=True)[:n]
|
||||
"""
|
||||
if key is None:
|
||||
it = izip(iterable, imap(neg, count())) # decorate
|
||||
result = _nlargest(n, it)
|
||||
return map(itemgetter(0), result) # undecorate
|
||||
in1, in2 = tee(iterable)
|
||||
it = izip(imap(key, in1), imap(neg, count()), in2) # decorate
|
||||
result = _nlargest(n, it)
|
||||
|
|
|
@ -139,6 +139,8 @@ class FractionTest(unittest.TestCase):
|
|||
def testFromFloat(self):
|
||||
self.assertRaises(TypeError, F.from_float, 3+4j)
|
||||
self.assertEquals((10, 1), _components(F.from_float(10)))
|
||||
bigint = 1234567890123456789
|
||||
self.assertEquals((bigint, 1), _components(F.from_float(bigint)))
|
||||
self.assertEquals((0, 1), _components(F.from_float(-0.0)))
|
||||
self.assertEquals((10, 1), _components(F.from_float(10.0)))
|
||||
self.assertEquals((-5, 2), _components(F.from_float(-2.5)))
|
||||
|
|
|
@ -127,6 +127,12 @@ Library
|
|||
- Issue #4646: distutils was choking on empty options arg in the setup
|
||||
function. Original patch by Thomas Heller.
|
||||
|
||||
- Fractions.from_float() no longer loses precision for integers too big to
|
||||
cast as floats.
|
||||
|
||||
- Issue 4790: The nsmallest() and nlargest() functions in the heapq module
|
||||
did unnecessary work in the common case where no key function was specified.
|
||||
|
||||
- Issue #3767: Convert Tk object to string in tkColorChooser.
|
||||
|
||||
- Issue #3248: Allow placing ScrolledText in a PanedWindow.
|
||||
|
|
Loading…
Reference in New Issue