[pypy-commit] pypy numpypy-complex2: fix complex math test cases for numpy compatibility (never raises)
mattip
noreply at buildbot.pypy.org
Fri Aug 31 17:45:20 CEST 2012
Author: mattip <matti.picus at gmail.com>
Branch: numpypy-complex2
Changeset: r57064:2280c2365844
Date: 2012-08-31 18:44 +0300
http://bitbucket.org/pypy/pypy/changeset/2280c2365844/
Log: fix complex math test cases for numpy compatibility (never raises)
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
@@ -999,7 +999,7 @@
-- special values
atan1000 atan -0.0 0.0 -> -0.0 0.0
atan1001 atan nan 0.0 -> nan 0.0
-atan1002 atan -0.0 1.0 -> -0.0 inf divide-by-zero
+atan1002 atan -0.0 1.0 -> nan inf divide-by-zero
atan1003 atan -inf 0.0 -> -1.5707963267948966 0.0
atan1004 atan -inf 2.2999999999999998 -> -1.5707963267948966 0.0
atan1005 atan nan 2.2999999999999998 -> nan nan
@@ -1012,7 +1012,7 @@
atan1012 atan -inf nan -> -1.5707963267948966 0.0 ignore-imag-sign
atan1013 atan nan nan -> nan nan
atan1014 atan 0.0 0.0 -> 0.0 0.0
-atan1015 atan 0.0 1.0 -> 0.0 inf divide-by-zero
+atan1015 atan 0.0 1.0 -> nan inf divide-by-zero
atan1016 atan inf 0.0 -> 1.5707963267948966 0.0
atan1017 atan inf 2.2999999999999998 -> 1.5707963267948966 0.0
atan1018 atan 0.0 inf -> 1.5707963267948966 0.0
@@ -1023,7 +1023,7 @@
atan1023 atan inf nan -> 1.5707963267948966 0.0 ignore-imag-sign
atan1024 atan 0.0 -0.0 -> 0.0 -0.0
atan1025 atan nan -0.0 -> nan -0.0
-atan1026 atan 0.0 -1.0 -> 0.0 -inf divide-by-zero
+atan1026 atan 0.0 -1.0 -> nan -inf divide-by-zero
atan1027 atan inf -0.0 -> 1.5707963267948966 -0.0
atan1028 atan inf -2.2999999999999998 -> 1.5707963267948966 -0.0
atan1029 atan nan -2.2999999999999998 -> nan nan
@@ -1032,7 +1032,7 @@
atan1032 atan inf -inf -> 1.5707963267948966 -0.0
atan1033 atan nan -inf -> nan -0.0
atan1034 atan -0.0 -0.0 -> -0.0 -0.0
-atan1035 atan -0.0 -1.0 -> -0.0 -inf divide-by-zero
+atan1035 atan -0.0 -1.0 -> nan -inf divide-by-zero
atan1036 atan -inf -0.0 -> -1.5707963267948966 -0.0
atan1037 atan -inf -2.2999999999999998 -> -1.5707963267948966 -0.0
atan1038 atan -0.0 -inf -> -1.5707963267948966 -0.0
@@ -1346,7 +1346,7 @@
log0201 log 0.79999999999999993 0.60000000000000009 -> 6.1629758220391547e-33 0.64350110879328448
-- special values
-log1000 log -0.0 0.0 -> -inf 3.1415926535897931 divide-by-zero
+log1000 log -0.0 0.0 -> -inf 0.0 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 -3.1415926535897931 divide-by-zero
-log1023 log 0.0 -0.0 -> -inf -0.0 divide-by-zero
+log1022 log -0.0 -0.0 -> -inf 0.0 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,8 +1514,8 @@
logt0201 log10 0.79999999999999993 0.60000000000000009 -> 2.6765463916147622e-33 0.2794689806475476
-- special values
-logt1000 log10 -0.0 0.0 -> -inf 1.3643763538418414 divide-by-zero
-logt1001 log10 0.0 0.0 -> -inf 0.0 divide-by-zero
+logt1000 log10 -0.0 0.0 -> -inf 0.0 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
logt1004 log10 -0.0 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 -1.3643763538418414 divide-by-zero
-logt1023 log10 0.0 -0.0 -> -inf -0.0 divide-by-zero
+logt1022 log10 -0.0 -0.0 -> -inf 0.0 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
@@ -1609,11 +1609,11 @@
exp0046 exp -745.0 5.3 -> 0.0 -0.0
-- values for which exp(z) overflows
-exp0050 exp 710.0 0.0 -> inf 0.0 overflow
-exp0051 exp 711.0 0.7 -> inf inf overflow
-exp0052 exp 710.0 1.5 -> 1.5802653829857376e+307 inf overflow
-exp0053 exp 710.0 1.6 -> -6.5231579995501372e+306 inf overflow
-exp0054 exp 710.0 2.8 -> -inf 7.4836177417448528e+307 overflow
+exp0050 exp 710.0 0.0 -> inf nan overflow
+exp0051 exp 711.0 0.7 -> inf nan overflow
+exp0052 exp 710.0 1.5 -> inf nan overflow
+exp0053 exp 710.0 1.6 -> inf nan overflow
+exp0054 exp 710.0 2.8 -> inf nan overflow
-- special values
exp1000 exp 0.0 0.0 -> 1.0 0.0
diff --git a/pypy/module/micronumpy/test/test_ufuncs.py b/pypy/module/micronumpy/test/test_ufuncs.py
--- a/pypy/module/micronumpy/test/test_ufuncs.py
+++ b/pypy/module/micronumpy/test/test_ufuncs.py
@@ -926,7 +926,7 @@
assert False, 'untested: copysign, reciprocal, sign, floor_div, ' + \
'signbit, fabs, fmax, fmin, floor, ceil, trunc, ' + \
'exp2, expm1, isnan, isinf, isneginf, isposinf, ' + \
- 'isfinite, radians, degrees, log2, log10, log1p, ' + \
+ 'isfinite, radians, degrees, log2, log1p, ' + \
'logaddexp, npy_log2_1p, logaddexp2'
def test_complex_math(self):
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
@@ -1188,21 +1188,22 @@
else:
return math.floor(v)
- @simple_unary_op
+ @complex_unary_op
def exp(self, v):
+ if math.isinf(v[1]):
+ return rfloat.NAN, rfloat.NAN
try:
- return math.exp(v)
+ return rcomplex.c_exp(*v)
except OverflowError:
- return rfloat.INFINITY
+ return rfloat.INFINITY, rfloat.NAN
- @simple_unary_op
def exp2(self, v):
try:
- return math.pow(2, v)
+ return self.pow(2, v)
except OverflowError:
- return rfloat.INFINITY
+ return rfloat.INFINITY, rfloat.NAN
- @simple_unary_op
+ @complex_unary_op
def expm1(self, v):
try:
return rfloat.expm1(v)
@@ -1263,9 +1264,8 @@
@complex_unary_op
def arctanh(self, v):
if v[1] == 0 and (v[0] == 1.0 or v[0] == -1.0):
- return math.copysign(rfloat.INFINITY, v[0]), 0.
- if not -1.0 < v < 1.0:
- return rfloat.NAN, 0.
+ return (math.copysign(rfloat.INFINITY, v[0]),
+ math.copysign(0., v[1]))
return rcomplex.c_atanh(*v)
@@ -1309,22 +1309,19 @@
@complex_unary_op
def log(self, v):
- return rcomplex.c_log(v)
+ if v[0] == 0 and v[1] == 0:
+ return -rfloat.INFINITY, 0
+ return rcomplex.c_log(*v)
@simple_unary_op
def log2(self, v):
return self.log(v) / log2
- @simple_unary_op
+ @complex_unary_op
def log10(self, v):
- try:
- return math.log10(v)
- except ValueError:
- if v == 0.0:
- # CPython raises ValueError here, so we have to check
- # the value to find the correct numpy return value
- return -rfloat.INFINITY
- return rfloat.NAN
+ if v[0] == 0 and v[1] == 0:
+ return -rfloat.INFINITY, 0
+ return rcomplex.c_log10(*v)
@simple_unary_op
def log1p(self, v):
More information about the pypy-commit
mailing list