[pypy-svn] r77705 - pypy/branch/fast-forward/lib_pypy

afa at codespeak.net afa at codespeak.net
Fri Oct 8 00:50:15 CEST 2010


Author: afa
Date: Fri Oct  8 00:50:14 2010
New Revision: 77705

Modified:
   pypy/branch/fast-forward/lib_pypy/cmath.py
Log:
coerce the argument of cmath function to a complex object
- accept a subclass
- refuse strings
- but accept all other types convertible to complex
Should fix most tests in test_cmath


Modified: pypy/branch/fast-forward/lib_pypy/cmath.py
==============================================================================
--- pypy/branch/fast-forward/lib_pypy/cmath.py	(original)
+++ pypy/branch/fast-forward/lib_pypy/cmath.py	Fri Oct  8 00:50:14 2010
@@ -16,28 +16,36 @@
 _halfi = complex(0., 0.5)
 
 
-# internal function not available from Python
+
+# internal functions not available from Python
+def _to_complex(x):
+    if isinstance(x, complex):
+        return x
+    if isinstance(x, (str, unicode)):
+        return x          # and let it fail later
+    return complex(x)
+
 def _prodi(x):
-    x = complex(x, 0)
+    x = _to_complex(x)
     real = -x.imag
     imag = x.real
     return complex(real, imag)
 
 
+
 def phase(x):
-    x = complex(x)
+    x = _to_complex(x)
     return math.atan2(x.imag, x.real)
 
 
 def polar(x):
-    x = complex(x)
+    x = _to_complex(x)
     phi = math.atan2(x.imag, x.real)
     r = abs(x)
     return r, phi
 
 
 def rect(r, phi):
-    r, phi = complex(r), complex(phi)
     return complex(r * math.cos(phi), r * math.sin(phi))
 
 
@@ -45,7 +53,8 @@
     """acos(x)
 
     Return the arc cosine of x."""
-    
+
+    x = _to_complex(x)
     return -(_prodi(log((x+(_i*sqrt((_one-(x*x))))))))
 
 
@@ -54,6 +63,7 @@
 
     Return the hyperbolic arccosine of x."""
 
+    x = _to_complex(x)
     z = log(_sqrt_half*(sqrt(x+_one)+sqrt(x-_one)))
     return z+z
 
@@ -62,7 +72,8 @@
     """asin(x)
 
     Return the arc sine of x."""
-    
+
+    x = _to_complex(x)
     # -i * log[(sqrt(1-x**2) + i*x]
     squared = x*x
     sqrt_1_minus_x_sq = sqrt(_one-squared)
@@ -73,7 +84,8 @@
     """asinh(x)
 
     Return the hyperbolic arc sine of x."""
-    
+
+    x = _to_complex(x)
     z = log((_sqrt_half * (sqrt(x+_i)+sqrt((x-_i))) ))
     return z+z
 
@@ -82,7 +94,8 @@
     """atan(x)
     
     Return the arc tangent of x."""
-    
+
+    x = _to_complex(x)
     return _halfi*log(((_i+x)/(_i-x)))
 
 
@@ -90,7 +103,8 @@
     """atanh(x)
 
     Return the hyperbolic arc tangent of x."""
-    
+
+    x = _to_complex(x)
     return _half*log((_one+x)/(_one-x))
 
 
@@ -99,7 +113,7 @@
 
     Return the cosine of x."""
 
-    x = complex(x, 0)
+    x = _to_complex(x)
     real = math.cos(x.real) * math.cosh(x.imag)
     imag = -math.sin(x.real) * math.sinh(x.imag)
     return complex(real, imag)
@@ -110,7 +124,7 @@
     
     Return the hyperbolic cosine of x."""
 
-    x = complex(x, 0)
+    x = _to_complex(x)
     real = math.cos(x.imag) * math.cosh(x.real)
     imag = math.sin(x.imag) * math.sinh(x.real)
     return complex(real, imag)
@@ -121,7 +135,7 @@
     
     Return the exponential value e**x."""
 
-    x = complex(x, 0)
+    x = _to_complex(x)
     l = math.exp(x.real)
     real = l * math.cos(x.imag)
     imag = l * math.sin(x.imag)
@@ -135,7 +149,7 @@
     
     if base is not None:
         return log(x) / log(base)
-    x = complex(x, 0)
+    x = _to_complex(x)
     l = math.hypot(x.real,x.imag)
     imag = math.atan2(x.imag, x.real)
     real = math.log(l)
@@ -147,7 +161,7 @@
 
     Return the base-10 logarithm of x."""
     
-    x = complex(x, 0)
+    x = _to_complex(x)
     l = math.hypot(x.real, x.imag)
     imag = math.atan2(x.imag, x.real)/math.log(10.)
     real = math.log10(l)
@@ -159,7 +173,7 @@
 
     Return the sine of x."""
     
-    x = complex(x, 0)
+    x = _to_complex(x)
     real = math.sin(x.real) * math.cosh(x.imag)
     imag = math.cos(x.real) * math.sinh(x.imag)
     return complex(real, imag)
@@ -170,7 +184,7 @@
 
     Return the hyperbolic sine of x."""
     
-    x = complex(x, 0)
+    x = _to_complex(x)
     real = math.cos(x.imag) * math.sinh(x.real)
     imag = math.sin(x.imag) * math.cosh(x.real)
     return complex(real, imag)
@@ -181,7 +195,7 @@
 
     Return the square root of x."""
     
-    x = complex(x, 0)
+    x = _to_complex(x)
     if x.real == 0. and x.imag == 0.:
         real, imag = 0, 0
     else:
@@ -206,7 +220,7 @@
 
     Return the tangent of x."""
 
-    x = complex(x, 0)
+    x = _to_complex(x)
     sr = math.sin(x.real)
     cr = math.cos(x.real)
     shi = math.sinh(x.imag)
@@ -226,7 +240,7 @@
 
     Return the hyperbolic tangent of x."""
     
-    x = complex(x, 0)
+    x = _to_complex(x)
     si = math.sin(x.imag)
     ci = math.cos(x.imag)
     shr = math.sinh(x.real)
@@ -239,3 +253,15 @@
     real = (rs*rc + is_*ic) / d
     imag = (is_*rc - rs*ic) / d
     return complex(real, imag)
+
+def isnan(x):
+    """isnan(z) -> bool
+    Checks if the real or imaginary part of z not a number (NaN)"""
+    x = _to_complex(x)
+    return math.isnan(x.real) or math.isnan(x.imag)
+
+def isinf(x):
+    """isnan(z) -> bool
+    Checks if the real or imaginary part of z is infinite"""
+    x = _to_complex(x)
+    return math.isinf(x.real) or math.isinf(x.imag)



More information about the Pypy-commit mailing list