女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

談一談浮點數的精度問題

冬至配餃子 ? 來源:最后一個bug ? 作者:bug菌 ? 2022-08-11 14:28 ? 次閱讀

最近進行代碼的review過程中看到同事在代碼中直接拿浮點數相等來作為條件,其他同事提醒他的時候,他還迷迷糊糊不知道為什么,所以就有了今天這篇文章。

1、浮點數據的不均勻

我們經常會談到浮點數的精度問題,float-單精度,double-雙精度,double類型相比float類型精度更高,相應的需要的內存字節個數也越多,談到精度的問題,其實也就說明這種數據類型并不能夠連續的標識任何的點,整形數就不用說了,小數部分直接不能標識。

毒王這篇文章基本上可以從浮點數的存儲到表意來較好的認識浮點數數據類型,但是中間部分對于浮點數精度部分的介紹并不是很形象,所以今天再詳細一點說明一下。

首先我們要認識到通常float類型的變量占據四個字節,而uint32_t的整形類型也是占據四個字節,既然都是四個字節,那他們所能表示的不同數據個數是一樣的。

如果不太理解,可以把float看成4個bit,uint32_t也是4個bit,那么他們不管經過什么變換,每個數據類型都只能夠標識16個數。

好,如下圖以4字節float的數據存儲模型所示:

poYBAGL0oKOAGnTXAABXAQp6GqM658.pngpoYBAGL0oK-AFdFKAACbC03w1Nw937.png

4個字節的浮點數,不像無符號整形所有的bit都是數據區,并且以每個數據之間相差1均勻分布,而浮點數把這4個字節分為了不同的區來起到不同的作用,從而用另外一種方式表達數據。

其指數部分越大,表示的數據就越大,但是尾數部分只能表示到23位,這樣的話導致數據的精度就越差,如果不太理解可以用一個較大的數通過上面的轉換方式進行換算,便能理解。

poYBAGL0oMOAQIDRAABoH8OBdKY496.png

所以同樣是4個字節,根據浮點數的表示,越接近0就越稠密,越遠離0就越稀疏,呈現一種不均勻的數據排列狀態,如上圖所示,同樣它也也不能標識實軸上任意的點。

2、驗證一下不均勻

好了,講了這么多理論,多多少少得來點程序驗證一下:

pYYBAGL0oNWAHNSBAAEPNVlIAkk408.png

看看上面的代碼,這還用說,肯定這兩個數相等呀,相減也等于0,然而看一下輸出結果:

poYBAGL0oOyAdQmtAABx3Fdix3k093.png

結果并不相等,并且相差還不少。

其結果也就說明了浮點數在大數的標識精度不好,只能近似標識,同時也說明了為什么一般不使用浮點數相等來進行判斷的原因。

這也是為什么有時候明明我們采用直接編碼用準確的浮點數,到了浮點數變量里面卻損失了精度,因為4個字節的float標識不了,只能近似處理。

3、非要判斷相等

由于有些應用非要使用浮點數進行相等的處理,我們不應該直接使用浮點數進行等于號的判斷,而是要在一定的誤差和精度范圍內進行滿足。

poYBAGL0oPuAFqUrAACMOZYGM8M317.png

如上圖所示代碼是比較常用的處理辦法,在往期的文章中,bug菌沒有詳細的講解這個誤差宏的定義,前面了解到當數據比較大的時候相鄰的差值會比較大,這樣就存在兩個浮點數的差值大于所設置的誤差范圍而無法判斷相等。

所以這樣的處理辦法來判斷浮點數近似相等會存在一些局限性。

那有沒有相對更好一點的辦法呢?

當然是有的,不然接下來沒得寫了。

還是要從浮點數的存儲和標識出發來處理該問題,既然浮點數天然就存在一定的誤差,而有時候計算又無法獲得唯一的數值,如下圖所示,浮點數計算出來的實軸上的值都會因為浮點數無法存儲標識而近似到其相鄰的可以標識的數值上。

poYBAGL0oRGAYTzNAAB2XzdRbF0271.png

從浮點的存儲模型來看,指數部分代表著浮點數的范圍,尾數部分代表著浮點數的精度,那么尾數的最后一位其實就表示了浮點數的當前數值附近的精度。

于是對浮點的近似相等進行了算法上的修改,如下代碼所示:

poYBAGL0oSKAZZujAACMlPdwF2U141.png

解釋一下 :

如果直接相等,說明浮點數各數據位都相等;而如果不相等可能相鄰,于是強制轉化為整形,比較尾數最后一位是否不同。

這里使用一個小技巧,采用異或的處理辦法,如果其他位都相同,而最后一位不同,結果就等于1,認為兩個浮點數近似相等。

