diff options
author | Raymond Hettinger <python@rcn.com> | 2004-10-09 07:10:44 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2004-10-09 07:10:44 (GMT) |
commit | dab988dd23e6328dadfe8408cd96abf4b017380d (patch) | |
tree | ac3024d780c81cc918458d6da265adb45c604551 /Lib/decimal.py | |
parent | 7a8ce5afcc6e85f00b1bb5c4ca77274ce1c5f6d9 (diff) | |
download | cpython-dab988dd23e6328dadfe8408cd96abf4b017380d.zip cpython-dab988dd23e6328dadfe8408cd96abf4b017380d.tar.gz cpython-dab988dd23e6328dadfe8408cd96abf4b017380d.tar.bz2 |
SF patch #1043218
Simplify internal calls and logic for _fix() and _fixexponents().
(Contributed by Facundo Batista.)
Diffstat (limited to 'Lib/decimal.py')
-rw-r--r-- | Lib/decimal.py | 91 |
1 files changed, 39 insertions, 52 deletions
diff --git a/Lib/decimal.py b/Lib/decimal.py index b7c893d..0df046d 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -459,7 +459,7 @@ class Decimal(object): # (-1)**_sign * _int * 10**_exp # Special values are signified by _is_special == True - # We're immutable, so use _new__ not __init__ + # We're immutable, so use __new__ not __init__ def __new__(cls, value="0", context=None): """Create a decimal point instance. @@ -851,7 +851,7 @@ class Decimal(object): if context is None: context = getcontext() if context._rounding_decision == ALWAYS_ROUND: - return Decimal((sign, self._int, self._exp))._fix(context=context) + return Decimal((sign, self._int, self._exp))._fix(context) return Decimal( (sign, self._int, self._exp)) def __pos__(self, context=None): @@ -873,7 +873,7 @@ class Decimal(object): context = getcontext() if context._rounding_decision == ALWAYS_ROUND: - ans = self._fix(context=context) + ans = self._fix(context) else: ans = Decimal(self) ans._sign = sign @@ -943,14 +943,14 @@ class Decimal(object): exp = other._exp - context.prec-1 ans = other._rescale(exp, watchexp=0, context=context) if shouldround: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans if not other: if exp < self._exp - context.prec-1: exp = self._exp - context.prec-1 ans = self._rescale(exp, watchexp=0, context=context) if shouldround: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans op1 = _WorkRep(self) @@ -991,7 +991,7 @@ class Decimal(object): result.exp = op1.exp ans = Decimal(result) if shouldround: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans __radd__ = __add__ @@ -1052,7 +1052,7 @@ class Decimal(object): if context is None: context = getcontext() if round and context._rounding_decision == ALWAYS_ROUND: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans def __mul__(self, other, context=None): @@ -1090,19 +1090,19 @@ class Decimal(object): ans = Decimal((resultsign, (0,), resultexp)) if shouldround: #Fixing in case the exponent is out of bounds - ans = ans._fix(context=context) + ans = ans._fix(context) return ans # Special case for multiplying by power of 10 if self._int == (1,): ans = Decimal((resultsign, other._int, resultexp)) if shouldround: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans if other._int == (1,): ans = Decimal((resultsign, self._int, resultexp)) if shouldround: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans op1 = _WorkRep(self) @@ -1110,7 +1110,7 @@ class Decimal(object): ans = Decimal( (resultsign, map(int, str(op1.int * op2.int)), resultexp)) if shouldround: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans __rmul__ = __mul__ @@ -1209,7 +1209,7 @@ class Decimal(object): exp = min(self._exp, other._exp) ans2 = self._rescale(exp, context=context, watchexp=0) if shouldround: - ans2 = ans2._fix(context=context) + ans2 = ans2._fix(context) return (Decimal( (sign, (0,), 0) ), ans2) @@ -1246,7 +1246,7 @@ class Decimal(object): watchexp=0) context._regard_flags(*frozen) if shouldround: - otherside = otherside._fix(context=context) + otherside = otherside._fix(context) return (Decimal(res), otherside) if op1.int == 0 and adjust >= 0 and not divmod: @@ -1286,7 +1286,7 @@ class Decimal(object): ans = Decimal(res) if shouldround: - ans = ans._fix(context=context) + ans = ans._fix(context) return ans def __rdiv__(self, other, context=None): @@ -1371,7 +1371,7 @@ class Decimal(object): r._sign, comparison._sign = s1, s2 #Get flags now self.__divmod__(other, context=context) - return r._fix(context=context) + return r._fix(context) r._sign, comparison._sign = s1, s2 rounding = context._set_rounding_decision(NEVER_ROUND) @@ -1402,7 +1402,7 @@ class Decimal(object): else: r._sign, comparison._sign = s1, s2 - return r._fix(context=context) + return r._fix(context) def __floordiv__(self, other, context=None): """self // other""" @@ -1441,44 +1441,31 @@ class Decimal(object): """ return long(self.__int__()) - def _fix(self, prec=None, rounding=None, folddown=None, context=None): + def _fix(self, context): """Round if it is necessary to keep self within prec precision. Rounds and fixes the exponent. Does not raise on a sNaN. Arguments: self - Decimal instance - prec - precision to which to round. By default, the context decides. - rounding - Rounding method. By default, the context decides. - folddown - Fold down high elements, by default context._clamp context - context used. """ if self._is_special: return self if context is None: context = getcontext() - if prec is None: - prec = context.prec - ans = Decimal(self) - ans = ans._fixexponents(prec, rounding, folddown=folddown, - context=context) + prec = context.prec + ans = self._fixexponents(prec, context) if len(ans._int) > prec: - ans = ans._round(prec, rounding, context=context) - ans = ans._fixexponents(prec, rounding, folddown=folddown, - context=context) + ans = ans._round(prec, context=context) + ans = ans._fixexponents(prec, context) return ans - def _fixexponents(self, prec=None, rounding=None, folddown=None, - context=None): - """Fix the exponents and return a copy with the exponent in bounds.""" - if self._is_special: - return self - if context is None: - context = getcontext() - if prec is None: - prec = context.prec - if folddown is None: - folddown = context._clamp + def _fixexponents(self, prec, context): + """Fix the exponents and return a copy with the exponent in bounds. + Only call if known to not be a special value. + """ + folddown = context._clamp Emin = context.Emin ans = Decimal(self) ans_adjusted = ans.adjusted() @@ -1756,7 +1743,7 @@ class Decimal(object): context.prec = firstprec if shouldround: - return val._fix(context=context) + return val._fix(context) return val def __rpow__(self, other, context=None): @@ -1772,7 +1759,7 @@ class Decimal(object): if ans: return ans - dup = self._fix(context=context) + dup = self._fix(context) if dup._isinfinity(): return dup @@ -1786,7 +1773,7 @@ class Decimal(object): return Decimal( (dup._sign, dup._int[:end], exp) ) - def quantize(self, exp, rounding = None, context=None, watchexp = 1): + def quantize(self, exp, rounding=None, context=None, watchexp=1): """Quantize self so its exponent is the same as that of exp. Similar to self._rescale(exp._exp) but with error checking. @@ -1817,7 +1804,7 @@ class Decimal(object): return self._isinfinity() and other._isinfinity() and True return self._exp == other._exp - def _rescale(self, exp, rounding = None, context=None, watchexp = 1): + def _rescale(self, exp, rounding=None, context=None, watchexp=1): """Rescales so that the exponent is exp. exp = exp to scale to (an integer) @@ -1848,13 +1835,13 @@ class Decimal(object): return ans diff = self._exp - exp - digits = len(self._int)+diff + digits = len(self._int) + diff if watchexp and digits > context.prec: return context._raise_error(InvalidOperation, 'Rescale > prec') tmp = Decimal(self) - tmp._int = (0,)+tmp._int + tmp._int = (0,) + tmp._int digits += 1 prevexact = context.flags[Inexact] @@ -1875,7 +1862,7 @@ class Decimal(object): return context._raise_error(InvalidOperation, 'rescale(a, INF)') return tmp - def to_integral(self, rounding = None, context=None): + def to_integral(self, rounding=None, context=None): """Rounds to the nearest integer, without raising inexact, rounded.""" if self._is_special: ans = self._check_nans(context=context) @@ -1991,7 +1978,7 @@ class Decimal(object): context.prec = firstprec context.rounding = rounding - ans = ans._fix(context=context) + ans = ans._fix(context) rounding = context._set_rounding_decision(NEVER_ROUND) if not ans.__mul__(ans, context=context) == self: @@ -2011,7 +1998,7 @@ class Decimal(object): context._regard_flags(flags) context.Emax, context.Emin = Emax, Emin - return ans._fix(context=context) + return ans._fix(context) def max(self, other, context=None): """Returns the larger value. @@ -2057,7 +2044,7 @@ class Decimal(object): if context is None: context = getcontext() context._rounding_decision == ALWAYS_ROUND - return ans._fix(context=context) + return ans._fix(context) def min(self, other, context=None): """Returns the smaller value. @@ -2103,7 +2090,7 @@ class Decimal(object): if context is None: context = getcontext() context._rounding_decision == ALWAYS_ROUND - return ans._fix(context=context) + return ans._fix(context) def _isinteger(self): """Returns whether self is an integer""" @@ -2316,7 +2303,7 @@ class Context(object): def create_decimal(self, num='0'): """Creates a new Decimal instance but using self as context.""" d = Decimal(num, context=self) - return d._fix(context=self) + return d._fix(self) #Methods def abs(self, a): @@ -2348,7 +2335,7 @@ class Context(object): return a.__add__(b, context=self) def _apply(self, a): - return str(a._fix(context=self)) + return str(a._fix(self)) def compare(self, a, b): """Compares values numerically. |