为什么是死循环

来源:互联网 发布:阿里云开放课堂 编辑:程序博客网 时间:2024/05/17 09:04

让我们先来看看这个语句:

for(double d=0; d != 5.0; d += 0.1)
{
        std::cout << d << std::endl;
        //或者做其它的事
}

 

问题是,如果哪位现在去运行上述的代码,把它放到一个main里面,那么会发现屏幕上会一直打印不停。这是为什么?在我们大脑中,这个循环总会在d==5.0的时候停止的。

解答

要解答这个问题并不是很难,只要给大家一点提醒,大家就会立刻明白。计算机中使用什么来存储实数──浮点数的格式,这是一个二进制的格式,需要告诉大家的是:0.1不能在浮点格式的实数中精确表示,它是一个无穷循环小数。理解这一点对于二进制不在熟悉的可能有点困难,大家可以考虑一个生活在常见的例子:1/3,这个数大家都很熟悉,它在十进制中不能精确表示,因为它是0.3333333……。我们知道,1/3 + 1/3 + 1/3是1,但是我们肯定不会有0.3333 + 0.3333 + 0.33333是1的结果,无论如何1/3不能在二进制中精确表示,此时我们就永远不会有1这个结果。

同样的道理,在二进制中我们永远不能把0.1精确表示,此时无论你怎么把0.1加也不会产生5.0的结果,所以那个不等式(d != 5.0)始终成立,从而产生了死循环!

这个问题提醒我们:计算机中处理数值是有限精度的,所以在许多时候我们必须去考虑数值的精度,尤其是二进制精度。对于上面的例子,我们似乎更应该这么写:

for(double d=0; d <= 5.0; d += 0.1)
{
        std::cout << d << std::endl;
        //或者做其它的事
}

 

此时就不会出现死循环了,因为总会有一个时刻d会不小于5.0。

原创粉丝点击