在Matlab中找到epsilon的机器值

问题描述

以下Matlab代码用于查找epsilon的机器值。

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

虽然ε的值正确近似,但修改代码会导致意外结果。例如,如果将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

解决方法

“ε”的概念是必须将最小值加到1才能获得不同的值。如果e小于epsilon,则1+e==1。浮点数不能表示介于1和1 + epsilon之间的值。

因此,尽管在数学上是等价的,但用1+e>1将while循环e>0中的条件替换为if e+1 <= 1打破了我们试图定义的概念:epsilon是要加到1以获得大于1的值。请注意,您可以表示非常接近0的值,例如10 -300 ,但不能表示接近1的值。Epsilon约为10 -16 。这意味着在处理浮点数时这两个不等式并不相同。


请注意,语句1+e>1仅在else时到达,因此始终为false。您可以通过删除以下if语句并将代码仅保留在e = 1; while 1+e > 1 e = e/2; end e = 2*e 子句中来简化代码:

{{1}}