版權(quán)聲明:本文轉(zhuǎn)載于公眾號TeachPlus---C語言面試題---float值的對比
請寫出float x 與“零值”比較的if語句
答案:
const float EPSINON = 0.00001;
if((x>=-EPSINON)&&(x<=EPSINON))确丢;
本題解析
許多人看到這道題目的時候都會嗤之以鼻饮睬,覺得非常簡單,于是就寫下下面的代碼:
if(x==0.0);
if(xK找!=0.0);
偶爾可能還有個別人供填,會因?yàn)樽约鹤⒁饬藢懙氖?.0,而不是0而沾沾自喜罢猪,不過這樣的寫法均為
錯誤的寫法近她,為什么呢?因?yàn)閒loat的表示方法的問題膳帕,float本身就是不精確的粘捎,精確度在小數(shù)點(diǎn)
后6~7位,再往后的就不能保證數(shù)據(jù)的精確度了危彩。
大家可能知道攒磨,所有的數(shù)據(jù)存儲在內(nèi)存中都是以二進(jìn)制的方式進(jìn)行存儲的,首先說一下int類型汤徽,
任意的一個整數(shù)娩缰,都可以使用 a*2^n+b*2^(n-1)+...x*2^0? 來表示。也就是只要空間足夠大谒府,那么
就可以使用這種方式來表示所有的一切整數(shù)數(shù)字拼坎。
但是對于浮點(diǎn)數(shù)來說,在內(nèi)存中使用的是指數(shù)冪的形式進(jìn)行存儲的完疫,跟整數(shù)類型是不一樣的演痒。
float是 符號位+8bit的指數(shù)為+23bit的小數(shù)位組成的。那么這樣就會有一個問題趋惨,如果數(shù)據(jù)中的
小數(shù)位超過了用來表示小數(shù)位的bit長度鸟顺,就會有數(shù)據(jù)丟失了,這個時候通常計(jì)算機(jī)會按照一定的
規(guī)律進(jìn)行轉(zhuǎn)換得到一個非常接近的數(shù)值器虾,例如13.765432有時候得到的值卻是13.7654319讯嫂。這就
是所謂的float類型不精確的原因了。
相關(guān)知識點(diǎn)
與之相似的兆沙,還有這樣一道題目:
等式(a+b)+c==(b+a)+c和
(a+b)+c==(a+c)+b能否成立欧芽?
對于這道題目而言,答案也是不能夠成立的葛圃,在比較float或double時千扔,不能簡單地比較。由于計(jì)
算誤差库正,相等的概率很低曲楚。應(yīng)判斷兩數(shù)之差是否落在區(qū)間(-e,e)內(nèi)。這個e應(yīng)比浮點(diǎn)數(shù)的精度大
一個數(shù)量量級褥符。
除此之外龙誊,下面的一道題目也是非常經(jīng)典的面試題:
寫出bool,int喷楣,float指針變量與零值比較的if語句
//bool型數(shù)據(jù)if(flag)趟大;if(:资鳌flag);//int型數(shù)據(jù)if(0Q沸唷=flag)罕伯;if(0==flag);//指針型數(shù)據(jù)if(NULL==flag)叽讳;if(NULL5肪妗=flag);//float型數(shù)據(jù)define≌篱弧NORM 0.00001婿屹;if(flag>=∶鹈馈-NORM &&“豪falg<=NORM)届腐;
這里需要注意的就是在int,指針型變量和零值比較的時候蜂奸,把零值放在左邊犁苏,這樣當(dāng)把==誤寫成
=時,編譯器?可以報錯扩所,否則這樣邏輯錯誤不容易發(fā)現(xiàn)围详,并且可能導(dǎo)致很嚴(yán)重的后果。