在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

談一談浮點(diǎn)數(shù)的精度問題

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

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

1、浮點(diǎn)數(shù)據(jù)的不均勻

我們經(jīng)常會(huì)談到浮點(diǎn)數(shù)的精度問題,float-單精度,double-雙精度,double類型相比float類型精度更高,相應(yīng)的需要的內(nèi)存字節(jié)個(gè)數(shù)也越多,談到精度的問題,其實(shí)也就說明這種數(shù)據(jù)類型并不能夠連續(xù)的標(biāo)識任何的點(diǎn),整形數(shù)就不用說了,小數(shù)部分直接不能標(biāo)識。

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

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

如果不太理解,可以把float看成4個(gè)bit,uint32_t也是4個(gè)bit,那么他們不管經(jīng)過什么變換,每個(gè)數(shù)據(jù)類型都只能夠標(biāo)識16個(gè)數(shù)。

好,如下圖以4字節(jié)float的數(shù)據(jù)存儲(chǔ)模型所示:

poYBAGL0oKOAGnTXAABXAQp6GqM658.pngpoYBAGL0oK-AFdFKAACbC03w1Nw937.png

4個(gè)字節(jié)的浮點(diǎn)數(shù),不像無符號整形所有的bit都是數(shù)據(jù)區(qū),并且以每個(gè)數(shù)據(jù)之間相差1均勻分布,而浮點(diǎn)數(shù)把這4個(gè)字節(jié)分為了不同的區(qū)來起到不同的作用,從而用另外一種方式表達(dá)數(shù)據(jù)。

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

poYBAGL0oMOAQIDRAABoH8OBdKY496.png

所以同樣是4個(gè)字節(jié),根據(jù)浮點(diǎn)數(shù)的表示,越接近0就越稠密,越遠(yuǎn)離0就越稀疏,呈現(xiàn)一種不均勻的數(shù)據(jù)排列狀態(tài),如上圖所示,同樣它也也不能標(biāo)識實(shí)軸上任意的點(diǎn)。

2、驗(yàn)證一下不均勻

好了,講了這么多理論,多多少少得來點(diǎn)程序驗(yàn)證一下:

pYYBAGL0oNWAHNSBAAEPNVlIAkk408.png

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

poYBAGL0oOyAdQmtAABx3Fdix3k093.png

結(jié)果并不相等,并且相差還不少。

其結(jié)果也就說明了浮點(diǎn)數(shù)在大數(shù)的標(biāo)識精度不好,只能近似標(biāo)識,同時(shí)也說明了為什么一般不使用浮點(diǎn)數(shù)相等來進(jìn)行判斷的原因。

這也是為什么有時(shí)候明明我們采用直接編碼用準(zhǔn)確的浮點(diǎn)數(shù),到了浮點(diǎn)數(shù)變量里面卻損失了精度,因?yàn)?個(gè)字節(jié)的float標(biāo)識不了,只能近似處理。

3、非要判斷相等

由于有些應(yīng)用非要使用浮點(diǎn)數(shù)進(jìn)行相等的處理,我們不應(yīng)該直接使用浮點(diǎn)數(shù)進(jìn)行等于號的判斷,而是要在一定的誤差和精度范圍內(nèi)進(jìn)行滿足。

poYBAGL0oPuAFqUrAACMOZYGM8M317.png

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

所以這樣的處理辦法來判斷浮點(diǎn)數(shù)近似相等會(huì)存在一些局限性。

那有沒有相對更好一點(diǎn)的辦法呢?

當(dāng)然是有的,不然接下來沒得寫了。

還是要從浮點(diǎn)數(shù)的存儲(chǔ)和標(biāo)識出發(fā)來處理該問題,既然浮點(diǎn)數(shù)天然就存在一定的誤差,而有時(shí)候計(jì)算又無法獲得唯一的數(shù)值,如下圖所示,浮點(diǎn)數(shù)計(jì)算出來的實(shí)軸上的值都會(huì)因?yàn)楦↑c(diǎn)數(shù)無法存儲(chǔ)標(biāo)識而近似到其相鄰的可以標(biāo)識的數(shù)值上。

poYBAGL0oRGAYTzNAAB2XzdRbF0271.png

從浮點(diǎn)的存儲(chǔ)模型來看,指數(shù)部分代表著浮點(diǎn)數(shù)的范圍,尾數(shù)部分代表著浮點(diǎn)數(shù)的精度,那么尾數(shù)的最后一位其實(shí)就表示了浮點(diǎn)數(shù)的當(dāng)前數(shù)值附近的精度。

