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:
Mark Dickinson 2009-10-29 12:11:18 +00:00
parent 0c67312c5c
commit 6f3900163a
3 changed files with 43 additions and 10 deletions

View File

@ -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):

View File

@ -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

View File

@ -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.