#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来判断一个数是否为整数(注意此整数是经过一系列的浮点运算或者函数运算后的整数)
|