使用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可以以可接受的精度损失(给定<=0.001的标准(从浮子64安全地下导管到浮子32
这是正确的吗?有人能解释一下背后的数学原理吗?
非常感谢
假设IEEE 754表示,float32
的有效位精度为24位,而float64
的有效位精确度为53位("非正规"数字除外(。
为了表示绝对误差最大为0.001的数字,二进制点右侧至少需要9位,这意味着数字被四舍五入到1/512的最接近倍数,因此最大表示误差为1/1024=0.0009766525<0.001.
总共有24个有效位,二进制点右边有9个,二进制点左边有15个位,可以表示所有小于215=32768的整数,正如你通过实验确定的那样。
然而,有一些高于该阈值的数字仍然具有小于0.001的误差。正如Eric Postpischil在评论中指出的那样,所有介于32768.0和32768.001之间的float64
值(最大值正好是32768+137438953/237(,float32
转换四舍五入到32768.0,都符合您的精度要求。当然,任何恰好可以在float32
中精确表示的数字都不会有表示误差。