0

将数字从一半转换为单个浮点表示时,我看到数值发生了变化。

在这里,我65500存储为半精度浮点数,但升级到单精度会将基础值更改为65504,这是远离目标的许多浮点增量。

在这种特定情况下,为什么会发生这种情况?

(Pdb) np.asarray(65500,dtype=np.float16).astype(np.float32)
array(65504., dtype=float32)

作为旁注,我还观察到

(Pdb) int(np.finfo(np.float16).max)
65504
4

1 回答 1

3

该错误不是“许多浮点增量”[更正以匹配 OP 改进的措辞]。阅读标准 IEEE 754-2008。它为尾数指定 10 位,或 1024 个不同的值。您的值接近 2^16,因此您的增量为 2^6,即 64。

该格式还为符号提供 1 位,为特征(指数)提供 5 位。

65500 存储为等价于+ 2^6 * 1023.5. 这直接65504转换为转换为 float32 时。当您将较大的数字转换为 10 位精度时,您会丢失精度。当您在任一方向转换时,结果总是受到不太精确的类型的约束。

于 2021-07-08T00:13:25.897 回答