在 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
下面的 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