float16的float16数据类型是否有功能?

时间:2016-11-17 02:03:33

标签: python numpy types

这个主要问题的例子:

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位。

任何人都可以对此有所了解吗?

非常感谢大家。

1 个答案:

答案 0 :(得分:7)

16位浮点数不是非常精确的数据类型。它只有11位精度。它不能精确地表示大于2048的所有整数。在2048和4096之间,只有偶数整数具有精确的表示。奇数整数将四舍五入到最近的偶数整数之一。

您可以在the Wikipedia page中了解有关半宽浮点数的更多信息。这是您问题的最重要段落:

  

整数值的精度限制

     
      
  • 0到2048之间的整数可以精确表示
  •   
  • 2049到4096之间的整数轮到2的倍数(偶数)
  •   
  • 4097和8192之间的整数轮到4的倍数
  •