在 Matlab 中查找 epsilon 的机器值

Finding the machine value of epsilon in Matlab

下面的 Matlab 代码用于计算 epsilon 的机器值。

e = 1; 
while (1+e>1) 
    if e+1 <= 1
        e = 2*e;
    else e = e/2; 
    end
end
e = 2*e

虽然 epsilon 的值是正确近似的,但修改代码会导致意外结果。例如,如果 while 循环条件被修改为 e>0,如下所示,程序要么崩溃,要么输出 0 而不是 epsilon 的近似值,即使添加常数不会改变不等式。有人可以解释为什么会这样吗?

e = 1; 
while (e>0) 
    if e+1 <= 1
        e = 2*e;
    else e = e/2; 
    end
end
e=2*e

“epsilon”的概念是有一个最小值必须与1相加才能得到不同的值。如果 e 小于 epsilon,则 1+e==1。 Floating-point 数字不能表示 1 到 1 + epsilon 之间的值。

因此,将 while 循环中的条件 1+e>1 替换为 e>0,虽然在数学上是等价的,但打破了我们试图定义的概念:epsilon 作为加到 1 的最小值得到一个比 1 大的值。请注意,您可以表示非常接近 0 的值,例如 10-300,但您不能表示接近 1 的值。Epsilon 约为 10-16。这意味着在处理 floating-point 个数字时,这两个不等式是不同的。


请注意,语句 if e+1 <= 1 仅在 1+e>1 时达到,因此始终为假。您可以通过删除此 if 语句并仅保留 else 子句中的代码来简化代码:

e = 1;
while 1+e > 1
   e = e/2;
end
e = 2*e