5

我需要找到机器 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

我应该怎么办?

4

3 回答 3

24

首先,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

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

>> format long
>> macheps

macheps =

     2.220446049250313e-16

>> eps

ans =

     2.220446049250313e-16

奖金

如果您不知道,机器 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

这是有道理的,因为您将一位向右移动 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
于 2014-12-16T18:54:03.323 回答
0

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

eps = 1;

while (1.0 + eps > 1.0)
    eps = eps /2;
end
于 2014-12-16T18:35:17.307 回答
0

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

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

它被读作a加b不等于a。

参考:

[1] Alfio Quarteroni、Fausto Saleri 和 Paola Gervasio。2016. 使用 MATLAB 和 Octave 进行科学计算。施普林格出版公司,股份有限公司。

于 2021-04-01T02:24:03.443 回答