如何在c++中解决这个for循环?

How do I solve this for loop in C++?

本文关键字:for 循环 解决 c++      更新时间:2023-10-16
for(float i=1; i<=1.5; i+=0.1) 
{
  // statements
}

上面的c++ for循环运行5次。这不是应该运行6次吗?

这是浮点精度错误的一个很好的例子。像0.1、0.2的倍数这样的精确值不能在计算机内存内部精确地表示。您需要使用EPSILON (http://en.cppreference.com/w/cpp/types/numeric_limits/epsilon)

进行比较

之类的
for (float i = 1; fabs(1.5 - i) < EPSILON; i+=0.1) {
  //statements
}

这是因为0.1的倍数不能精确地以二进制表示,而存储的实际值可能是略小于0.1的近似值。因此,5*0.1可能小于0.5,也可能大于0.5(取决于浮点值的表示方式)。

使用浮点变量(以及涉及浮点值相等或不相等的测试)来控制循环通常是一个非常糟糕的主意。影响可能包括运行超出预期的次数(或更少),或者在某些糟糕的情况下,运行有限次数的无限循环。

在你的情况下,你最好这样做

for (int i = 0; i < 5; ++i)
{
     float value = 1.0 * i*0.1;
       // use value here rather than the i in your original code
}

或者,您可以使用一些允许浮点不精确的测试(例如,将i - 1.5与某些值(如机器epsilon)进行比较)。这样做的问题是,迭代的实际次数仍然可能具有某种程度的不可预测性,特别是在涉及大量迭代的循环中(例如,在0.01的步骤中从1.0迭代到50000.0),因为舍入误差可能在循环期间的不同阶段累积或消除。