您好,登錄后才能下訂單哦!
這篇文章主要介紹“C語言浮點數(shù)之間的比較規(guī)則是什么”,在日常操作中,相信很多人在C語言浮點數(shù)之間的比較規(guī)則是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言浮點數(shù)之間的比較規(guī)則是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
你認為這段代碼輸出什么?
為什么不等于呢?
應該怎么解決?
那么怎么判斷兩個浮點數(shù) f1 和 f2 相等呢。
偽代碼
可以簡化為 >>
怎么判斷浮點數(shù)等于0?
還有一個問題
int main() { float f1 = 1.1; float f2 = 2.2; if (f2 - 1.1 == f1) printf("等于"); else printf("不等于"); return 0; }
答案是不等于。
因為在C語言中浮點數(shù)是存在精度損失的,有可能比原來的數(shù)大,也有可能小。 在下圖所示,f1在打印小數(shù)點后30位時就能很明顯的看出存在精度損失。
浮點數(shù)不能直接用 == 號比較。那么應該怎么比較呢。
這里要引出精度這個概念,精度可以理解為引發(fā)一個浮點數(shù)發(fā)生改變的最小值。
當一個浮點數(shù)加上精度或者減去精度,都不等于該數(shù)本身。
精度可以是自己定義的,也可以用C語言自帶的,它定義在 float.h 頭文件中。
#define FLT_EPSILON 1.192092896e-07F // smallest such that 1.0+FLT_EPSILON != 1.0 #define DBL_EPSILON 2.2204460492503131e-016 // smallest such that 1.0+DBL_EPSILON != 1.0
FLT_EPSILON 為float類型的默認精度,DBL_EPSILON 為double類型的精度。
雖然兩個浮點數(shù)存在精度上的誤差,但這個誤差非常小,只要(f2 - f1)這個差值在負精度到正精度的區(qū)間內(nèi),就可以認為它們相等。
如圖,它們的差值必須在 (-XXX_EPSILON,XXX_EPSILON) 這個區(qū)間內(nèi),才能說明它們相等。
if(f2 - f1) > -XXX_EPSILON && (f2 - f1)< XXX_EPSION){相等;}
if (fabs(f2 - f1) < XXX_EPSILON) //fabs函數(shù)求絕對值,在math.h頭文件中{相等;}
這個浮點數(shù)的絕對值小于精度,可以認為這個數(shù)為0。
if (fabs(f1) < XXX_EPSILON) { //f1為0 }
// 判斷f1為0的條件 < 能換成 <= 嗎
if (fabs(f1) < XXX_EPSILON) ->> if (fabs(f1) <= XXX_EPSILON)
0的性質(zhì):任何數(shù)加上0,都等于它本身。
而上述也講了精度的定義為浮點數(shù)加上XXX_ESILON 都會發(fā)生改變,如果 f1 可以等于 XXX_ESILON ,不是說一個浮點數(shù)加上0會發(fā)生改變嗎,這明顯不符合0的性質(zhì)。所以是開區(qū)間,只能是 < 。
到此,關(guān)于“C語言浮點數(shù)之間的比較規(guī)則是什么”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。