C语言面试题---float值的对比
版权声明:本文转载于公众号TeachPlus---C语言面试题---float值的对比
请写出float x 与“零值”比较的if语句
答案:
const float EPSINON = 0.00001;
if((x>=-EPSINON)&&(x<=EPSINON));
本题解析
许多人看到这道题目的时候都会嗤之以鼻,觉得非常简单,于是就写下下面的代码:
if(x==0.0);
if(x!=0.0);
偶尔可能还有个别人,会因为自己注意了写的是0.0,而不是0而沾沾自喜,不过这样的写法均为
错误的写法,为什么呢?因为float的表示方法的问题,float本身就是不精确的,精确度在小数点
后6~7位,再往后的就不能保证数据的精确度了。
大家可能知道,所有的数据存储在内存中都是以二进制的方式进行存储的,首先说一下int类型,
任意的一个整数,都可以使用 a*2^n+b*2^(n-1)+...x*2^0 来表示。也就是只要空间足够大,那么
就可以使用这种方式来表示所有的一切整数数字。
但是对于浮点数来说,在内存中使用的是指数幂的形式进行存储的,跟整数类型是不一样的。
float是 符号位+8bit的指数为+23bit的小数位组成的。那么这样就会有一个问题,如果数据中的
小数位超过了用来表示小数位的bit长度,就会有数据丢失了,这个时候通常计算机会按照一定的
规律进行转换得到一个非常接近的数值,例如13.765432有时候得到的值却是13.7654319。这就
是所谓的float类型不精确的原因了。
相关知识点
与之相似的,还有这样一道题目:
等式(a+b)+c==(b+a)+c和
(a+b)+c==(a+c)+b能否成立?
对于这道题目而言,答案也是不能够成立的,在比较float或double时,不能简单地比较。由于计
算误差,相等的概率很低。应判断两数之差是否落在区间(-e,e)内。这个e应比浮点数的精度大
一个数量量级。
除此之外,下面的一道题目也是非常经典的面试题:
写出bool,int,float指针变量与零值比较的if语句
//bool型数据if(flag);if(!flag);//int型数据if(0!=flag);if(0==flag);//指针型数据if(NULL==flag);if(NULL!=flag);//float型数据define NORM 0.00001;if(flag>= -NORM && falg<=NORM);
这里需要注意的就是在int,指针型变量和零值比较的时候,把零值放在左边,这样当把==误写成
=时,编译器器可以报错,否则这样逻辑错误不容易发现,并且可能导致很严重的后果。