我试图使用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再次尝试了这个并且它给出了正确的结果。谁能告诉我这里发生了什么?谢谢。
答案 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的阈值并且不仅仅是安全的。