Author: mattip <[email protected]>
Branch: numpypy-complex2
Changeset: r57256:0639de218850
Date: 2012-09-09 23:13 +0300
http://bitbucket.org/pypy/pypy/changeset/0639de218850/
Log: add tests for fmax, discover problem with converting complex to
float and raise TypeError
diff --git a/pypy/module/micronumpy/interp_boxes.py
b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -42,6 +42,9 @@
self.imag = imag
def convert_to(self, dtype):
+ from pypy.module.micronumpy.types import ComplexFloating
+ if not isinstance(dtype.itemtype, ComplexFloating):
+ raise TypeError('cannot convert %r to complex' % dtype)
return dtype.box_complex(self.real, self.imag)
def convert_real_to(self, dtype):
@@ -74,7 +77,12 @@
return space.wrap(box.value)
def descr_float(self, space):
- box = self.convert_to(W_Float64Box._get_dtype(space))
+ try:
+ box = self.convert_to(W_Float64Box._get_dtype(space))
+ except TypeError:
+ raise OperationError(space.w_TypeError,
+ space.wrap("Cannot convert %s to float" %
self._get_dtype(space).name))
+
assert isinstance(box, W_Float64Box)
return space.wrap(box.value)
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
@@ -200,7 +200,7 @@
assert isnan(fabs(float('nan')))
def test_fmax(self):
- from _numpypy import fmax
+ from _numpypy import fmax, array
import math
nnan, nan, inf, ninf = float('-nan'), float('nan'), float('inf'),
float('-inf')
@@ -209,8 +209,8 @@
assert (fmax(a, [ninf]*5) == a).all()
assert (fmax(a, [inf]*5) == [inf]*5).all()
assert (fmax(a, [1]*5) == [1, 1, 1, 5, inf]).all()
- assert math.isnan(fmax(nan, 0))
- assert math.isnan(fmax(0, nan))
+ assert fmax(nan, 0) == 0
+ assert fmax(0, nan) == 0
assert math.isnan(fmax(nan, nan))
# The numpy docs specify that the FIRST NaN should be used if both are
NaN
# Since comparisons with nnan and nan all return false,
@@ -218,6 +218,30 @@
# on Microsoft win32
assert math.copysign(1., fmax(nnan, nan)) == math.copysign(1., nnan)
+ a = array((complex(ninf, 10), complex(10, ninf),
+ complex( inf, 10), complex(10, inf),
+ 5+5j, 5-5j, -5+5j, -5-5j,
+ 0+5j, 0-5j, 5, -5,
+ complex(nan, 0), complex(0, nan)), dtype = complex)
+ b = [ninf]*a.size
+ res = [a[0 ], a[1 ], a[2 ], a[3 ],
+ a[4 ], a[5 ], a[6 ], a[7 ],
+ a[8 ], a[9 ], a[10], a[11],
+ b[12], b[13]]
+ assert (fmax(a, b) == res).all()
+ b = [inf]*a.size
+ res = [b[0 ], b[1 ], a[2 ], b[3 ],
+ b[4 ], b[5 ], b[6 ], b[7 ],
+ b[8 ], b[9 ], b[10], b[11],
+ b[12], b[13]]
+ assert (fmax(a, b) == res).all()
+ b = [0]*a.size
+ res = [b[0 ], a[1 ], a[2 ], a[3 ],
+ a[4 ], a[5 ], b[6 ], b[7 ],
+ a[8 ], b[9 ], a[10], b[11],
+ b[12], b[13]]
+ assert (fmax(a, b) == res).all()
+
def test_fmin(self):
from _numpypy import fmin
@@ -308,6 +332,7 @@
[False, False, False, False, False]).all()
assert (signbit([-0, -0.0, -1, -1.0, float('-inf')]) ==
[False, True, True, True, True]).all()
+
skip('sign of nan is non-determinant')
assert (signbit([float('nan'), float('-nan'), -float('nan')]) ==
[False, True, True]).all()
@@ -1042,7 +1067,7 @@
assert repr(abs(complex(float('nan'), float('nan')))) == 'nan'
assert False, 'untested: ' + \
- 'signbit, fabs, fmax, fmin, floor, ceil, trunc, ' + \
+ 'fabs, fmax, fmin, floor, ceil, trunc, ' + \
'exp2, expm1, isnan, isinf, isneginf, isposinf, ' + \
'isfinite, radians, degrees, log2, log1p, ' + \
'logaddexp, npy_log2_1p, logaddexp2'
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
@@ -647,9 +647,9 @@
@simple_binary_op
def fmax(self, v1, v2):
- if math.isnan(v1):
+ if math.isnan(v2):
return v1
- elif math.isnan(v2):
+ elif math.isnan(v1):
return v2
return max(v1, v2)
@@ -1147,29 +1147,23 @@
return 1,0
return -1,0
- @raw_unary_op
- def signbit(self, v):
- return rfloat.copysign(1.0, v) < 0.0
+ def fmax(self, v1, v2):
+ if self.isnan(v2):
+ return v1
+ elif self.isnan(v1):
+ return v2
+ if v1 >= v2:
+ return v1
+ return v2
- @complex_unary_op
- def fabs(self, v):
- return rcomplex.abs(*v)
-
- @simple_binary_op
- def fmax(self, v1, v2):
- if math.isnan(v1):
+ def fmin(self, v1, v2):
+ if math.isnan(v2):
return v1
- elif math.isnan(v2):
+ elif math.isnan(v1):
return v2
- return max(v1, v2)
-
- @simple_binary_op
- def fmin(self, v1, v2):
- if math.isnan(v1):
+ if v1 <= v2:
return v1
- elif math.isnan(v2):
- return v2
- return min(v1, v2)
+ return v2
#@simple_binary_op
#def fmod(self, v1, v2):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit