分享

浮点运算误差问题

 超越梦想之上 2016-07-21

#include   <stdio.h>   
 main()
 {float i;

for(i=0;i!=1;i+=0.1)

 printf("%f\n",i);
 getch();}

有这么一道非常简单的问题,在正常运算情况下的结果恐怕大家都知道的,但在程序执行的时候则会产生不同的结果而变成了一个死循环。问题在什么地方?初学者都不明所以,在这里简单的介绍一下。我们知道十进制和二进制的转化关系(小数部分):乘2取整正序排列。但我们发现在0.1 此数转化的时候并不能得到一个准确的二进制数。离它最近的二进制小数是0.00011……,也就是十进制的0.099……,而计算机的存储空间是有限的,所以我们得不到准确的二进制数,程序在执行时并不是按0.1计算,而是按0.099……计算,所以永远不会出现i==1的情况,也就出现了死循环的情况。

同理看下面的程序:

 #include   <stdio.h>    
 main()
 {float a,b,c;
 a=0.99999999;
 b=1.0;
  if(a==b)
printf("ddddd");
 getch();}

在执行中,a和b的值认为是相等的,输出界面为浮点运算误差问题

所以经过一系列的浮点运算或者函数运算后,一个数的准确值应该是整数却变成了小数,如1变成了0.999999999999……  我们可以用floor(x+0.5)==x来判断一个数是否为整数(注意此整数是经过一系列的浮点运算或者函数运算后的整数)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多