问题描述
以下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}}