这个主要问题的例子:
In [5]: c=np.array([2583.0])
In [6]: c=c.astype(np.float16)
In [7]: c
Out[7]: array([ 2584.], dtype=float16)
一切都很好,然后:
<textarea class="comments">
所以2583.0变成2584.0,很酷,这不会导致任何问题!!!! 当我将一个大数组转换为np.float16时,我也看到2583.0在相反方向转换为2582.0。
发生了什么事我花了整整一天试图找到这个bug 我从未想过这会发生在我的数据中吗?我正在使用float16 限制我的内存消耗,但如果这个危险,我会移动到32位。
任何人都可以对此有所了解吗?
非常感谢大家。
答案 0 :(得分:7)
16位浮点数不是非常精确的数据类型。它只有11位精度。它不能精确地表示大于2048的所有整数。在2048和4096之间,只有偶数整数具有精确的表示。奇数整数将四舍五入到最近的偶数整数之一。
您可以在the Wikipedia page中了解有关半宽浮点数的更多信息。这是您问题的最重要段落:
整数值的精度限制
- 0到2048之间的整数可以精确表示
- 2049到4096之间的整数轮到2的倍数(偶数)
- 4097和8192之间的整数轮到4的倍数