好的,使用double进行==比较和索引?

时间:2014-08-12 13:32:12

标签: matlab loops octave

提到

In this answer gire在比较双打时最好不要使用==

使用for表示法在start:step:stop循环中创建增量变量时,其类型将为 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

2 个答案:

答案 0 :(得分:7)

请注意,浮点双精度指定使用52位来存储尾数(小数点后面的部分),因此您可以完全表示范围内的任何整数

-4503599627370496 <= x <= 4503599627370496

请注意,这大于int32的范围,而int32只能代表

      -2147483648 <= x <= 2147483647

如果您只是将double用作循环变量,并且仅以整数步长递增,并且您的计数不超过4,503,599,627,370,496,那么您可以使用double,并使用==来比较双精度

人们建议不使用双打的一个原因是你不能准确地表示一些常见的小数,例如: 0.1没有精确表示为double。因此,如果您正在使用货币值,最好将数据单独存储为int并记住比例因子为10x或100x或其他。

有时直接比较浮点数是否相等是不好的,因为舍入问题可能导致两个浮点数不相等,即使这些数字在数学上是相等的。这种情况通常发生在数字不能精确表示为浮点数时,或者当数字之间存在显着的大小差异时,例如。

>> 0.3 - 0.2 == 0.1
ans =
     0

答案 1 :(得分:3)

  • 如果您使用整数步长在整数范围之间进行索引(即使变量类实际上是double),也可以使用==与其他整数进行比较。
  • 如果你真的想要安全,你可以施放指数。

例如:

for ii = int16(length(a):-1:1)
    if (ii == 1)
       b = 0;
    end
end