mirror of https://github.com/python/cpython
Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
arguments with more digits than the current context precision. Bug reported by Stefan Krah.
This commit is contained in:
parent
0c67312c5c
commit
6f3900163a
|
@ -3439,8 +3439,10 @@ class Decimal(object):
|
|||
torot = int(other)
|
||||
rotdig = self._int
|
||||
topad = context.prec - len(rotdig)
|
||||
if topad:
|
||||
if topad > 0:
|
||||
rotdig = '0'*topad + rotdig
|
||||
elif topad < 0:
|
||||
rotdig = rotdig[-topad:]
|
||||
|
||||
# let's rotate!
|
||||
rotated = rotdig[torot:] + rotdig[:torot]
|
||||
|
@ -3493,22 +3495,22 @@ class Decimal(object):
|
|||
|
||||
# get values, pad if necessary
|
||||
torot = int(other)
|
||||
if not torot:
|
||||
return Decimal(self)
|
||||
rotdig = self._int
|
||||
topad = context.prec - len(rotdig)
|
||||
if topad:
|
||||
if topad > 0:
|
||||
rotdig = '0'*topad + rotdig
|
||||
elif topad < 0:
|
||||
rotdig = rotdig[-topad:]
|
||||
|
||||
# let's shift!
|
||||
if torot < 0:
|
||||
rotated = rotdig[:torot]
|
||||
shifted = rotdig[:torot]
|
||||
else:
|
||||
rotated = rotdig + '0'*torot
|
||||
rotated = rotated[-context.prec:]
|
||||
shifted = rotdig + '0'*torot
|
||||
shifted = shifted[-context.prec:]
|
||||
|
||||
return _dec_from_triple(self._sign,
|
||||
rotated.lstrip('0') or '0', self._exp)
|
||||
shifted.lstrip('0') or '0', self._exp)
|
||||
|
||||
# Support for pickling, copy, and deepcopy
|
||||
def __reduce__(self):
|
||||
|
|
|
@ -186,6 +186,35 @@ extr1507 comparetotal -sNaN45 -sNaN123 -> 1
|
|||
extr1510 comparetotal -sNaN63450748854172416 -sNaN911993 -> -1
|
||||
extr1511 comparetotmag NaN1222222222222 -NaN999999 -> 1
|
||||
|
||||
-- Issue #7233: rotate and scale should truncate an argument
|
||||
-- of length greater than the current precision.
|
||||
precision: 4
|
||||
extr1600 rotate 1234567 -5 -> NaN Invalid_operation
|
||||
extr1601 rotate 1234567 -4 -> 4567
|
||||
extr1602 rotate 1234567 -3 -> 5674
|
||||
extr1603 rotate 1234567 -2 -> 6745
|
||||
extr1604 rotate 1234567 -1 -> 7456
|
||||
extr1605 rotate 1234567 0 -> 4567
|
||||
extr1606 rotate 1234567 1 -> 5674
|
||||
extr1607 rotate 1234567 2 -> 6745
|
||||
extr1608 rotate 1234567 3 -> 7456
|
||||
extr1609 rotate 1234567 4 -> 4567
|
||||
extr1610 rotate 1234567 5 -> NaN Invalid_operation
|
||||
|
||||
extr1650 shift 1234567 -5 -> NaN Invalid_operation
|
||||
extr1651 shift 1234567 -4 -> 0
|
||||
extr1652 shift 1234567 -3 -> 4
|
||||
extr1653 shift 1234567 -2 -> 45
|
||||
extr1654 shift 1234567 -1 -> 456
|
||||
extr1655 shift 1234567 0 -> 4567
|
||||
extr1656 shift 1234567 1 -> 5670
|
||||
extr1657 shift 1234567 2 -> 6700
|
||||
extr1658 shift 1234567 3 -> 7000
|
||||
extr1659 shift 1234567 4 -> 0
|
||||
extr1660 shift 1234567 5 -> NaN Invalid_operation
|
||||
|
||||
|
||||
|
||||
-- Tests for the is_* boolean operations
|
||||
precision: 9
|
||||
maxExponent: 999
|
||||
|
|
|
@ -427,8 +427,10 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #7233: Fix a number of two-argument Decimal methods to make sure
|
||||
that they accept an int or long as the second argument.
|
||||
- Issue #7233: Fix a number of two-argument Decimal methods to make
|
||||
sure that they accept an int or long as the second argument. Also
|
||||
fix buggy handling of large arguments (those with coefficient longer
|
||||
than the current precision) in shift and rotate.
|
||||
|
||||
- Issue #4750: Store the basename of the original filename in the gzip FNAME
|
||||
header as required by RFC 1952.
|
||||
|
|
Loading…
Reference in New Issue