【发布时间】:2014-08-12 13:32:11
【问题描述】:
In this answer gire 提到在比较双打时最好不要使用==。
当使用start:step:stop 表示法在for 循环中创建增量变量时,它的类型将是double。如果要使用此循环变量进行索引和== 比较,是否会因浮点精度而导致问题?!
应该使用整数吗?如果是这样,有没有办法用s:s:s 表示法做到这一点?
这是一个例子
a = rand(1, 5);
for ii = length(a):-1:1
if (ii == 1) % Comparing var of type double with ==
b = 0;
else
b = a(ii); % Using double for indexing
end
... % Code
end
【问题讨论】:
-
如果您的增量本身是整数,我认为这并不适用。我的意思是,我猜它可能会出错,但由于您没有处理任何小数点,我认为您的计算机无法准确表示所有这些数字,因此比较应该成立。问题不在于 double 类型本身,而在于存在以十进制形式表示的分数(具有有限精度)可能需要更高的精度(甚至无限精度)才能以二进制表示。如果您在循环中通过
-1,我认为使用==是安全的 -
Octave 的常见问题解答中有一个条目,Why is this floating point computation wrong?,它解释了一切。它链接到一篇非常好的文章What Every Computer Scientist Should Know About Floating Point Arithmetic
-
但是请注意,在那个答案中,Gire 没有谈论循环索引。您在该问题中检查的条件是不能保证是“整数”(
a是未指定计算的结果),因此他的观点在这种情况下肯定是有效的。