MATLAB - 计算机器epsilon

Vzq*_*van 5 matlab epsilon numerical-methods

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

eps = 1;

while 1.0 + eps > 1.0 do
    eps = eps /2;
end
Run Code Online (Sandbox Code Playgroud)

但是,它告诉我这个:

Undefined function or variable 'do'. 
Error in epsilon (line 3) 
while 1.0 + eps > 1.0 do
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

ray*_*ica 20

首先,do在MATLAB中没有关键字这样的东西,所以从你的代码中消除它.另外,不要eps用作实际变量.这是MATLAB中预定义的函数,用于计算机器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
Run Code Online (Sandbox Code Playgroud)

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

>> format long
>> macheps

macheps =

     2.220446049250313e-16

>> eps

ans =

     2.220446049250313e-16
Run Code Online (Sandbox Code Playgroud)

奖金

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

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

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

资料来源:维基百科

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

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

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

>> 2^-52

ans =

     2.220446049250313e-16
Run Code Online (Sandbox Code Playgroud)

这是有意义的,因为你将一个位向右移动52次,并且循环停止之前的点将是它的LSB,即2^{-52}.为了完成,如果你要在while循环中放置一个计数器,并计算while循环执行的次数,它将执行恰好52次,表示向右移动52位:

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

>> count

count =

  52
Run Code Online (Sandbox Code Playgroud)