C语言&嵌入式C语言从入门到精通

C语言面试题---float值的对比

2017-12-21  本文已影响13人  安想创新教育

版权声明:本文转载于公众号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,指针型变量和零值比较的时候,把零值放在左边,这样当把==误写成

=时,编译器器可以报错,否则这样逻辑错误不容易发现,并且可能导致很严重的后果。

上一篇下一篇

猜你喜欢

热点阅读