[Python-checkins] python/nondist/sandbox/decimal Decimal.py, 1.34, 1.35

rhettinger at users.sourceforge.net rhettinger at users.sourceforge.net
Wed Jun 30 21:47:05 EDT 2004


Update of /cvsroot/python/python/nondist/sandbox/decimal
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8494
Modified Files:
	Decimal.py 
Log Message:
* Fix broken hash function so that now:
 hash(2.300) == hash(2.3) == hash(2300e-2)
 hash(0) == hash(-0)
 hash(i) == hash(int(i)) whenever i is an integer
 signs and exponents are taken into account
* Add or improve more docstrings and doctests.
Index: Decimal.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/decimal/Decimal.py,v
retrieving revision 1.34
retrieving revision 1.35
diff -C2 -d -r1.34 -r1.35
*** Decimal.py	30 Jun 2004 19:11:40 -0000	1.34
--- Decimal.py	1 Jul 2004 01:47:03 -0000	1.35
***************
*** 16,35 ****
 # Improve docstrings and add more doctests
 # Improve the Context API
 
 """
! This is a stab at a decimal arithmetic module based on the decimal
! arithmetic ANSI standard X3.274-1996.
 
! Most of the information used to create this module was helpfully provided
! by Mike Cowlishaw's work at
! http://www2.hursley.ibm.com/decimal/
! The rest comes from Tim Peters's FixedPoint.py, particularly the string
! conversion routine and general Pythonic practices.
 
! In the current form of Decimal(), precision is finite but unbounded, with
! the exception of division and square roots.
 
! Here are some simple test cases that show how to use Decimal. There
! is a separate full-blown test harness (run Test(testdatadir).test())
 
 >>> from Decimal import *
--- 16,47 ----
 # Improve docstrings and add more doctests
 # Improve the Context API
+ # Provide a clean way of attaching monetary format representations
 
 """
! This is an implementation of decimal floating point arithmetic based on
! the General Decimal Arithmetic Specification:
 
! www2.hursley.ibm.com/decimal/decarith.html
 
! IEEE standard 854-1987:
 
! www.cs.berkeley.edu/~ejr/projects/754/private/drafts/854-1987/dir.html
! 
! and ANSI standard X3.274-1996:
! 
! www.rexxla.org/Standards/ansi.html
! 
! 
! Decimal floating point has finite precision with arbitrarily large bounds.
! 
! The purpose of the module is to support arithmetic using familiar
! "schoolhouse" rules and to avoid the some of tricky representation
! issues associated with binary floating point. The package is especially
! useful for financial applications or for contexts where users have
! expectations that are at odds with binary floating point (for instance,
! in binary floating point, 1.00 % 0.1 gives 0.09999999999999995 instead
! of the expected Decimal("0.00") returned by decimal floating point).
! 
! Here are some examples of using the decimal module:
 
 >>> from Decimal import *
***************
*** 447,458 ****
 
 def __init__(self, value="0", context=None):
! """Initialize the Decimal class.
! 
! Accepts several types of input:
 
! string
! list/tuple in form (sign, (digit_list), exponent)
! Decimal instance
! long, int
 """
 if context is None:
--- 459,472 ----
 
 def __init__(self, value="0", context=None):
! """Create a decimal point instance.
 
! >>> Decimal('3.14') # string input
! Decimal("3.14")
! >>> Decimal((0, (3, 1, 4), -2)) # tuple input (sign, digit_tuple, exponent)
! Decimal("3.14")
! >>> Decimal(314) # int or long
! Decimal("314")
! >>> Decimal(Decimal(314)) # another decimal instance
! Decimal("314")
 """
 if context is None:
***************
*** 684,697 ****
 
 def __hash__(self):
! """Hashes whole numbers to their long equivalent.
! 
! Numbers equal in value hash to the same value if exp>0, only if
! they have the same precision if not.
! XXX Doesn't make too much sense-- hash(10) = hash(1e1) != hash(100e-1)
! """
! if self._exp >= 0:
! return hash(int(self))
! else:
! return hash( (self._sign, self._int, self._exp) )
 
 def as_tuple(self):
--- 698,710 ----
 
 def __hash__(self):
! """x.__hash__() <==> hash(x)"""
! # Decimal integers must hash the same as the ints
! # Non-integer decimals are normalized and hashed as strings
! # Normalization assures that hast(100E-1) == hash(10)
! i = int(self)
! if self == Decimal(i):
! return hash(i)
! assert self.__nonzero__() # '-0' handled by integer case
! return hash(str(self.normalize()))
 
 def as_tuple(self):
***************
*** 703,717 ****
 
 def __repr__(self):
! """Represents the number as an instance of Decimal.
! 
! Not pretty, but eval(repr(self)) == self
! """
 return 'Decimal("%s")' % str(self)
 
 def __str__(self, eng = 0, context=None):
! """Return the string representation of the number.
 
! It is written in scientific notation. Because it represents all the
! number information, can be used from repr() also.
 """
 
--- 716,727 ----
 
 def __repr__(self):
! """Represents the number as an instance of Decimal."""
! # Invariant: eval(repr(d)) == d
 return 'Decimal("%s")' % str(self)
 
 def __str__(self, eng = 0, context=None):
! """Return string representation of the number in scientific notation.
 
! Captures all of the information in the underlying representation.
 """
 


More information about the Python-checkins mailing list

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