Author: Brian Kearns <bdkea...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit