迭代C ++中的浮点范围

时间:2014-03-13 19:55:50

标签: c++ floating-point floating-accuracy

我想迭代一系列浮点数,例如以下示例。

for (double d = 1.0; d <= 2.0; d += 0.1)
{
   cout << d << endl;
}

因为无法准确表示0.1,所以不打印2.0的最后一个值。

如何确保不会省略此案例和类似案例中的最后一个值?

5 个答案:

答案 0 :(得分:11)

循环整数,除以浮点数:

#include <iostream>
#include <iomanip>

int main()
{
  std::cout << std::setprecision(1) << std::fixed;

  for (int d = 10; d <= 20; ++d)
  {
     std::cout << d/10. << std::endl;
  }
}

输出:

1.0
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0

答案 1 :(得分:4)

由于浮点数在这种情况下不准确,我通常会通过&#34;模拟&#34;他们通过整数。至少对于像这样的简单案例。

for (int i = 10; i <= 20; ++i)
{
   cout << i / 10.0 << endl;
}

这应该为您提供最接近任何值的浮点数。

答案 2 :(得分:3)

如果你使用固定增量(如你的例子),一种方法是使用整数:

for (int i = 10; i != 20; ++i)
{
   cout << (i / 10.0) << endl;
}

答案 3 :(得分:1)

最好使用并更新整数值来控制循环。并使用和更新浮点值以用于输出。我假设你的真实案例比这更复杂。

这将执行循环正确的次数并保存int到float转换。双重值将是准确的,只要你不循环太多次或让它变得太大,那么你将开始得到舍入错误。一般来说,你可以想出办法来纠正这个问题,但是通过一个大小/范围的循环,这是一个无问题。

double d = 1.0;
for (unsigned i = 0; i <= 10; ++i, d += 0.1)
{
   cout << d << endl;
}

如果你想避免加0.1的累积舍入误差,可以这样做:

double d = 10.0;
for (unsigned i = 0; i <= 10; ++i, d += 1.0)
{
   cout << (d / 10.0) << endl;
}

这更准确,因为可以以浮点格式准确表示小整数。但是它会花费浮点除法,但仍然避免了int-to-float转换。

答案 4 :(得分:0)

for (double d = 1.0; d <= 2.02; d += 0.1)
{
   cout << d << endl;
}

比较双倍是相等的是努力工作,但稍微增加就可以了。