当我使用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
我认为这里的精度存在问题?或者我的理解有问题吗?
答案 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是使用循环和值增量或范围的划分创建的,这导致了微小的差异。当你将浮点值等同时,你就会遇到这个问题。通常直接比较浮子是常见的结果。