]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #27539: Fix unnormalised Fraction.__pow__ result for negative exponent and...
authorMark Dickinson <dickinsm@gmail.com>
Mon, 22 Aug 2016 09:50:53 +0000 (10:50 +0100)
committerMark Dickinson <dickinsm@gmail.com>
Mon, 22 Aug 2016 09:50:53 +0000 (10:50 +0100)
Lib/fractions.py
Lib/test/test_fractions.py
Misc/ACKS
Misc/NEWS

index 60b072880703c246005be2c48e17046e71d84e47..9aabab3e3ba983f867d208e27e69d7ed22a8b13a 100644 (file)
@@ -484,10 +484,14 @@ class Fraction(numbers.Rational):
                     return Fraction(a._numerator ** power,
                                     a._denominator ** power,
                                     _normalize=False)
-                else:
+                elif a._numerator >= 0:
                     return Fraction(a._denominator ** -power,
                                     a._numerator ** -power,
                                     _normalize=False)
+                else:
+                    return Fraction((-a._denominator) ** -power,
+                                    (-a._numerator) ** -power,
+                                    _normalize=False)
             else:
                 # A fractional power will generally produce an
                 # irrational number.
index 16998522160b960c72cecc2b985c7c4ea6e3aeaa..9df4a54fcbdedd43ef579a781c6ef03d212622c5 100644 (file)
@@ -356,6 +356,19 @@ class FractionTest(unittest.TestCase):
         z = pow(F(-1), F(1, 2))
         self.assertAlmostEqual(z.real, 0)
         self.assertEqual(z.imag, 1)
+        # Regression test for #27539.
+        p = F(-1, 2) ** 0
+        self.assertEqual(p, F(1, 1))
+        self.assertEqual(p.numerator, 1)
+        self.assertEqual(p.denominator, 1)
+        p = F(-1, 2) ** -1
+        self.assertEqual(p, F(-2, 1))
+        self.assertEqual(p.numerator, -2)
+        self.assertEqual(p.denominator, 1)
+        p = F(-1, 2) ** -2
+        self.assertEqual(p, F(4, 1))
+        self.assertEqual(p.numerator, 4)
+        self.assertEqual(p.denominator, 1)
 
     def testMixedArithmetic(self):
         self.assertTypedEquals(F(11, 10), F(1, 10) + 1)
index 51c8d101d02d58f2e984a462f037fc8180fc4be6..1c9363aab671e9d61b48b556918ca9783686576b 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -217,6 +217,7 @@ Katherine Busch
 Ralph Butler
 Laurent De Buyst
 Zach Byrne
+Vedran Čačić
 Nicolas Cadou
 Jp Calderone
 Arnaud Calmettes
index 54cae1da9fb5affa74b494bc951dc890fc5278b8..7530624751b6be3a0f4d9b46df17ce8be3d6b8af 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -46,6 +46,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #27539: Fix unnormalised ``Fraction.__pow__`` result in the case
+  of negative exponent and negative base.
+
 - Issue #21718: cursor.description is now available for queries using CTEs.
 
 - Issue #2466: posixpath.ismount now correctly recognizes mount points which