为什么我们在写程序确定python中的"machine precision"时定义eps=1除以2

Why we define eps= 1 and divide by 2 when writing a program to determine "machine precision" in python

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

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

而且我已经确认是对的。我的问题是我不明白为什么我们在第 1 行设置 epsilon = 2 以及为什么我们在第 4 行除以二。我用不同的值测试了 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 的值归一化为 0 的特征(2 的幂)。否则,标准浮点数表示法将以指数表示法存储数字,只需将特征更改为归一化尾数(数字的值)到最大分数 < 1.0.

whiel 条件检查归一化是否导致我们失去精度:给定机器的精度,epsilon 是否实际上变成了 0。如果不是...

    epsilon_2=epsilon
    epsilon /= 2

记住 差异的最新值。将 epsilon 向右移动一位(用铅笔和纸表示;用计算机表示,这只是将特征值减 1)并重复循环。

print(epsilon_2)

当您最终达到 标准化 epsilon 为 0.0 的点时,导致算术失效,打印 previous 值:算术仍然成功的那个。

这样就清楚了吗?