mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	* Fix error in definition of Im() which returned self instead of 0
for non-complex arguments. * Replace type() comparisons with isinstance() checks. * Replace apply() calls with equivalent syntactic form. * Simplify __hash__ definition to hash the underlying tuple. * Use math.hypot() for more robust computation of __abs__(). * Use sorted() instead of the multi-step keys/sort/iter. * Update comment on the cmath module.
This commit is contained in:
		
							parent
							
								
									ab9ec1654f
								
							
						
					
					
						commit
						bdaad8c939
					
				
					 1 changed files with 14 additions and 19 deletions
				
			
		|  | @ -54,7 +54,7 @@ | |||
| # nor are shift and mask operations. | ||||
| # | ||||
| # The standard module math does not support complex numbers. | ||||
| # (I suppose it would be easy to implement a cmath module.) | ||||
| # The cmath modules should be used instead. | ||||
| # | ||||
| # Idea: | ||||
| # add a class Polar(r, phi) and mixed-mode arithmetic which | ||||
|  | @ -62,7 +62,7 @@ | |||
| # Complex for +,-,cmp | ||||
| # Polar   for *,/,pow | ||||
| 
 | ||||
| import types, math | ||||
| import math | ||||
| import sys | ||||
| 
 | ||||
| twopi = math.pi*2.0 | ||||
|  | @ -74,8 +74,8 @@ def IsComplex(obj): | |||
| def ToComplex(obj): | ||||
|     if IsComplex(obj): | ||||
|         return obj | ||||
|     elif type(obj) == types.TupleType: | ||||
|         return apply(Complex, obj) | ||||
|     elif isinstance(obj, tuple): | ||||
|         return Complex(*obj) | ||||
|     else: | ||||
|         return Complex(obj) | ||||
| 
 | ||||
|  | @ -86,14 +86,12 @@ def PolarToComplex(r = 0, phi = 0, fullcircle = twopi): | |||
| def Re(obj): | ||||
|     if IsComplex(obj): | ||||
|         return obj.re | ||||
|     else: | ||||
|     return obj | ||||
| 
 | ||||
| def Im(obj): | ||||
|     if IsComplex(obj): | ||||
|         return obj.im | ||||
|     else: | ||||
|         return obj | ||||
|     return 0 | ||||
| 
 | ||||
| class Complex: | ||||
| 
 | ||||
|  | @ -119,9 +117,9 @@ def __setattr__(self, name, value): | |||
|         raise TypeError, 'Complex numbers are immutable' | ||||
| 
 | ||||
|     def __hash__(self): | ||||
|         if not self.im: return hash(self.re) | ||||
|         mod = sys.maxint + 1L | ||||
|         return int((hash(self.re) + 2L*hash(self.im) + mod) % (2L*mod) - mod) | ||||
|         if not self.im: | ||||
|             return hash(self.re) | ||||
|         return hash((self.re, self.im)) | ||||
| 
 | ||||
|     def __repr__(self): | ||||
|         if not self.im: | ||||
|  | @ -142,8 +140,7 @@ def __pos__(self): | |||
|         return self | ||||
| 
 | ||||
|     def __abs__(self): | ||||
|         # XXX could be done differently to avoid overflow! | ||||
|         return math.sqrt(self.re*self.re + self.im*self.im) | ||||
|         return math.hypot(self.re, self.im) | ||||
| 
 | ||||
|     def __int__(self): | ||||
|         if self.im: | ||||
|  | @ -238,8 +235,8 @@ def checkop(expr, a, b, value, fuzz = 1e-6): | |||
|     except: | ||||
|         result = sys.exc_type | ||||
|     print '->', result | ||||
|     if (type(result) == type('') or type(value) == type('')): | ||||
|         ok = result == value | ||||
|     if isinstance(result, str) or isinstance(value, str): | ||||
|         ok = (result == value) | ||||
|     else: | ||||
|         ok = abs(result - value) <= fuzz | ||||
|     if not ok: | ||||
|  | @ -312,13 +309,11 @@ def test(): | |||
|                     (Complex(1), Complex(0,10), 1), | ||||
|             ], | ||||
|     } | ||||
|     exprs = testsuite.keys() | ||||
|     exprs.sort() | ||||
|     for expr in exprs: | ||||
|     for expr in sorted(testsuite): | ||||
|         print expr + ':' | ||||
|         t = (expr,) | ||||
|         for item in testsuite[expr]: | ||||
|             apply(checkop, t+item) | ||||
|             checkop(*(t+item)) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Raymond Hettinger
						Raymond Hettinger