为什么我们在编写程序以确定python中的“机器精度”时定义eps = 1并除以2

问题描述

所以我已经有了确定我的“机器精度”或epsilon的程序:

    epsilon = 1
while 1 + epsilon != 1:
    epsilon_2=epsilon
    epsilon /= 2
print(epsilon_2)

,我已经确认是正确的。我的问题是我不明白为什么在第1行上设置epsilon = 2,为什么在第4行上除以2。我用不同的epsilon值和用于除法的数进行了测试,几乎总是得到不同的结果

解决方法

这是为了弄清您的机器可以处理多少位精度。它假定为二进制表示。在此代码中,epsilon将采用二进制值1、0.1、0.01、0.001,...。这些值将以近似等于0.1 * 2**N的形式存储,其中N是适当的整数。尾数始终为0.1;特征在每个循环上仅移位1

epsilon = 1
while 1 + epsilon != 1:

此加法强制执行单元(EU)将epsilon值归一化为特征(2的幂)。否则,标准的float表示法将数字存储为指数表示法,只需更改特性以对尾数进行归一化(数字值)最大分数

whiel条件检查归一化是否导致我们失去精度:给定机器的精度,epsilon是否有效地变为0。如果没有...

    epsilon_2=epsilon
    epsilon /= 2

请记住与它们最近的值 。将epsilon向右移一点(用铅笔和纸来表示;在计算机上,这只会使特征减小1)并重复循环。

print(epsilon_2)

当最终达到归一化的 epsilon为0.0的点,导致算术崩溃时,打印 previous 值:算术仍然成功的那个值。

可以清除吗?