(转)不可将浮点变量用“==”或“!=”与任何数字比较。

问:我想比较两个浮点型变量,应该怎么比较? 

答:大于、小于直接比较啊。  
  等于最好这样:  

  const   float   E   =   1e-6;   
  float   f1   ,   f2;   
  //……   
  if(fabs(f1- f2)   <   E)   
  {……}

----------------------------------------------------------------------------
  不可将浮点变量用“==”或“!=”与任何数字比较。
   千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

假设浮点变量的名字为x,应当将  

if (x == 0.0)     // 隐含错误的比较

转化为

if ((x>=-EPSINON) && (x<=EPSINON))

其中EPSINON是允许的误差(即精度)。

..........................................................................................................................................................

好奇怪的循环问题

#include
void main ()
 {
   float percent;

   for (percent = 0.0; percent <= 1.0; percent += 0.1)
     printf("%3.1f/n", percent);
 }

上面这个循环运行10次

     for (percent = 0; percent < =10; percent += 1)
     printf("%3.1f/n", percent);

改成整数后,就运行11次了

..........................................................................................................................................................

这是数据精度的问题,浮点数的比较一般不用==判断,而是比较差值是否大于1E-6甚至更高精度。

for (percent = 0.0; percent <= 1.0; percent += 0.1)
     printf("%3.1f/n", percent);

将%3.1改为%3.7f,或%3.8f甚至更多位,可以明显发现数据的值不是完全的0.0,0.1,0.2,0.3这样加0.1。我们认为的1.0在内存里是1.000000119(我是%3.9f时得出的),它大于1.0,不执行了,所以只执行10次了。

for (percent = 0.0; percent <= 2.0; percent += 0.1)
     printf("%3.9f/n", percent);  //这时可以看到0到1.0的真实数据

原文:http://blog.csdn.net/toonny1985/article/details/4794866

posted @ 2012-05-24 11:38  ForFreeDom  阅读(1337)  评论(0编辑  收藏  举报