问题描述
所以我已经有了确定我的“机器精度”或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 值:算术仍然成功的那个值。
可以清除吗?