[pypy-commit] pypy default: fix complex log behavior to match numpy

bdkearns noreply at buildbot.pypy.org
Fri Feb 21 06:37:47 CET 2014


Author: Brian Kearns <bdkearns at gmail.com>
Branch: 
Changeset: r69233:fc1fb890aaa6
Date: 2014-02-20 20:30 -0500
http://bitbucket.org/pypy/pypy/changeset/fc1fb890aaa6/

Log:	fix complex log behavior to match numpy

diff --git a/pypy/module/micronumpy/test/complex_testcases.txt b/pypy/module/micronumpy/test/complex_testcases.txt
--- a/pypy/module/micronumpy/test/complex_testcases.txt
+++ b/pypy/module/micronumpy/test/complex_testcases.txt
@@ -1346,7 +1346,7 @@
 log0201 log 0.79999999999999993 0.60000000000000009 -> 6.1629758220391547e-33 0.64350110879328448
 
 -- special values
-log1000 log -0.0 0.0 -> -inf 0.0         divide-by-zero
+log1000 log -0.0 0.0 -> -inf 3.1415926535897931         divide-by-zero
 log1001 log 0.0 0.0 -> -inf 0.0                         divide-by-zero
 log1002 log 0.0 inf -> inf 1.5707963267948966
 log1003 log 2.3 inf -> inf 1.5707963267948966
@@ -1368,8 +1368,8 @@
 log1019 log nan 2.3 -> nan nan
 log1020 log nan inf -> inf nan
 log1021 log nan nan -> nan nan
-log1022 log -0.0 -0.0 -> -inf 0.0       divide-by-zero
-log1023 log 0.0 -0.0 -> -inf 0.0        divide-by-zero
+log1022 log -0.0 -0.0 -> -inf -3.1415926535897931       divide-by-zero
+log1023 log 0.0 -0.0 -> -inf -0.0                       divide-by-zero
 log1024 log 0.0 -inf -> inf -1.5707963267948966
 log1025 log 2.3 -inf -> inf -1.5707963267948966
 log1026 log -0.0 -inf -> inf -1.5707963267948966
@@ -1514,7 +1514,7 @@
 logt0201 log10 0.79999999999999993 0.60000000000000009 -> 2.6765463916147622e-33 0.2794689806475476
 
 -- special values
-logt1000 log10 -0.0 0.0 -> -inf 0.0         divide-by-zero
+logt1000 log10 -0.0 0.0 -> -inf 1.3643763538418412         divide-by-zero
 logt1001 log10 0.0 0.0 -> -inf 0.0          divide-by-zero
 logt1002 log10 0.0 inf -> inf 0.68218817692092071
 logt1003 log10 2.3 inf -> inf 0.68218817692092071
@@ -1536,8 +1536,8 @@
 logt1019 log10 nan 2.3 -> nan nan
 logt1020 log10 nan inf -> inf nan
 logt1021 log10 nan nan -> nan nan
-logt1022 log10 -0.0 -0.0 -> -inf 0.0       divide-by-zero
-logt1023 log10 0.0 -0.0 -> -inf 0.0        divide-by-zero
+logt1022 log10 -0.0 -0.0 -> -inf -1.3643763538418412       divide-by-zero
+logt1023 log10 0.0 -0.0 -> -inf -0.0        divide-by-zero
 logt1024 log10 0.0 -inf -> inf -0.68218817692092071
 logt1025 log10 2.3 -inf -> inf -0.68218817692092071
 logt1026 log10 -0.0 -inf -> inf -0.68218817692092071
diff --git a/pypy/module/micronumpy/test/test_complex.py b/pypy/module/micronumpy/test/test_complex.py
--- a/pypy/module/micronumpy/test/test_complex.py
+++ b/pypy/module/micronumpy/test/test_complex.py
@@ -412,7 +412,7 @@
                 except OverflowError:
                     res = cmpl(inf, nan)
                 except ValueError:
-                    res = cmpl(ninf, 0)
+                    res = cmpl(ninf, math.atan2(a[i].imag, a[i].real) / log_2)
                 msg = 'result of log2(%r(%r)) got %r expected %r\n ' % \
                             (c,a[i], b[i], res)
                 # cast untranslated boxed results to float,
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -25,6 +25,7 @@
 degToRad = math.pi / 180.0
 log2 = math.log(2)
 log2e = 1. / log2
+log10 = math.log(10)
 
 def simple_unary_op(func):
     specialize.argtype(1)(func)
@@ -1549,22 +1550,25 @@
 
     @complex_unary_op
     def log(self, v):
-        if v[0] == 0 and v[1] == 0:
-            return -rfloat.INFINITY, 0
-        return rcomplex.c_log(*v)
+        try:
+            return rcomplex.c_log(*v)
+        except ValueError:
+            return -rfloat.INFINITY, math.atan2(v[1], v[0])
 
     @complex_unary_op
     def log2(self, v):
-        if v[0] == 0 and v[1] == 0:
-            return -rfloat.INFINITY, 0
-        r = rcomplex.c_log(*v)
+        try:
+            r = rcomplex.c_log(*v)
+        except ValueError:
+            r = -rfloat.INFINITY, math.atan2(v[1], v[0])
         return r[0] / log2, r[1] / log2
 
     @complex_unary_op
     def log10(self, v):
-        if v[0] == 0 and v[1] == 0:
-            return -rfloat.INFINITY, 0
-        return rcomplex.c_log10(*v)
+        try:
+            return rcomplex.c_log10(*v)
+        except ValueError:
+            return -rfloat.INFINITY, math.atan2(v[1], v[0]) / log10
 
     @complex_unary_op
     def log1p(self, v):


More information about the pypy-commit mailing list