于是對浮點(diǎn)的近似相等進(jìn)行了算法上的修改,如下代碼所示:

poYBAGL0oSKAZZujAACMlPdwF2U141.png

解釋一下 :

如果直接相等,說明浮點(diǎn)數(shù)各數(shù)據(jù)位都相等;而如果不相等可能相鄰,于是強(qiáng)制轉(zhuǎn)化為整形,比較尾數(shù)最后一位是否不同。

這里使用一個(gè)小技巧,采用異或的處理辦法,如果其他位都相同,而最后一位不同,結(jié)果就等于1,認(rèn)為兩個(gè)浮點(diǎn)數(shù)近似相等。

本文到此結(jié)束,我相信大家應(yīng)該對浮點(diǎn)數(shù)有了一個(gè)更加深入的了解,面對一些問題心中也會(huì)有一些答案,比如浮點(diǎn)數(shù)為什么不能作為switch的參數(shù),也是同樣的原因。

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


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Switch
    +關(guān)注

    關(guān)注

    1

    文章

    535

    瀏覽量

    59385
  • 數(shù)據(jù)存儲(chǔ)

    關(guān)注

    5

    文章

    997

    瀏覽量

    51649
  • 浮點(diǎn)數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    16095
收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    請問如何打印浮點(diǎn)數(shù)或雙精度變量?

    如何打印浮點(diǎn)數(shù)或雙精度變量?
    發(fā)表于 07-12 08:24

    官方例程modbus slave rtu,浮點(diǎn)數(shù)精度不對是怎么回事?

    官方例程 modbus slave rtu, 浮點(diǎn)數(shù)精度不對,對保持寄存器設(shè)置個(gè)浮點(diǎn)數(shù),讀取到的浮點(diǎn)數(shù)結(jié)果
    發(fā)表于 07-19 08:10

    浮點(diǎn)數(shù)如何存儲(chǔ)?

    浮點(diǎn)數(shù)如何存儲(chǔ)玩轉(zhuǎn)浮點(diǎn)數(shù)
    發(fā)表于 12-30 07:10

    浮點(diǎn)數(shù)的表示方法

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

    浮點(diǎn)數(shù)常用的編碼方法

    浮點(diǎn)數(shù)常用的編碼方法  前面已經(jīng)說到,在計(jì)算機(jī)內(nèi),浮點(diǎn)數(shù)被表示為如下格式:    通常情況
    發(fā)表于 10-13 17:21 ?4703次閱讀
    <b class='flag-5'>浮點(diǎn)數(shù)</b>常用的編碼方法

    modbus 如何讀取浮點(diǎn)數(shù)

    本文為大家介紹modbus讀取浮點(diǎn)數(shù)的兩個(gè)程序設(shè)計(jì)。
    發(fā)表于 02-08 10:03 ?1.5w次閱讀

    Xilinx怎么定點(diǎn)數(shù)轉(zhuǎn)浮點(diǎn)數(shù)

    轉(zhuǎn)化為的浮點(diǎn)數(shù)可以是單精度也可以是雙精度
    發(fā)表于 07-05 08:09 ?4011次閱讀
    Xilinx怎么定<b class='flag-5'>點(diǎn)數(shù)</b>轉(zhuǎn)<b class='flag-5'>浮點(diǎn)數(shù)</b>

    什么是浮點(diǎn)數(shù)浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)

    浮點(diǎn)型簡單講就是實(shí)數(shù)的意思。浮點(diǎn)數(shù)在計(jì)算機(jī)中用以近似表示任意某個(gè)實(shí)數(shù)。
    的頭像 發(fā)表于 11-09 11:07 ?6264次閱讀
    什么是<b class='flag-5'>浮點(diǎn)數(shù)</b>?<b class='flag-5'>浮點(diǎn)數(shù)</b>在內(nèi)存中的存儲(chǔ)

    什么是浮點(diǎn)數(shù)

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

    點(diǎn)數(shù)浮點(diǎn)數(shù)的概念 浮點(diǎn)數(shù)二進(jìn)制序列與指數(shù)表達(dá)式之間的轉(zhuǎn)化

    的缺點(diǎn):由于小數(shù)點(diǎn)位置固定不變,定點(diǎn)數(shù)所表示的數(shù)的范圍非常有限,不能同時(shí)表達(dá)特別大或特別小的數(shù),所以才出現(xiàn)了浮點(diǎn)數(shù),以此來擴(kuò)充數(shù)的范圍,同時(shí)浮點(diǎn)數(shù)也廣泛應(yīng)用于精度要求高的場合。簡單的理
    的頭像 發(fā)表于 08-22 16:06 ?9070次閱讀
    定<b class='flag-5'>點(diǎn)數(shù)</b>和<b class='flag-5'>浮點(diǎn)數(shù)</b>的概念 <b class='flag-5'>浮點(diǎn)數(shù)</b>二進(jìn)制序列與指數(shù)表達(dá)式之間的轉(zhuǎn)化

    西門子PLC浮點(diǎn)數(shù)程序案例分享

    64位浮點(diǎn)數(shù)保存于VB0開始的存儲(chǔ)區(qū)中,轉(zhuǎn)換得出的32位浮點(diǎn)數(shù)保存于VD100中。
    發(fā)表于 10-27 17:07 ?4154次閱讀
    西門子PLC<b class='flag-5'>浮點(diǎn)數(shù)</b>程序案例分享

    精度和雙精度浮點(diǎn)數(shù)的區(qū)別

    在計(jì)算機(jī)科學(xué)和數(shù)值計(jì)算中,浮點(diǎn)數(shù)種用于表示實(shí)數(shù)的數(shù)據(jù)類型。浮點(diǎn)數(shù)有兩種精度級別:單精度和雙精度
    的頭像 發(fā)表于 12-13 10:55 ?1.3w次閱讀

    精度和雙精度浮點(diǎn)數(shù)的區(qū)別

    。 單精度浮點(diǎn)數(shù),也稱為單精度浮點(diǎn)數(shù)格式,用于在計(jì)算機(jī)中表示32位二進(jìn)制格式的浮點(diǎn)數(shù)個(gè)單
    的頭像 發(fā)表于 12-15 10:25 ?6145次閱讀

    modbus浮點(diǎn)數(shù)怎么讀取

    Modbus是種通信協(xié)議,常用于工業(yè)自動(dòng)化系統(tǒng)中的設(shè)備之間的通信。它支持多種數(shù)據(jù)類型,包括整數(shù)、浮點(diǎn)數(shù)、字符串等。浮點(diǎn)數(shù)在工業(yè)領(lǐng)域中廣泛應(yīng)用,因此了解如何讀取和處理Modbus浮點(diǎn)數(shù)
    的頭像 發(fā)表于 12-28 14:38 ?7884次閱讀

    文帶你秒懂IEEE 754浮點(diǎn)數(shù)

    、簡介1、常見的浮點(diǎn)數(shù)表示方式是IEEE754標(biāo)準(zhǔn),它規(guī)定了浮點(diǎn)數(shù)的存儲(chǔ)格式和運(yùn)算規(guī)則,這個(gè)標(biāo)準(zhǔn)定義了兩種浮點(diǎn)數(shù)表示:單精度和雙
    的頭像 發(fā)表于 03-18 08:09 ?1.1w次閱讀
    <b class='flag-5'>一</b>文帶你秒懂IEEE 754<b class='flag-5'>浮點(diǎn)數(shù)</b>
    主站蜘蛛池模板: 国产精品嫩草影院午夜 | 婷婷综合五月天 | 永久在线观看 | 天天爱综合 | 久操免费视频 | 日日操夜夜 | 亚洲精品成人在线 | 国产女人在线视频 | 久热网 | 亚洲va久久久噜噜噜久久男同 | 日韩中文电影 | 天天爽天天 | 日本久操视频 | 激情综合视频 | 亚洲综人网 | 9299yy看片淫黄大片在线 | 免费大片av手机看片 | 中文字幕第11页 | 香港三澳门三日本三级 | 日日摸夜夜爽夜夜爽出水 | 亚洲人成电影院 | 好紧好湿好黄的视频 | ww欧洲ww在线视频看ww | 美女被曹 | 欧美日韩一区视频 | 男人天堂bt | 欧美一卡2卡三卡4卡5卡免费观看 | 欧美色视频在线观看 | 丁香天堂网 | 老师啊灬啊灬用力啊快224视频 | 欧美一区二区三区大片 | 华人被黑人粗大猛然进 | 三级理论在线 | 热门国产xvideos中文 | 欧美性猛交xxxx免费看久久 | 狠狠色丁香婷婷综合 | 国产大乳喷奶水在线看 | 一区二区三区精品视频 | 日韩一区二区三区免费 | 午夜精品久久久久久99热7777 | 午夜精品久久久久久久2023 |