本文到此結束,我相信大家應該對浮點數有了一個更加深入的了解,面對一些問題心中也會有一些答案,比如浮點數為什么不能作為switch的參數,也是同樣的原因。

但總的來說還是建議大家不要判斷浮點數相等,非要用也要特別小心。


審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Switch
    +關注

    關注

    1

    文章

    535

    瀏覽量

    59254
  • 數據存儲
    +關注

    關注

    5

    文章

    997

    瀏覽量

    51608
  • 浮點數
    +關注

    關注

    0

    文章

    61

    瀏覽量

    16074
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    請問如何打印浮點數或雙精度變量?

    如何打印浮點數或雙精度變量?
    發表于 07-12 08:24

    官方例程modbus slave rtu,浮點數精度不對是怎么回事?

    官方例程 modbus slave rtu, 浮點數精度不對,對保持寄存器設置浮點數,讀取到的浮點數結果
    發表于 07-19 08:10

    浮點數如何存儲?

    浮點數如何存儲玩轉浮點數
    發表于 12-30 07:10

    MCU中雙精度浮點數是用什么格式存儲的?

    MCU中雙精度浮點數是用什么格式存儲的
    發表于 10-11 06:24

    浮點數的表示方法

    浮點數的表示方法  浮點數,是指小數點在數據中的位置可以左右移動的數據。它通常被表示成:    N = M* RE  這里的M(Mantissa)被稱為浮點數
    發表于 10-13 17:13 ?1.7w次閱讀
    <b class='flag-5'>浮點數</b>的表示方法

    浮點數常用的編碼方法

    浮點數常用的編碼方法  前面已經說到,在計算機內,浮點數被表示為如下格式:    通常情況
    發表于 10-13 17:21 ?4679次閱讀
    <b class='flag-5'>浮點數</b>常用的編碼方法

    modbus 如何讀取浮點數

    本文為大家介紹modbus讀取浮點數的兩個程序設計。
    發表于 02-08 10:03 ?1.5w次閱讀

    Xilinx怎么定點數浮點數

    轉化為的浮點數可以是單精度也可以是雙精度
    發表于 07-05 08:09 ?3996次閱讀
    Xilinx怎么定<b class='flag-5'>點數</b>轉<b class='flag-5'>浮點數</b>

    什么是浮點數浮點數在內存中的存儲

    浮點型簡單講就是實數的意思。浮點數在計算機中用以近似表示任意某個實數。
    的頭像 發表于 11-09 11:07 ?6142次閱讀
    什么是<b class='flag-5'>浮點數</b>?<b class='flag-5'>浮點數</b>在內存中的存儲

    什么是浮點數

    Python數據類型第種:字符串(str)。 Python數據類型第二種:整數(int)。 Python數據類型第三種:浮點數浮點數的英文名是float,浮點數沒有簡寫。
    的頭像 發表于 02-23 14:58 ?5182次閱讀

    點數浮點數的概念 浮點數二進制序列與指數表達式之間的轉化

    的缺點:由于小數點位置固定不變,定點數所表示的數的范圍非常有限,不能同時表達特別大或特別小的數,所以才出現了浮點數,以此來擴充數的范圍,同時浮點數也廣泛應用于精度要求高的場合。簡單的理
    的頭像 發表于 08-22 16:06 ?8971次閱讀
    定<b class='flag-5'>點數</b>和<b class='flag-5'>浮點數</b>的概念 <b class='flag-5'>浮點數</b>二進制序列與指數表達式之間的轉化

    精度和雙精度浮點數的區別

    在計算機科學和數值計算中,浮點數種用于表示實數的數據類型。浮點數有兩種精度級別:單精度和雙精度
    的頭像 發表于 12-13 10:55 ?1.3w次閱讀

    精度和雙精度浮點數的區別

    。 單精度浮點數,也稱為單精度浮點數格式,用于在計算機中表示32位二進制格式的浮點數個單
    的頭像 發表于 12-15 10:25 ?6047次閱讀

    modbus浮點數怎么讀取

    Modbus是種通信協議,常用于工業自動化系統中的設備之間的通信。它支持多種數據類型,包括整數、浮點數、字符串等。浮點數在工業領域中廣泛應用,因此了解如何讀取和處理Modbus浮點數
    的頭像 發表于 12-28 14:38 ?7690次閱讀

    文帶你秒懂IEEE 754浮點數

    、簡介1、常見的浮點數表示方式是IEEE754標準,它規定了浮點數的存儲格式和運算規則,這個標準定義了兩種浮點數表示:單精度和雙
    的頭像 發表于 03-18 08:09 ?1w次閱讀
    <b class='flag-5'>一</b>文帶你秒懂IEEE 754<b class='flag-5'>浮點數</b>