2015-09-10 51 views
0
for(float i=1; i<=1.5; i+=0.1) 
{ 
    // statements 
} 

上面的C++ for循环运行5次。不应该运行6次?如何解决C++中的循环?

+0

您需要阅读http://floating-point-gui.de/ –

+0

如果您将1.3表示为“0.33333333”,您必须从1减去1/3,然后小于或等于零? –

回答

0

正是由于0.1倍数不能准确二进制提出,并存储的实际值是近似的,可能是略低于0.1。因此,5*0.1可能小于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一些值,比如机器精度) 。与此相关的是,迭代的实际数量仍然可能具有某种程度的不可预测性,特别是在涉及大量迭代的循环中(例如从1.050000.00.01的步骤迭代),因为舍入误差可以累积或抵消在循环过程中的不同阶段。