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

本文探讨了浮点数的比较方法及精度问题,强调不应直接使用等号比较浮点数,而应通过判断两数之差是否小于某个小的正数来实现。文章还举例说明了由于浮点数精度限制导致的循环次数异常现象。

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

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

  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.youkuaiyun.com/toonny1985/article/details/4794866

转载于:https://www.cnblogs.com/ForFreeDom/archive/2012/05/24/2516285.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值