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



使用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中精确表示的数字都不会有表示误差。

相关内容

  • 没有找到相关文章

最新更新