c语⾔语句floatx的作⽤,浮点数⽐较有关问题(floatx与零值⽐
较)
浮点数⽐较问题(float x 与 '零值'⽐较)
今天在⽜客⽹上看到⼀道⾯试题,看完之后着实吃了⼀惊,⾃⼰平常都没有在意,看似简单的问题,实则考验了语⾔的基本功.
据说这是腾讯的⾯试题:
float x 与“零值”⽐较的if语句为?
if (x == 0)
if (x < 0.00001f)
if (fabs(x) < 0.00001f)
if (x > -0.00001f)
答案为C,fabs为求浮点数绝对值的函数浮点型变量float
1 fabs(x) < 0.00001f
2 //等价于(double)-0.00001f < (double)x && (double)x < (double)0.00001f
float的精度就在7,8位左右,⾃然只能取0.00001了.
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的⽐较
转化为
if ((x>=-EPSINON) && (x<=EPSINON))
其中EPSINON是允许的误差(即精度).在C中,ANSI C已经定义了这些常量:
载⼊头⽂件#include就可以引⽤
FLT_EPSILON
DBL_EPSILON
LDBL_EPSILON
这⼏个常量了。
结论:
因为float(double)在计算机内不能精确表⽰,判断相等时不能采⽤等于符号,两数之差⼩于⼀定的精度(⾃设定)时就认为其相等,在⽐较两个浮点数的时候,尽量避免使⽤"==" 或者"!="来进⾏直接⽐较,⽽是将其转化成">="或者"<="来⽐较;
许多论坛上经常有⼈问,为什么float或double型不能⽤来控制switch流程?答案也是因为这个,float⽆法作为常量值来进⾏⽐较.3楼garbageMan引⽤if (fabs(x) lt; 0.00001f),从这⾥能看出出题者是个半吊⼦2楼garbageMan引⽤if ((xgt;=-EPSINON) amp;amp; (xlt;=EPSINON)),这个也错了1楼garbageMan引⽤1 fabs(x) lt; 0.00001f,2 //等价于-0.00001f lt; x amp;amp; x lt; 0.00001f,错。,等价于(double)-0.00001f lt; (double)x amp;amp; (double)x lt; (double)0.00001fRe: ErosLii@garbageMan,谢谢指正~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论