码迷,mamicode.com
首页 > 其他好文 > 详细

浮点数陷阱

时间:2020-12-31 12:21:10      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:names   double   运算   pac   程序   等于   div   使用   产生   

对于程序

#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

 

 

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

浮点数陷阱

标签:names   double   运算   pac   程序   等于   div   使用   产生   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!