对于给定的精度,float32 将给出与 float64 相同的结果的最大值是多少?

For a given precision, what is the maximum value for which a float32 will give the same result as a float64?

提问人:user18048269 提问时间:3/28/2022 最后编辑:dan04user18048269 更新时间:3/30/2022 访问量:634

问:

使用 numpy,我试图了解在精度损失小于或等于 0.001 的情况下,可以从 float64 下降到 float32 的最大值是多少。

由于我在网上找不到一个简单的解释,所以我很快就想出了这段代码来测试:

result = {}
for j in range(1,1000):
    for i in range (1, 1_000_000):
        num = i + j/1000
        x=np.array([num],dtype=np.float32)
        y=np.array([num],dtype=np.float64)
        if abs(x[0]-y[0]) > 0.001:
            result[j] = i
            break

根据结果,似乎任何正值 <32768 都可以安全地从 float64 降低到 float32,并具有可接受的精度损失(给定 <=0.001 的标准)

这是正确的吗? 有人可以解释背后的数学吗?

多谢

python numpy 浮动精度

评论

2赞 Eric Postpischil 3/29/2022
当从 转换为 时,∞ 会产生相同的值,而不会损失精度。因此,这是标题中表述的问题的最大值。float64float32

答:

6赞 dan04 3/28/2022 #1

假设 IEEE 754 表示,float32 具有 24 位有效精度,而 float64 具有 53 位有效精度(“非规范”数字除外)。

为了表示绝对误差最多为 0.001 的数字,二进制点的右侧至少需要 9 位,这意味着数字四舍五入到最接近的 1/512 的倍数,因此最大表示误差为 1/1024 = 0.0009765625 < 0.001。

总共有 24 个有效位,二进制点右边有 9 个,二进制点左边剩下 15 位,可以表示所有小于 215 = 32768 的整数,正如您通过实验确定的那样。

但是,有些高于此阈值的数字的误差仍小于 0.001。正如 Eric Postpischil 在他的评论中指出的那样,介于 32768.0 和 32768.001 之间的所有值(最大值正好是 32768+137438953/237),转换四舍五入到 32768.0,满足您的精度要求。当然,任何恰好可以在 a 中完全表示的数字都不会有表示错误。float64float32float32

评论

2赞 Eric Postpischil 3/29/2022
不过,32768 不是最大值;所有亮度高达32768.0009999999995657480061054229736328125,四舍五入小于0.001。float64float32