Matlab - “0:.1:1”意外的精确行为

时间:2012-06-11 13:24:53

标签: matlab floating-point precision floating-accuracy floating-point-precision

  

可能重复:
  Matlab gives wrong answer

当我使用0:.1:1 - 范围函数时,有人可以向我解释为什么会发生以下情况吗?

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

我认为这里的精度存在问题?或者我的理解有问题吗?

2 个答案:

答案 0 :(得分:3)

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

因此,测试浮点值是否相等实际上是无用的。请改为检查差异的绝对值。

你一定要阅读What Every Computer Scientist Should Know About Floating Point Arithmetic

(还有一些更简单的解释,例如http://floating-point-gui.de/,但您应该使用这些来帮助您理解Goldberg的论文,而不是替换它。)


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

答案 1 :(得分:2)

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

    format long

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