if语句不在MATLAB中工作

时间:2014-09-17 15:07:31

标签: matlab floating-point floating-accuracy

我正在尝试在MATLAB中创建一个Euler近似函数。我应该在t = 0.1,0.2,0.3,0.4时进行评估,但由于某种原因,我的代码在0.3时没有评估。

这是我的代码:

clear; clc;
stepSizes = [0.1 0.05 0.025];
tInitial = 0;
yInitial = 1;
t = tInitial;
y = yInitial;

for step = 1:3
    stepSize = stepSizes(step);
    for tVal = 0:stepSize:0.4;
        slope = 3+t-y;
        yVal = y + slope*(tVal-t);
        fprintf('%0.3f\n',tVal);
        if tVal==0.1 || tVal==0.2 || tVal==0.3 || tVal==0.4
            fprintf('Stepsize: %0.3f, tVal = %0.3f, yVal = %0.3f.\n',...
                stepSize, tVal, yVal);
        end
        t = tVal;
        y = yVal;
    end
end

以下是我的一些打印输出,说明了我的问题。所有这些值都与我手工完成时得到的答案相符。

0.000
0.100
Stepsize: 0.100, tVal = 0.100, yVal = 1.200.
0.200
Stepsize: 0.100, tVal = 0.200, yVal = 1.390.
0.300
0.400
Stepsize: 0.100, tVal = 0.400, yVal = 1.744.

为什么tVal == 0.3的逻辑等于不起作用?

2 个答案:

答案 0 :(得分:4)

您正在使用浮点数。使用浮子时3 * 0.1不等于0.3。

What Every Computer Scientist Should Know About Floating-Point Arithmetic

检查容差abs(tVal-.3)<eps是否有简单的解决方法。

答案 1 :(得分:0)

您还可以使用round修复循环增量并测试真值

for tVal = round( (0:stepSize:0.4)*1000 )/1000 
    if tVal==0.1 || tVal==0.2 || tVal==0.3 || tVal==0.4