matlab mod()函数给出了错误的答案

时间:2014-03-12 23:34:04

标签: matlab

我试图使用Matlab来解决一些问题,并在dt * j为整数时存储结果, 使用以下代码。

j=1;
dt = 1E-05;
a=[];
while dt*j <=20
    if mod(dt*j,1) ==0
        a=[a;[dt*j,j]];
    end
j=j+1;
end

但是Matlab给了我不正确的结果。一些整数(3,6,7,11等等)缺失,如下所示。

a =
1      100000
2      200000
4      400000
5      500000
8      800000
9      900000
10     1000000
16     1600000
17     1700000
18     1800000
19     1900000
20     2000000

我使用dt = 1E-4再次尝试了这个并且它给出了正确的结果。谁能告诉我这里发生了什么?谢谢。

2 个答案:

答案 0 :(得分:2)

不要直接将浮点数与==进行比较,而是检查它们是否非常接近:

j=1;
dt = 1E-05;
a=[];
while dt*j <=20
    if abs(mod(dt*j,1)) < 1e-10
        a=round([a;[dt*j,j]]);
    end
j=j+1;
end

答案 1 :(得分:0)

我猜测有一些奇怪的舍入错误。我尝试了你的代码,我得到了相同的结果。一种方法不是使用mod(dt * j,1)== 0,而是使用mod(dt * j,1)&lt; dt或mod(dt * j,1)&lt; thresh,你可以设置一个足够接近零的阈值,它可以完成这个任务。

在双精度浮点数格式页面的维基百科页面上,它说: 1.0000000000000002,最小数量&gt; 1。从那里我将使用双推断,你得到大约2E-16的数值分辨率。因此,您可以使用2E-15的阈值并且不仅仅是安全的。