mirror of
https://github.com/python/cpython.git
synced 2025-10-11 17:32:49 +00:00
Fix a performance issue in Decimal.pow. Thanks Stefan Krah for finding this.
This commit is contained in:
parent
f48ea7c2a9
commit
a123631a5c
3 changed files with 25 additions and 6 deletions
|
@ -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
|
||||||
|
if ye < 0:
|
||||||
return None
|
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
|
||||||
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
|
||||||
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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue