【发布时间】:2021-12-13 20:44:04
【问题描述】:
在过去的几周里,我被 Matlab 中的浮点比较问题折磨着。
我的代码涉及大量a<b 或c<=d。
让我抓狂的是
dw = 0.001;
W1 = [0:dw:1];
W2 = [0:dw:1];
那么我们有
>>W1(418) = 0.417000000000000
>>W2(418) = 0.417000000000000
>>W1(418)>=W2(418)
ans =
logical
0
>>W2(418)>=W1(418)
ans =
logical
1
我目前处理这个问题的方法是定义一个错误术语eps0 = 10^(-15)。然后,每当我希望拥有a<=b 时,我都会使用a<=b+eps0。
但我想知道是否有更通用的方法来解决这个问题? 我真的很感激!
【问题讨论】:
-
W1(418) == W2(418)是真的。事实上,all(W1==W2)也是如此。我看不出您的示例会如何,因为两个数组的构造相同。 -
@CrisLuengo 在我的 Matlab R2018a 中,
W1(418)==W2(418)返回 false。也许 Matlab 在以后的版本中解决了这个问题? -
@CrisLuengo 还是计算机硬件不同造成的?
-
我今天早些时候在 MATLAB 在线(在 Linux 上运行的 R2021b)中尝试了这个。我在 macOS 上运行 R2017a 和 R2018b,我看到
all(W1==W2)在两者中都返回true。如果~all(W1==W2)的唯一解释是W1和W2以不同的方式计算。每次您使用相同的输入运行相同的代码时,计算机都应该做完全相同的事情。硬件不可能改变这个结果,除非硬件有缺陷。但如果你有这样的缺陷,你早就注意到了。
标签: matlab floating-point floating-accuracy