Commit a123631a authored by Mark Dickinson's avatar Mark Dickinson

Fix a performance issue in Decimal.pow. Thanks Stefan Krah for finding this.

parent f48ea7c2
...@@ -2047,12 +2047,14 @@ class Decimal(object): ...@@ -2047,12 +2047,14 @@ class Decimal(object):
# case where xc == 1: result is 10**(xe*y), with xe*y # case where xc == 1: result is 10**(xe*y), with xe*y
# required to be an integer # required to be an integer
if xc == 1: if xc == 1:
if ye >= 0: xe *= yc
exponent = xe*yc*10**ye # result is now 10**(xe * 10**ye); xe * 10**ye must be integral
else: while xe % 10 == 0:
exponent, remainder = divmod(xe*yc, 10**-ye) xe //= 10
if remainder: ye += 1
return None if ye < 0:
return None
exponent = xe * 10**ye
if y.sign == 1: if y.sign == 1:
exponent = -exponent exponent = -exponent
# if other is a nonnegative integer, use ideal exponent # if other is a nonnegative integer, use ideal exponent
......
...@@ -213,7 +213,20 @@ extr1658 shift 1234567 3 -> 7000 ...@@ -213,7 +213,20 @@ extr1658 shift 1234567 3 -> 7000
extr1659 shift 1234567 4 -> 0 extr1659 shift 1234567 4 -> 0
extr1660 shift 1234567 5 -> NaN Invalid_operation extr1660 shift 1234567 5 -> NaN Invalid_operation
-- Cases where the power function was impossibly slow to determine that the
-- result is inexact. Thanks Stefan Krah for identifying this problem.
precision: 16
maxExponent: 999999999
minExponent: -999999999
extr1700 power 10 1e-999999999 -> 1.000000000000000 Inexact Rounded
extr1701 power 100.0 -557.71e-742888888 -> 1.000000000000000 Inexact Rounded
extr1702 power 10 1e-100 -> 1.000000000000000 Inexact Rounded
-- A couple of interesting exact cases for power. Note that the specification
-- requires these to be reported as Inexact.
extr1710 power 1e375 56e-3 -> 1.000000000000000E+21 Inexact Rounded
extr1711 power 10000 0.75 -> 1000.000000000000 Inexact Rounded
extr1712 power 1e-24 0.875 -> 1.000000000000000E-21 Inexact Rounded
-- Tests for the is_* boolean operations -- Tests for the is_* boolean operations
precision: 9 precision: 9
......
...@@ -470,6 +470,10 @@ C-API ...@@ -470,6 +470,10 @@ C-API
Library Library
------- -------
- Fix extreme speed issue in Decimal.pow when the base is an exact
power of 10 and the exponent is tiny (for example,
Decimal(10) ** Decimal('1e-999999999')).
- Issue #9186: Fix math.log1p(-1.0) to raise ValueError, not OverflowError. - Issue #9186: Fix math.log1p(-1.0) to raise ValueError, not OverflowError.
- Issue #9130: Fix validation of relative imports in parser module. - Issue #9130: Fix validation of relative imports in parser module.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment