1

可能重复:
Matlab 给出错误答案

0:.1:1当我使用-range 函数时,谁能向我解释为什么会发生以下情况?

>> vecA = 0:.1:1;
>> vecB = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];
>> vecA == vecB

ans =

     1     1     1     0     1     1     1     1     1     1     1

为什么 vecA(4) 不等于 0.3?它们看起来完全一样;)

vecA =

  Columns 1 through 7

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000

  Columns 8 through 11

    0.7000    0.8000    0.9000    1.0000

>> vecB

vecB =

  Columns 1 through 7

         0    0.1000    0.2000    0.3000    0.4000    0.5000    0.6000

  Columns 8 through 11

    0.7000    0.8000    0.9000    1.0000

我认为这里的精度有问题吗?还是我的理解有问题?

4

2 回答 2

3

计算机是二进制的,它们的原生浮点格式不能精确存储小数。(您可以使用比率类型或定点小数类型,但使用这些类型的计算要慢得多。)

因此,测试浮点值是否相等实际上是没有用的。而是检查差异的绝对值。

你绝对应该阅读每个计算机科学家应该知道的关于浮点运算的知识

(也有一些更简单的解释,比如http://floating-point-gui.de/但是你应该用这些来帮助你理解Goldberg的论文,而不是代替它)


在这种情况下,您实际看到的是0.2 + 0.1 != 0.3(范围使用第一个版本,vecA(3) = vecA(2) + step

于 2012-06-11T13:33:39.687 回答
2

这可能是有限精度浮点运算的一般结果。尝试使用

    format long

然后输出值以查看更精确的显示。我会想象在内部 vecA 是使用循环和值递增或划分范围创建的,这会导致微小的差异。当您使浮点值相等时,您会遇到此问题。通常,这是直接比较浮点数的常见结果。

于 2012-06-11T13:33:00.313 回答