matlab评估0.9 <0.9到'真'

时间:2014-04-10 14:54:21

标签: matlab

以下是我的matlab代码段:

clear all;
x0=0.5;
x2=1.4;
h=0.1;
while(x0<x2)
    x0=x0+0.1;
end
x0

毫无疑问x0的结果是1.4,让我困惑的是,当我将x2=1.4替换为x2=0.8, 0.9, 1.0, 1.1, or 1.2(其中任何一个人)时,结果会变得不正确。

例如,x2=0.9会使代码生成x0=1.0而不是x0=0.9。我发现在x0增加到0.9的过程中,x0<x20.9<0.9)会1(真),这肯定是错误的。

这里发生了什么?

3 个答案:

答案 0 :(得分:3)

基本上你不应该直接比较浮点数。 {3}由Sam Roberts提供,以便更好地理解这一点。

在二进制文件中,0.1成为计算机最终必须截断的重复小数。因此,每次添加0.1时,您并没有真正添加0.1和舍入误差化合物,最终导致您的比较丢失。所以你实际上并没有评估0.9 <0.9,而是截断的转换为二进制的总和为0.1 9倍,截断的二进制版本为0.9。数字不一样。

答案 1 :(得分:3)

我想稍微延长Dan的答案。运行以下代码:

clear all;
x0=0.5;
x2=0.9;
h=0.1;
while(x0<x2)
    x0=x0+0.1;
    disp(x2-x0); % <-- I added this line
end
x0

输出(ideone):

0.30000
0.20000
0.10000
1.1102e-16
-0.100000
x0 =  1.00000

输出的第4行显示舍入错误:将0.1添加到0.5四次后,结果将小于0.9:差异为1.1102e-16 。这就是x0最终成为1.0的原因。

答案 2 :(得分:0)

如果你真的需要比较浮点值,我建议你做一点不同的事情。你可以做类似于下面所写的事情;其中threshold是一个可接受的边际,即这个数量不同的数字,它们被认为是不同的,如果差异小于这个数量,它们被认为是相同的。

function result = floatCompare(a,b,operation,threshold)
    if nargin < 4
        threshold = eps;
    end
    if nargin < 3
        operation = 'eq';
    end
    switch operation
        case 'eq'
            disp('equals')
            result = abs(a-b) < threshold;
        case 'lt'
            disp('less than')
            result = b-a > threshold;
        case 'gt'
            disp('greater than')
            result = a-b > threshold;
    end
end