最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你了解C語言浮點數(shù)之間的比較規(guī)則

 更新時間:2021年08月13日 16:10:08   作者:小狗吠吠吠  
這篇文章主要介紹了魔性的float浮點數(shù)精度問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

你認(rèn)為這段代碼輸出什么?

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位時就能很明顯的看出存在精度損失。

在這里插入圖片描述

應(yīng)該怎么解決?

浮點數(shù)不能直接用 == 號比較。那么應(yīng)該怎么比較呢。

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

當(dāng)一個浮點數(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類型的默認(rèn)精度,DBL_EPSILON 為double類型的精度。

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

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

如圖,它們的差值必須在 (-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ù)等于0?

這個浮點數(shù)的絕對值小于精度,可以認(rèn)為這個數(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ū)間,只能是 < 。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 深入了解C++11中promise和future的使用

    深入了解C++11中promise和future的使用

    C++11中promise和future機(jī)制是用于并發(fā)編程的一種解決方案,用于在不同線程完成數(shù)據(jù)傳遞(異步操作)。Promise和Future提供了訪問異步操作結(jié)果的機(jī)制,可以在線程之間傳遞數(shù)據(jù)和異常消息。本文就來聊聊二者的使用,希望對大家有所幫助
    2022-11-11
  • C語言快速掌握位段使用

    C語言快速掌握位段使用

    位段位段的聲明和結(jié)構(gòu)是類似的,但是也會有所不同,此篇文章將帶你了解位段是什么已以及位段的使用和位段的特性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • C/C++雜記 虛函數(shù)的實現(xiàn)的基本原理(圖文)

    C/C++雜記 虛函數(shù)的實現(xiàn)的基本原理(圖文)

    這篇文章主要介紹了C/C++雜記 虛函數(shù)的實現(xiàn)的基本原理(圖文),需要的朋友可以參考下
    2016-06-06
  • C++可擴(kuò)展性與多線程超詳細(xì)精講

    C++可擴(kuò)展性與多線程超詳細(xì)精講

    這篇文章主要介紹了C++可擴(kuò)展性與多線程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • C語言中#define預(yù)處理語法總結(jié)

    C語言中#define預(yù)處理語法總結(jié)

    C語言里可以用#define定義一個標(biāo)識符來表示一個常量。特點是:定義的標(biāo)識符不占內(nèi)存,只是一個臨時的符號,預(yù)編譯后這個符號就不存在了,也不做類型定義。預(yù)編譯又叫預(yù)處理
    2021-11-11
  • 十進(jìn)制與BCD碼轉(zhuǎn)換的算法詳解

    十進(jìn)制與BCD碼轉(zhuǎn)換的算法詳解

    BCD轉(zhuǎn)換成十進(jìn)制 BCD碼是指用二進(jìn)制來表示十進(jìn)制數(shù)的編碼,即用4位二進(jìn)制來表示一位十進(jìn)制數(shù),因此4位二進(jìn)制數(shù)表示最大的十進(jìn)制數(shù)9(1001),只取十六個數(shù)中的十個數(shù)(有別于8421碼)
    2021-09-09
  • C語言如何計算兩個數(shù)的最小公倍數(shù)

    C語言如何計算兩個數(shù)的最小公倍數(shù)

    這篇文章主要介紹了C語言如何計算兩個數(shù)的最小公倍數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 利用C語言實現(xiàn)2048小游戲的方法

    利用C語言實現(xiàn)2048小游戲的方法

    2048是比較流行的一款數(shù)字游戲,相信對大家來說都不陌生,這篇文章給大家分享了利用C語言實現(xiàn)2048小游戲的方法,對大家學(xué)習(xí)理解C語言具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • C語言根據(jù)協(xié)議分割獲取字符串單元的實現(xiàn)代碼

    C語言根據(jù)協(xié)議分割獲取字符串單元的實現(xiàn)代碼

    今天小編就為大家分享一篇關(guān)于C語言根據(jù)協(xié)議分割獲取字符串單元的實現(xiàn)代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 關(guān)于C++中引用和指針的區(qū)別詳解

    關(guān)于C++中引用和指針的區(qū)別詳解

    這篇文章主要介紹了關(guān)于C++中引用和指針的區(qū)別詳解,
    2023-07-07

最新評論

波密县| 商洛市| 西华县| 鸡泽县| 吴旗县| 个旧市| 绥芬河市| 马龙县| 青铜峡市| 漳州市| 临清市| 永春县| 邢台市| 大连市| 和田县| 新宁县| 山东省| 青州市| 蛟河市| 辉县市| 大石桥市| 中江县| 富宁县| 宜城市| 华安县| 思茅市| 杭锦后旗| 类乌齐县| 民县| 海林市| 辉县市| 增城市| 定兴县| 炉霍县| 高清| 措美县| 呼伦贝尔市| 承德县| 新蔡县| 阳西县| 高安市|