MatLab - 比较两个浮点数时如何接受公差

时间:2014-08-21 08:48:33

标签: matlab floating-point comparison numerical-methods numerical-integration

我试图在数值方法中使用复合梯形法则来计算积分的函数。但问题是,当我要检查输入数据点是否等间隔时,出现错误。由于浮点数。 这是我的代码

    function answer = composite_trapezoidal (X, Y)
lx = length(X);
ly = length(Y);
h = X(2) - X(1);
validity = 1;
series_sum = 0;
answer = 0;

if (lx ~= ly)
    fprintf('Error ! Dimensions Of Data Point Vectors Doesn''t Match\n');
else
    for i = 1:lx - 1
        hTmp = X(i + 1) - X(i);
        if (hTmp ~= h)
            validity = 0;
            fprintf('Invalid Data Points. Data Must Be Equally Spaced !\n');
            break;
        end
    end
end

if (validity == 1)
    for i = 2:lx - 1
        series_sum = series_sum + Y(i);
    end
    answer = (h / 2) * (2 * series_sum + Y(1) + Y(ly));
end

考虑输入x = linspace(0, 2, 7); 然后函数终止于"数据点不是等间隔的"。但问题是它们是使用linspace计算的。 我能理解这个问题。点数为0,0.3333333,0.6666667等。因此,在向上舍入时它们的间距不等。但问题是我们可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

使用舍入数字检查相等性通常是不稳定的。 您可以尝试使用可接受的容差,例如abs(hTmp-h)< 10 ^ -4或甚至更好地使用相对容差abs(hTmp-h)/ abs(hTmp)< 10 ^ -2

答案 1 :(得分:1)

考虑在比较中使用公差,因为浮动操作在一定精度内是精确的(参见this page)。通常使用eps,通常使用此值的多个容差。