[Python-checkins] cpython (merge 3.5 -> default): Issue #27539: Merge from 3.5.

mark.dickinson python-checkins at python.org
Mon Aug 22 05:56:19 EDT 2016


https://hg.python.org/cpython/rev/902e82f71880
changeset:   102834:902e82f71880
parent:      102832:485d7c341386
parent:      102833:7eea5b87f5fa
user:        Mark Dickinson <dickinsm at gmail.com>
date:        Mon Aug 22 10:56:06 2016 +0100
summary:
  Issue #27539: Merge from 3.5.

files:
  Lib/fractions.py           |   6 +++++-
  Lib/test/test_fractions.py |  13 +++++++++++++
  Misc/ACKS                  |   1 +
  Misc/NEWS                  |   3 +++
  4 files changed, 22 insertions(+), 1 deletions(-)


diff --git a/Lib/fractions.py b/Lib/fractions.py
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -460,10 +460,14 @@
                     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.
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -356,6 +356,19 @@
         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)
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -218,6 +218,7 @@
 Ralph Butler
 Laurent De Buyst
 Zach Byrne
+Vedran Čačić
 Nicolas Cadou
 Jp Calderone
 Arnaud Calmettes
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -38,6 +38,9 @@
 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 #27819: In distutils sdists, simply produce the "gztar" (gzipped tar

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list