设为首页 加入收藏

TOP

float x 与“零值”比较的if语句(一)
2014-04-06 17:41:29 来源: 作者: 【 】 浏览:289
Tags:float  零值 比较 语句

  请写出 float x 与“零值”比较的 if 语句:

  const float EPSINON = 0.00001;

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

  不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。

  EPSINON应该是一个很小的值吧 因为计算机在处理浮点数的时候是有误差的,所以判断两个浮点数是不是相同,是要判断是不是落在同一个区间的,这个区间就是 [-EPSINON,EPSINON] EPSINON一般很小,10的-6次方以下吧,具体的好像不确定的,和机器有关浮点数等值比较使用下式:

  #include

  #include

  fabs(a - b) < FLT_EPSILON

  三个EPSILON:

  FLT_EPSILON

  DBL_EPSILON

  LDBL_EPSILON

  为什么浮点数不能直接作“等值比较”?

  在以前看书或看文章就知道有这件事了。知道是因为“精度”,但一直没有真正想过问题的严重性。

  今天在易自考www.ezikao.com.cn看到一个帖子,顺便搜索了一下,测试结果让我信服了这条规则:

  易自考帖子:http://www.ezikao.com.cn/bbs_disp.asp boardid=47&id=79506

  以下内容引用自林锐《高质量C/C++代码编写指南》

  4.3.3 浮点变量与零值比较

   【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。

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

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

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

  转化为

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

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

  最好定义一个符号常量来做。#define EPSINON 1e-6

  我想是因为浮点数表示范围大,如果一个数已经很小的时候,就可以认为是0了,epsinon嘛,limit,极限什么的。

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言main函数生成可执行法 下一篇C中的define 特殊用法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: