Author: Brian Kearns <[email protected]>
Branch:
Changeset: r69006:45c5e6b6f992
Date: 2014-01-29 17:58 -0500
http://bitbucket.org/pypy/pypy/changeset/45c5e6b6f992/
Log: fix overflow in cast to float16
diff --git a/pypy/module/micronumpy/test/test_dtypes.py
b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -204,6 +204,9 @@
assert array([256], 'B')[0] == 0
assert array([32768], 'h')[0] == -32768
assert array([65536], 'H')[0] == 0
+ a = array([65520], dtype='float64')
+ b = array(a, dtype='float16')
+ assert b == float('inf')
if dtype('l').itemsize == 4: # 32-bit
raises(OverflowError, "array([2**32/2], 'i')")
raises(OverflowError, "array([2**32], 'I')")
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
@@ -404,6 +404,7 @@
if w_item is None:
return self.box(0)
return self.box(space.int_w(space.call_function(space.w_int, w_item)))
+
def _coerce(self, space, w_item):
return self._base_coerce(space, w_item)
@@ -979,7 +980,7 @@
def byteswap(self, w_v):
value = self.unbox(w_v)
- hbits = float_pack(value,2)
+ hbits = float_pack(value, 2)
swapped = byteswap(rffi.cast(self._STORAGE_T, hbits))
return self.box(float_unpack(r_ulonglong(swapped), 2))
@@ -990,11 +991,14 @@
return float_unpack(r_ulonglong(hbits), 2)
def _write(self, storage, i, offset, value):
- hbits = rffi.cast(self._STORAGE_T, float_pack(value, 2))
+ try:
+ hbits = float_pack(value, 2)
+ except OverflowError:
+ hbits = float_pack(rfloat.INFINITY, 2)
if not self.native:
hbits = byteswap(hbits)
raw_storage_setitem(storage, i + offset,
- rffi.cast(self._STORAGE_T, hbits))
+ rffi.cast(self._STORAGE_T, hbits))
class Float32(BaseType, Float):
T = rffi.FLOAT
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit