【问题标题】:matlab mod() function gives wrong answersmatlab mod() 函数给出错误答案
【发布时间】:2014-03-13 07:51:40
【问题描述】:

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

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

【问题讨论】:

  • 浮点精度错误的另一个例子。 Its not mod` 错了,dt*j 不是预期值。
  • yes, dt*300000==3 ans = 0 but dt*400000==4, ans = 1 我很困惑,因为只有一些数字丢失,但我想这与计算机存储数字的方式有关
  • 这是一个浮点运算的问题。有一些问题:docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

标签: matlab


【解决方案1】:

不要直接将浮点数与== 比较,而是检查它们是否真的很接近:

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

【讨论】:

  • 谢谢!有用。我之前使用过这个 == 比较,但直到今天才出现这个问题......
【解决方案2】:

我猜有一些奇怪的舍入错误。我试过你的代码,我得到了相同的结果。一种方法不是使用 mod(dt*j,1) ==0,而是使用 mod(dt*j,1)

来自双精度浮点数格式页面上的维基百科页面,它说: 1.00000000000000002,最小的数 > 1 。从中我会推断,使用双精度,你会得到大约 2E-16 的数值分辨率。因此,您可以使用 2E-15 的阈值并且非常安全。

【讨论】:

  • 数值分辨率由eps给出,确实是2e-16左右
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2020-02-16
相关资源
最近更新 更多