如何在MATLAB中计算机器epsilon?

时间:2014-12-16 18:20:48

标签: matlab numerical-methods epsilon

我需要找到机器epsilon,我正在做以下事情:

eps = 1;

while 1.0 + eps > 1.0 do
    eps = eps /2;
end

然而,它告诉我这个:

Undefined function or variable 'do'. 
Error in epsilon (line 3) 
while 1.0 + eps > 1.0 do

我该怎么办?

3 个答案:

答案 0 :(得分:20)

首先,MATLAB中没有do关键字,所以从代码中删除它。另外,请勿使用eps作为实际变量。这是MATLAB中预定义的函数,用于计算machine epsilon,这也是您尝试计算的函数。通过创建一个名为eps的变量,您可以隐藏实际函数,因此MATLAB中需要使用它的任何其他函数都会出现意外行为,并且这不是您想要的。

改为使用其他内容,例如macheps。此外,您的算法略有不正确。您需要在1.0 + (macheps/2)循环中检查while,而不是1.0 + macheps

换句话说,这样做:

macheps = 1;

while 1.0 + (macheps/2) > 1.0
    macheps = macheps / 2;
end

这应该给你2.22 x 10^{-16},如果你在命令提示符下键入eps,它会同意MATLAB。要仔细检查:

>> format long
>> macheps

macheps =

     2.220446049250313e-16

>> eps

ans =

     2.220446049250313e-16

加成

如果你不知道,机器epsilon是由浮点运算引起的相对误差的上限。换句话说,这将是真实浮点数与计算机上计算的最大差值之间的最大差异,因为用于存储浮点数的位数有限。

如果你还记得,浮点数不可避免地在你的计算机上表示为二进制位(或几乎任何数字)。就IEEE 754 floating point standard而言,MATLAB假设所有数值都是double类型,它将浮点数表示为64位。显然,您可以通过显式转换为其他类型来覆盖此行为。对于{75}浮点标准,对于double精度类型数,有52位代表数字的小数部分。

这是我正在谈论的一个很好的图表:

来源:Wikipedia

您会看到为数字的符号保留了一位,为指数基数保留了11位,最后,为小数部分保留了52位。总共加起来为64位。小数部分是基数2的集合或总和,负指数从-1下降到-52。浮点数的MSB以2^{-1}开头,一直到2^{-52}作为LSB。本质上,机器epsilon计算两个数字之间二进制增加1位的最大分辨率差异,因为它们具有相同符号和相同指数基数。从技术上讲,机器epsilon实际上等于2^{-52},因为这是浮点中单个位的最大分辨率,考虑到我之前谈到的那些条件。

如果您实际上仔细查看上面的代码,除以2的除法是位移您的数字在每次迭代时向右移动一个位置,从整数值1开始,或{ {1}},我们取这个数字并将其加到1.我们保持位移,通过将该位移值加1来看看该值等于什么,然后我们上升到我们的位置位移到右侧,不再记录更改。如果您再向右移位,由于下溢,该值将变为 0 ,因此2^{0},这不再是1.0 + 0.0 = 1.0,这就是> 1.0循环正在检查。

一旦while循环退出,正是这个阈值定义了机器epsilon。如果您有点好奇,如果您在命令提示符中输入while,您将获得2^{-52}等于的内容:

eps

这是有道理的,因为你将一位向右移动了52次,而循环停止之前的点将是它的LSB,即>> 2^-52 ans = 2.220446049250313e-16 。为了完整,如果你要在2^{-52}循环中放置一个计数器,并计算while循环执行的次数,它将执行52次,代表52位转换为右边:

while

答案 1 :(得分:0)

看起来你可能想要这样的东西:

eps = 1;

while (1.0 + eps > 1.0)
    eps = eps /2;
end

答案 2 :(得分:0)

虽然上面有一个很好的答案,但我想我会添加一个提到的 Octave 和 Matlab 方法[1]。

>> a = 1; b = 1; while a+b~=a; b= b/2; end

读作 a 加 b 不等于 a。

参考文献:

[1] 阿尔菲奥·夸特罗尼、福斯托·萨利里和保拉·杰瓦西奥。 2016. 使用 MATLAB 和 Octave 进行科学计算。 Springer Publishing Company, Incorporated。