[Python-checkins] python/nondist/sandbox/decimal Decimal.py, 1.21, 1.22

facundobatista at users.sourceforge.net facundobatista at users.sourceforge.net
Thu Jun 24 21:29:32 EDT 2004


Update of /cvsroot/python/python/nondist/sandbox/decimal
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10118
Modified Files:
	Decimal.py 
Log Message:
Made near immutable. Lot of clean-ups.
Index: Decimal.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/decimal/Decimal.py,v
retrieving revision 1.21
retrieving revision 1.22
diff -C2 -d -r1.21 -r1.22
*** Decimal.py	21 Jun 2004 21:50:51 -0000	1.21
--- Decimal.py	25 Jun 2004 01:29:29 -0000	1.22
***************
*** 96,99 ****
--- 96,101 ----
 
 # facundobatista:
+ # 0.8.2 2004年06月24日 Lot of small clean-ups from Raymond Hettinger.
+ # 0.8.1 2004年06月23日 Complies with immutability-near as discussed in c.l.py.
 # 0.8.0 2004年06月21日 Using the updated Spec (and complies with new test cases) from
 # Cowlishaw. Deprecated trim and rescale. Changed __str__ and 
***************
*** 131,135 ****
 import copy
 import math
- import time
 from operator import xor
 
--- 133,136 ----
***************
*** 351,360 ****
 return Infsign[sign]
 if sign == 0:
! if context.rounding in (ROUND_CEILING,):
 return Infsign[sign]
 return Decimal((sign, (9,)*context.prec,
 context.Emax-context.prec+1))
 if sign == 1:
