cpython: 91d7fadac271 (original) (raw)
Mercurial > cpython
changeset 90152:91d7fadac271
Issue #21136: Avoid unnecessary normalization in Fractions resulting from power and other operations. [#21136]
Mark Dickinson dickinsm@gmail.com | |
---|---|
date | Sat, 05 Apr 2014 09:29:00 +0100 |
parents | 087cdbf49e80 |
children | 9acc8196a82c |
files | Lib/fractions.py Lib/test/test_fractions.py Misc/NEWS |
diffstat | 3 files changed, 19 insertions(+), 10 deletions(-)[+] [-] Lib/fractions.py 23 Lib/test/test_fractions.py 3 Misc/NEWS 3 |
line wrap: on
line diff
--- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -70,7 +70,7 @@ class Fraction(numbers.Rational): slots = ('_numerator', '_denominator') # We're immutable, so use new not init
Takes a string like '3/2' or '1.5', another Rational instance, a @@ -165,9 +165,12 @@ class Fraction(numbers.Rational): if denominator == 0: raise ZeroDivisionError('Fraction(%s, 0)' % numerator)
g = gcd(numerator, denominator)[](#l1.16)
self._numerator = numerator // g[](#l1.17)
self._denominator = denominator // g[](#l1.18)
if _normalize:[](#l1.19)
g = gcd(numerator, denominator)[](#l1.20)
numerator //= g[](#l1.21)
denominator //= g[](#l1.22)
self._numerator = numerator[](#l1.23)
self._denominator = denominator[](#l1.24) return self[](#l1.25)
@classmethod @@ -453,10 +456,12 @@ class Fraction(numbers.Rational): power = b.numerator if power >= 0: return Fraction(a._numerator ** power,
a._denominator ** power)[](#l1.32)
a._denominator ** power,[](#l1.33)
_normalize=False)[](#l1.34) else:[](#l1.35) return Fraction(a._denominator ** -power,[](#l1.36)
a._numerator ** -power)[](#l1.37)
a._numerator ** -power,[](#l1.38)
_normalize=False)[](#l1.39) else:[](#l1.40) # A fractional power will generally produce an[](#l1.41) # irrational number.[](#l1.42)
@@ -480,15 +485,15 @@ class Fraction(numbers.Rational): def pos(a): """+a: Coerces a subclass instance to Fraction"""
return Fraction(a._numerator, a._denominator)[](#l1.47)
return Fraction(a._numerator, a._denominator, _normalize=False)[](#l1.48)
return Fraction(-a._numerator, a._denominator)[](#l1.52)
return Fraction(-a._numerator, a._denominator, _normalize=False)[](#l1.53)
return Fraction(abs(a._numerator), a._denominator)[](#l1.57)
return Fraction(abs(a._numerator), a._denominator, _normalize=False)[](#l1.58)
--- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -330,7 +330,6 @@ class FractionTest(unittest.TestCase): self.assertTypedEquals(F(-2, 10), round(F(-15, 100), 1)) self.assertTypedEquals(F(-2, 10), round(F(-25, 100), 1)) - def testArithmetic(self): self.assertEqual(F(1, 2), F(1, 10) + F(2, 5)) self.assertEqual(F(-3, 10), F(1, 10) - F(2, 5)) @@ -402,6 +401,8 @@ class FractionTest(unittest.TestCase): self.assertTypedEquals(2.0 , 4 ** F(1, 2)) self.assertTypedEquals(0.25, 2.0 ** F(-2, 1)) self.assertTypedEquals(1.0 + 0j, (1.0 + 0j) ** F(1, 10))
self.assertRaises(ZeroDivisionError, operator.pow,[](#l2.15)
F(0, 1), -2)[](#l2.16)
def testMixingWithDecimal(self): # Decimal refuses mixed arithmetic (but not mixed comparisons)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,6 +29,9 @@ Core and Builtins Library ------- +- Issue #21136: Avoid unnecessary normalization of Fractions resulting from