中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言浮點數之間的比較規則是什么

發布時間:2021-08-13 19:02:08 來源:億速云 閱讀:276 作者:chen 欄目:開發技術

這篇文章主要介紹“C語言浮點數之間的比較規則是什么”,在日常操作中,相信很多人在C語言浮點數之間的比較規則是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言浮點數之間的比較規則是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • 你認為這段代碼輸出什么?

  • 為什么不等于呢?

  • 應該怎么解決?

    • 那么怎么判斷兩個浮點數 f1 和 f2 相等呢。

      • 偽代碼

      • 可以簡化為 >>

  • 怎么判斷浮點數等于0?

    • 還有一個問題


你認為這段代碼輸出什么?

int main()
{
	float f1 = 1.1;
	float f2 = 2.2;
	if (f2 - 1.1 == f1)
		printf("等于");
	else
		printf("不等于");
	return 0;
}

答案是不等于。

C語言浮點數之間的比較規則是什么

為什么不等于呢?

因為在C語言中浮點數是存在精度損失的,有可能比原來的數大,也有可能小。 在下圖所示,f1在打印小數點后30位時就能很明顯的看出存在精度損失。

C語言浮點數之間的比較規則是什么

應該怎么解決?

浮點數不能直接用 == 號比較。那么應該怎么比較呢。

這里要引出精度這個概念,精度可以理解為引發一個浮點數發生改變的最小值。

當一個浮點數加上精度或者減去精度,都不等于該數本身。

精度可以是自己定義的,也可以用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類型的精度。

那么怎么判斷兩個浮點數 f1 和 f2 相等呢。

雖然兩個浮點數存在精度上的誤差,但這個誤差非常小,只要(f2 - f1)這個差值在負精度到正精度的區間內,就可以認為它們相等。

如圖,它們的差值必須在 (-XXX_EPSILON,XXX_EPSILON) 這個區間內,才能說明它們相等。

C語言浮點數之間的比較規則是什么

偽代碼
if(f2 - f1) > -XXX_EPSILON  && (f2 - f1)< XXX_EPSION){相等;}
可以簡化為 >>
if (fabs(f2 - f1) < XXX_EPSILON) //fabs函數求絕對值,在math.h頭文件中{相等;}

怎么判斷浮點數等于0?

這個浮點數的絕對值小于精度,可以認為這個數為0。

if (fabs(f1) < XXX_EPSILON)
{
	//f1為0
}

還有一個問題

// 判斷f1為0的條件 < 能換成 <= 嗎

if (fabs(f1) < XXX_EPSILON) ->>  if (fabs(f1) <= XXX_EPSILON)

0的性質:任何數加上0,都等于它本身。
而上述也講了精度的定義為浮點數加上XXX_ESILON 都會發生改變,如果 f1 可以等于 XXX_ESILON ,不是說一個浮點數加上0會發生改變嗎,這明顯不符合0的性質。所以是開區間,只能是 < 。

到此,關于“C語言浮點數之間的比較規則是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

措勤县| 嘉鱼县| 广灵县| 黑河市| 兰考县| 昌黎县| 濮阳县| 镇原县| 缙云县| 宜良县| 固原市| 磐石市| 遂川县| 洞口县| 平乐县| 香格里拉县| 霍林郭勒市| 新泰市| 桦甸市| 静乐县| 乌鲁木齐市| 东阳市| 成安县| 融水| 岳池县| 绵阳市| 方城县| 依安县| 鸡泽县| 旺苍县| 星子县| 贡山| 汉源县| 濮阳市| 芦山县| 石家庄市| 察隅县| 苏尼特左旗| 中西区| 闸北区| 隆昌县|