! if context.rounding in (ROUND_FLOOR,):
 return Infsign[sign]
 return Decimal( (sign, (9,)*context.prec,
--- 352,361 ----
 return Infsign[sign]
 if sign == 0:
! if context.rounding == ROUND_CEILING:
 return Infsign[sign]
 return Decimal((sign, (9,)*context.prec,
 context.Emax-context.prec+1))
 if sign == 1:
! if context.rounding == ROUND_FLOOR:
 return Infsign[sign]
 return Decimal( (sign, (9,)*context.prec,
***************
*** 441,445 ****
 self._exp = 'N' #sNaN
 self._sign = sign
! self._int = tuple(map(int, tuple(diag))) #Diagnostic info
 return
 self._convertString(value, context)
--- 442,446 ----
 self._exp = 'N' #sNaN
 self._sign = sign
! self._int = tuple(map(int, diag)) #Diagnostic info
 return
 self._convertString(value, context)
***************
*** 489,493 ****
 return
 
! raise TypeError("Can't convert " + `value`)
 
 def from_float(cls, value, positions=None):
--- 490,494 ----
 return
 
! raise TypeError("Can't convert %r" % value)
 
 def from_float(cls, value, positions=None):
***************
*** 818,822 ****
 else:
 sign = 1
! if context._rounding_decision in (ALWAYS_ROUND,):
 return Decimal((sign, self._int, self._exp))._fix(context=context)
 return Decimal( (sign, self._int, self._exp))
--- 819,823 ----
 else:
 sign = 1
! if context._rounding_decision == ALWAYS_ROUND:
 return Decimal((sign, self._int, self._exp))._fix(context=context)
 return Decimal( (sign, self._int, self._exp))
***************
*** 838,842 ****
 sign = 0
 
! if context._rounding_decision in (ALWAYS_ROUND,):
 ans = self._fix(context=context)
 else:
--- 839,843 ----
 sign = 0
 
! if context._rounding_decision == ALWAYS_ROUND:
 ans = self._fix(context=context)
 else:
***************
*** 888,892 ****
 return Decimal(other) #Can't both be infinity here
 
! shouldround = context._rounding_decision in (ALWAYS_ROUND,)
 
 exp = min(self._exp, other._exp)
--- 889,893 ----
 return Decimal(other) #Can't both be infinity here
 
! shouldround = context._rounding_decision == ALWAYS_ROUND
 
 exp = min(self._exp, other._exp)
***************
*** 1030,1034 ****
 ans = Decimal((self._sign, L, self._exp))
 
! if round and context._rounding_decision in (ALWAYS_ROUND,):
 ans = ans._fix(context=context)
 return ans
--- 1031,1035 ----
 ans = Decimal((self._sign, L, self._exp))
 
! if round and context._rounding_decision == ALWAYS_ROUND:
 ans = ans._fix(context=context)
 return ans
***************
*** 1059,1063 ****
 
 resultexp = self._exp + other._exp
! shouldround = context._rounding_decision in (ALWAYS_ROUND,)
 
 # Special case for multiplying by zero
--- 1060,1064 ----
 
 resultexp = self._exp + other._exp
! shouldround = context._rounding_decision == ALWAYS_ROUND
 
 # Special case for multiplying by zero
***************
*** 1090,1099 ****
 
 accumulator = [0]*(len(self._int) + len(other._int))
! for i in range(len(op2)):
 if op2[i] == 0:
 continue
 mult = op2[i]
 carry = 0
! for j in range(len(op1)):
 carry, accumulator[i+j] = divmod( mult * op1[j] + carry
 + accumulator[i+j], 10)
--- 1091,1100 ----
 
 accumulator = [0]*(len(self._int) + len(other._int))
! for i in xrange(len(op2)):
 if op2[i] == 0:
 continue
 mult = op2[i]
 carry = 0
! for j in xrange(len(op1)):
 carry, accumulator[i+j] = divmod( mult * op1[j] + carry
 + accumulator[i+j], 10)
***************
*** 1196,1200 ****
 #OK, so neither = 0, INF
 
! shouldround = context._rounding_decision in (ALWAYS_ROUND,)
 
 #If we're dividing into ints, and self < other, stop.
--- 1197,1201 ----
 #OK, so neither = 0, INF
 
! shouldround = context._rounding_decision == ALWAYS_ROUND
 
 #If we're dividing into ints, and self < other, stop.
***************
*** 1748,1752 ****
 mul = Decimal(1).__div__(mul, context=context)
 
! shouldround = context._rounding_decision in (ALWAYS_ROUND,)
 
 spot = 1
--- 1749,1753 ----
 mul = Decimal(1).__div__(mul, context=context)
 
! shouldround = context._rounding_decision == ALWAYS_ROUND
 
 spot = 1
***************
*** 1825,1835 ****
 """
 if self._isnan() or other._isnan():
! if self._isnan() and other._isnan():
! return True
! return False
 if self._isinfinity() or other._isinfinity():
! if self._isinfinity() and other._isinfinity():
! return True
! return False
 return self._exp == other._exp
 
--- 1826,1832 ----
 """
 if self._isnan() or other._isnan():
! return self._isnan() and other._isnan() and True
 if self._isinfinity() or other._isinfinity():
! return self._isinfinity() and other._isinfinity() and True
 return self._exp == other._exp
 
***************
*** 2044,2048 ****
 if self < other:
 ans = other
! shouldround = context._rounding_decision in (ALWAYS_ROUND,)
 if shouldround:
 ans = ans._fix(context=context)
--- 2041,2045 ----
 if self < other:
 ans = other
! shouldround = context._rounding_decision == ALWAYS_ROUND
 if shouldround:
 ans = ans._fix(context=context)
***************
*** 2068,2072 ****
 ans = other
 
! if context._rounding_decision in (ALWAYS_ROUND,):
 ans = ans._fix(context=context)
 
--- 2065,2069 ----
 ans = other
 
! if context._rounding_decision == ALWAYS_ROUND:
 ans = ans._fix(context=context)
 
***************
*** 2078,2084 ****
 return True
 rest = self._int[self._exp:]
! if rest == (0,)*len(rest):
! return True
! return False
 
 def _iseven(self):
--- 2075,2079 ----
 return True
 rest = self._int[self._exp:]
! return rest == (0,)*len(rest)
 
 def _iseven(self):
***************
*** 2096,2099 ****
--- 2091,2105 ----
 return 0
 
+ #properties to immutability-near feature
+ def _get_sign(self):
+ return self._sign
+ def _get_int(self):
+ return self._int
+ def _get_exp(self):
+ return self._exp
+ sign = property(_get_sign)
+ int = property(_get_int)
+ exp = property(_get_exp)
+ 
 
 # get rounding method function:
***************
*** 2309,2313 ****
 
 def __repr__(self):
! return "(" + `self.sign` + ", " + `self.int` + ", " + `self.exp` + ")"
 
 __str__ = __repr__
--- 2315,2319 ----
 
 def __repr__(self):
! return "(%r, %r, %r)" % (self.sign, self.int, self.exp)
 
 __str__ = __repr__
***************
*** 2327,2332 ****
 def __cmp__(self, other):
 if self.exp != other.exp:
! raise ValueError("Operands not normalized: " + `self` +
! ", " + `other`)
 if self.sign != other.sign:
 if self.sign == -1:
--- 2333,2337 ----
 def __cmp__(self, other):
 if self.exp != other.exp:
! raise ValueError("Operands not normalized: %r, %r" % (self, other))
 if self.sign != other.sign:
 if self.sign == -1:
***************
*** 2344,2348 ****
 if len(int1) < len(int2):
 return direction * -1
! for i in range(len(int1)):
 if int1[i] > int2[i]:
 return direction * 1
--- 2349,2353 ----
 if len(int1) < len(int2):
 return direction * -1
! for i in xrange(len(int1)):
 if int1[i] > int2[i]:
 return direction * 1
***************
*** 2374,2378 ****
 
 carry = 0
! for x in range(len(list)):
 self.int[x] -= list[x] + carry
 if self.int[x] < 0:
--- 2379,2383 ----
 
 carry = 0
! for x in xrange(len(list)):
 self.int[x] -= list[x] + carry
 if self.int[x] < 0:
***************
*** 2631,2635 ****
 m = _parser(s)
 if m is None:
! raise ValueError("Can't parse as number: " + `s`)
 
 if m.group('sign') == "-":
--- 2636,2640 ----
 m = _parser(s)
 if m is None:
! raise ValueError("Can't parse as number: %r" % s)
 
 if m.group('sign') == "-":
***************
*** 2653,2663 ****
 fracpart = ""
 
! nfrac = len(fracpart)
! exp = exp - nfrac
 
 mantissa = intpart + fracpart
! tmp = []
! for digit in mantissa:
! tmp.append(int(digit))
 backup = tmp
 while tmp and tmp[0] == 0:
--- 2658,2665 ----
 fracpart = ""
 
! exp -= len(fracpart)
 
 mantissa = intpart + fracpart
! tmp = map(int, mantissa)
 backup = tmp
 while tmp and tmp[0] == 0:
***************
*** 2709,2715 ****
 assert digit >> CHUNK == 0
 top = (top << CHUNK) | digit
! f = f - digit
 assert 0.0 <= f < 1.0
! e = e - CHUNK
 
 assert top > 0
--- 2711,2717 ----
 assert digit >> CHUNK == 0
 top = (top << CHUNK) | digit
! f -= digit
 assert 0.0 <= f < 1.0
! e -= CHUNK
 
 assert top > 0
***************
*** 2719,2728 ****
 # be removed without changing the result).
 while e < 0 and top & 1 == 0:
! top = top >> 1
! e = e + 1
 
 # Transform this into an equal value top' * 10**e'.
 if e > 0:
! top = top << e
 e = 0
 elif e < 0:
--- 2721,2730 ----
 # be removed without changing the result).
 while e < 0 and top & 1 == 0:
! top >>= 1
! e += 1
 
 # Transform this into an equal value top' * 10**e'.
 if e > 0:
! top <<= e
 e = 0
 elif e < 0:
***************
*** 2738,2742 ****
 break
 top = newtop
! e = e + 1
 
 return "%s%se%d" % (sign, str(top), e)
--- 2740,2744 ----
 break
 top = newtop
! e += 1
 
 return "%s%se%d" % (sign, str(top), e)


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /