[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