首页 > 其他 > 详细

浮点数陷阱

时间:2020-12-26 20:28:47      阅读:49      评论:0      收藏:0      [点我收藏+]

对于程序

#include<iostream>
using namespace std;
int main()
{
    double i;
    for(i=0; i!=10; i+=0.1){
        printf("%.lf\n", i);
//        printf("%.16lf\n", i);
    }
    return 0;
 } 

应该是在一百次循环后停止,然而实际结果是无限循环

原因是浮点数的小数运算会产生极其微小的误差

如截取部分输出样例:

0.0000000000000000
0.1000000000000000
0.2000000000000000
0.3000000000000000
0.4000000000000000
0.5000000000000000
0.6000000000000000
0.7000000000000000
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
1.2000000000000000
1.3000000000000000
1.4000000000000001
1.5000000000000002
1.6000000000000003
1.7000000000000004

可以发现从0.7开始逐渐产生误差,而这种微小的误差会被for循环中的判断条件所发现,于是造成i始终不会等于10

 

 

所以在判断条件中尽量不要使用浮点数,避免造成上面出现的死循环

浮点数陷阱

原文:https://www.cnblogs.com/ZGCblogs/p/14193903.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!