r57784 - in python/branches/decimal-branch/Lib: decimal.py test/test_decimal.py
Author: facundo.batista Date: Fri Aug 31 02:10:34 2007 New Revision: 57784 Modified: python/branches/decimal-branch/Lib/decimal.py python/branches/decimal-branch/Lib/test/test_decimal.py Log: Added function name translation for compare_signal and reduce/normalize in the test_decimal.py file. Fixed comparesig to make sure that diagnostic information attached to NaNs isn't lost. Added a call to _fix at the end of quantize; this takes care of any folddown that's necessary. And finally, make sure that normalize doesn't remove too many zeros. Thanks Mark Dickinson. Modified: python/branches/decimal-branch/Lib/decimal.py ============================================================================== --- python/branches/decimal-branch/Lib/decimal.py (original) +++ python/branches/decimal-branch/Lib/decimal.py Fri Aug 31 02:10:34 2007 @@ -2335,6 +2335,9 @@ def normalize(self, context=None): """Normalize- strip trailing 0s, change anything equal to 0 to 0e0""" + if context is None: + context = getcontext() + if self._is_special: ans = self._check_nans(context=context) if ans: @@ -2346,9 +2349,10 @@ if not dup: return Decimal( (dup._sign, (0,), 0) ) + exp_max = [context.Emax, context.Etop()][context._clamp] end = len(dup._int) exp = dup._exp - while dup._int[end-1] == 0: + while dup._int[end-1] == 0 and exp < exp_max: exp += 1 end -= 1 return Decimal( (dup._sign, dup._int[:end], exp) ) @@ -2359,6 +2363,8 @@ Similar to self._rescale(exp._exp) but with error checking. """ + if context is None: + context = getcontext() if self._is_special or exp._is_special: ans = self._check_nans(exp, context) if ans: @@ -2367,11 +2373,12 @@ if exp._isinfinity() or self._isinfinity(): if exp._isinfinity() and self._isinfinity(): return self # if both are inf, it is OK - if context is None: - context = getcontext() return context._raise_error(InvalidOperation, 'quantize with one INF') - return self._rescale(exp._exp, rounding, context, watchexp=0, fromQuantize=True) + ans = self._rescale(exp._exp, rounding, context, watchexp=0, fromQuantize=True) + # call to fix takes care of any necessary folddown + ans = ans._fix(context) + return ans def same_quantum(self, other): """Test whether self and other have the same exponent. @@ -2694,8 +2701,23 @@ It's pretty much like compare(), but all NaNs signal, with signaling NaNs taking precedence over quiet NaNs. """ - if self._isnan() or other._isnan(): - return context._raise_error(InvalidOperation) + if context is None: + context = getcontext() + + self_is_nan = self._isnan() + other_is_nan = other._isnan() + if self_is_nan == 2: + return context._raise_error(InvalidOperation, 'sNaN', + 1, self) + if other_is_nan == 2: + return context._raise_error(InvalidOperation, 'sNaN', + 1, other) + if self_is_nan: + return context._raise_error(InvalidOperation, 'NaN in compare_signal', + 1, self) + if other_is_nan: + return context._raise_error(InvalidOperation, 'NaN in compare_signal', + 1, other) return self.compare(other, context=context) def compare_total(self, other): Modified: python/branches/decimal-branch/Lib/test/test_decimal.py ============================================================================== --- python/branches/decimal-branch/Lib/test/test_decimal.py (original) +++ python/branches/decimal-branch/Lib/test/test_decimal.py Fri Aug 31 02:10:34 2007 @@ -110,6 +110,7 @@ 'squareroot':'sqrt', 'apply':'_apply', 'class':'number_class', + 'comparesig':'compare_signal', 'comparetotal':'compare_total', 'comparetotmag':'compare_total_mag', 'copyabs':'copy_abs', @@ -125,7 +126,7 @@ 'nextminus':'next_minus', 'nextplus':'next_plus', 'nexttoward':'next_toward', - 'trim':'normalize', + 'reduce':'normalize', } # For some operations (currently exp, ln, log10, power), the decNumber
participants (1)
-
facundo.batista