2014-03-12 84 views
0

我试图用Matlab解决一些问题,并在dt * j为整数时存储结果,使用下面的代码 。matlab mod()函数给出了错误的答案

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,它给出了正确的结果。谁能告诉我这里发生了什么?谢谢。

+3

浮点精度错误的另一个例子。它不是'mod'那是错误的,'dt * j'不是精确的预期值。 – Daniel

+0

是的,dt * 300000 == 3 ans = 0但dt * 400000 == 4,ans = 1我很困惑,因为只有一些数字丢失,但我想它涉及如何计算机存储号 – user3413078

+0

这是一个浮点算术。有一些问题:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Daniel

回答

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 
+0

谢谢!有用。我之前使用过这个==比较,但这个问题直到今天才出现...... – user3413078

0

我猜有一些奇怪的舍入误差。我试过你的代码,我得到了相同的结果。一种方法是使用mod(dt * j,1)== 0,使用mod(dt * j,1)< dt或mod(dt * j,1)< thresh,您可以在其中设置阈值足够接近零,它会做的伎俩。

从双精度浮动数字格式页面上的维基百科页面,它表示: 1.0000000000000002,最小的数字> 1。由此我推断,使用双倍,你得到约2E-16数值分辨率。因此,您可以使用2E-15的阈值并且更安全。

+0

数值分辨率由'eps'给出,实际上它大约是2e-16 –

相关问题