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

Can*_*uck 0 python types numpy

这个主要问题的例子:

c=np.array([2600.0])

In [3]: c=c.astype(np.float16)

In [4]: c

Out[4]: array([ 2600.], dtype=float16)
Run Code Online (Sandbox Code Playgroud)

好的,然后:

In [5]: c=np.array([2583.0])

In [6]: c=c.astype(np.float16)

In [7]: c

Out[7]: array([ 2584.], dtype=float16)
Run Code Online (Sandbox Code Playgroud)

所以2583.0变成2584.0,很酷,这不会导致任何问题!!!! 当我将一个大型数组转换为np.float16时,我也看到2583.0在相反方向转换为2582.0.

发生了什么事我花了整整一天试图找到这个bug,我从没想过这发生在我的数据上?我使用float16来限制我的内存消耗,但是如果这很危险我将继续移动到32位.

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

非常感谢大家.

Blc*_*ght 7

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

您可以在维基百科页面中阅读有关半宽浮点数的更多信息.这是您问题的最重要段落:

整数值的精度限制

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