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

use*_*269 2 python numpy floating-accuracy

使用 numpy,我试图了解可以从 float64 向下转换为 float32 的最大值是多少,精度损失小于或等于 0.001。

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

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
Run Code Online (Sandbox Code Playgroud)

根据结果​​,似乎任何 <32768 的正值都可以安全地从 float64 向下转换为 float32,并且精度损失可以接受(给定 <=0.001 的标准)

它是否正确 ?有人可以解释一下背后的数学原理吗?

多谢

dan*_*n04 6

假设 IEEE 754 表示,float32具有 24 位有效数精度,而float64具有 53 位有效数精度(\xe2\x80\x9cdenormal\xe2\x80\x9d 数字除外)。

\n

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

\n

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

\n

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

\n

  • 不过 32768 并不是最大值;所有“float64”直到 32768.0009999999965657480061054229736328125 的大小都舍入到小于 0.001 的“float32”。 (2认同)