[Python-checkins] r75945 - in python/trunk: Lib/decimal.py Lib/test/decimaltestdata/extra.decTest Misc/NEWS
mark.dickinson
python-checkins at python.org
Thu Oct 29 13:11:19 CET 2009
Author: mark.dickinson
Date: Thu Oct 29 13:11:18 2009
New Revision: 75945
Log:
Issue #7233: Fix Decimal.shift and Decimal.rotate methods for
arguments with more digits than the current context precision.
Bug reported by Stefan Krah.
Modified:
python/trunk/Lib/decimal.py
python/trunk/Lib/test/decimaltestdata/extra.decTest
python/trunk/Misc/NEWS
Modified: python/trunk/Lib/decimal.py
==============================================================================
--- python/trunk/Lib/decimal.py (original)
+++ python/trunk/Lib/decimal.py Thu Oct 29 13:11:18 2009
@@ -3439,8 +3439,10 @@
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 @@
# 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):
Modified: python/trunk/Lib/test/decimaltestdata/extra.decTest
==============================================================================
--- python/trunk/Lib/test/decimaltestdata/extra.decTest (original)
+++ python/trunk/Lib/test/decimaltestdata/extra.decTest Thu Oct 29 13:11:18 2009
@@ -186,6 +186,35 @@
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
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Thu Oct 29 13:11:18 2009
@@ -427,8 +427,10 @@
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.
More information about the Python-checkins
mailing list