为什么是死循环
来源:互联网 发布:阿里云开放课堂 编辑:程序博客网 时间:2024/05/17 09:04
让我们先来看看这个语句:
for(double d=0; d != 5.0; d += 0.1)
{
std::cout << d << std::endl;
//或者做其它的事
}
{
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;
//或者做其它的事
}
{
std::cout << d << std::endl;
//或者做其它的事
}
此时就不会出现死循环了,因为总会有一个时刻d会不小于5.0。
- 为什么是死循环
- 是死循环!
- 为什么会陷入死循环
- 为什么会陷入死循环
- 为什么死循环占用CPU高
- vfork为什么会出现死循环
- Looper.loop死循环为什么不会卡死
- 一道是死循环的题目
- 又是二分(避免死循环)
- 为什么死循环占用CPU高[整理贴]
- Java HashMap多线程下为什么会死循环?
- 并发的HashMap为什么会引起死循环?
- 并发的HashMap为什么会引起死循环
- 为什么Looper死循环不阻塞主线程
- 为什么说looper.loop执行死循环没有导致ANR
- 死循环
- 死循环
- 死循环
- 在线制作LOGO图片仿51.LA的系统源代码
- C语言:TurboC高级编程之进阶篇【2】:用C语言画分形图
- linux设备文件实现
- HTC G2刷机教程
- 栈
- 为什么是死循环
- 好
- 2-sat POJ 3678
- 常用的sql语句
- 关于HTML中的滚动条/去掉滚动条
- 使用lua_next()遍历表
- DWROD_PTR LLONG_MIN无定义的问题
- 为什么整数可以转换为指针
- archlinux平台下 tftp-hpa 的安装配置笔记