二進(jìn)制浮點(diǎn)數(shù)表示

分享這篇筆記的目的是想驅(qū)動(dòng)自己多動(dòng)手栈雳,多動(dòng)腦护奈,開(kāi)放自己,認(rèn)識(shí)別人哥纫。如有問(wèn)題霉旗,請(qǐng)指正。

從整數(shù)到小數(shù)

先回憶下如何用二進(jìn)制表示十進(jìn)制整數(shù)蛀骇。例如厌秒,5 = 1×2^2 +0×2^1 +1×2^0 = (101)B
以此類推松靡,
5.3 = 1×2^2+0×2^1+1×2^0+1×2 ^{-1}+1×2^{-2} = (101.11)B简僧。
這樣的表示方法,會(huì)被我們理所應(yīng)當(dāng)?shù)叵氲降衿邸5沁@樣表示小數(shù)存在不足岛马。

存在的問(wèn)題

  1. 能精確表示的小數(shù)有限棉姐,只能表示 被x×2^y表示的數(shù)字。如1/3啦逆、 1/5等無(wú)法被上述方式表示伞矩。
  2. 在定長(zhǎng)位數(shù)下(float是32位),不能同時(shí)表示極大數(shù)和及其接近0的數(shù)夏志。(ps乃坤,如果小數(shù)點(diǎn)不定位置,那么要描述小數(shù)點(diǎn)位置又需要額外的位數(shù)沟蔑,更加浪費(fèi)空間)湿诊。

IEEE標(biāo)準(zhǔn)表示浮點(diǎn)數(shù)

要解決的問(wèn)題:在給定區(qū)間內(nèi),整數(shù)有限個(gè)瘦材,但實(shí)數(shù)無(wú)限個(gè)
基本矛盾:有限個(gè)二進(jìn)制位去表示無(wú)限多的實(shí)數(shù)
表示:使用類似科學(xué)計(jì)數(shù)法方式表示厅须。
本文只談float32類型情況下。

表示公式

V=(-1)^S+F×2^E
這樣的表示小數(shù)點(diǎn)是浮動(dòng)的食棕,所以稱為浮點(diǎn)數(shù)朗和。(相對(duì)的,小數(shù)點(diǎn)確定的叫做定點(diǎn)數(shù)簿晓,整數(shù)也是一種定點(diǎn)數(shù))
S:標(biāo)志位(1位)眶拉,大家都懂
E:階碼(8位),作用是對(duì)浮點(diǎn)數(shù)加權(quán)
F:尾數(shù)(23位)憔儿,這個(gè)數(shù)有些特別忆植,它的取值范圍[1,2)或[0,1),倆個(gè)取值范圍跟E的取值相關(guān)皿曲,后文詳細(xì)解釋唱逢。

來(lái)源 深入理解計(jì)算機(jī)系統(tǒng)v3

階碼E 和 尾數(shù)F 的取值

階碼狀態(tài) 尾數(shù)狀態(tài) 值的表示 備注
E∈(0,255) 任意 1+\frac{F}{2^{-23}}×2^{E-127} 規(guī)格化
E=0 任意 \frac{F}{2^{-23}}×2^{E-126} 非規(guī)格化
E=255 0 無(wú)窮大吴侦、小
E=255 ≠0 NaN

1.規(guī)格化情況

階碼E的二進(jìn)制位既不全是0屋休,也不全是1。
因?yàn)镋∈(0,255)的备韧,E-127 剛好平分E的值域劫樟。這樣,E既可以表示正指數(shù)织堂,也可表示副指數(shù)叠艳。
尾數(shù)F的值域[1,2)

2. 非規(guī)格化情況

階碼E的二進(jìn)制位全0
尾數(shù)F的值域[0,1)

階碼E和尾數(shù)F的含義

這樣的表示公式是非常反直覺(jué)的,為什么要將非規(guī)格化情況單獨(dú)提出易阳,這驅(qū)使我探究其中含義附较。

階碼E

先定義階數(shù)組。根據(jù)E取值不同潦俺,2^{E-127}的值可以組成的數(shù)組是階數(shù)組拒课,階數(shù)組可見(jiàn)下表

階數(shù)組元素 元素值
A[0] 2^{-126}
A[1] 2^{-126}
A[2] 2^{-125}
A[3] 2^{-124}
…… ……
A[127] 2^{0}
A[128] 2^{1}
…… ……
A[253] 2^{126}
A[254] 2^{127}
A[255]

階碼E就是階數(shù)組的序號(hào)(數(shù)組下標(biāo))
階數(shù)組元素算出后徐勃,每個(gè)階的值域也我們自然能算出。

階數(shù)組元素 元素值 表示范圍 精度
A[0] 2^{-126} [0,2^{-126}) 2^{-149}
A[1] 2^{-126} [2^{-126},2^{-125}) 2^{-149}
A[2] 2^{-125} [2^{-125},2^{-124}) 2^{-148}
A[3] 2^{-124} [2^{-124},2^{-123}) 2^{-147}
…… …… …… ……
A[127] 2^{0} [2^{0},2^{1}) 2^{-23}
A[128] 2^{1} [2^{1},2^{2}) 2^{-22}
…… …… …… ……
A[150] 2^{23} [2^{23},2^{24}) 2^{0}=1
…… …… …… ……
A[254] 2^{127} [2^{127},2^{128}) 2^{104}
A[255] [0,2^{-126}) -

這樣的表示早像,就將整個(gè)實(shí)數(shù)域都囊括了僻肖。非規(guī)格化情況(A[0]階),巧妙地填充了0附近的空白卢鹦。

尾數(shù)F

尾數(shù)F理解成一個(gè)分?jǐn)?shù)的分子臀脏,分母是2^23,分?jǐn)?shù)的“1”是E階的值域冀自。打個(gè)比方揉稚,一條線段的長(zhǎng)度為A[E],平均分成2^23段熬粗,取其前F段窃植。

計(jì)算出浮點(diǎn)數(shù)的階號(hào)E和尾數(shù)F

計(jì)算F時(shí),采用二分法荐糜。
下面以 N=25f 進(jìn)行舉例

1.找到N的階碼

2^k <= N < 2^{k+1}
2^4 <= N < 2^{5}
階碼E= k+127 = 131=1000 0011

2.二分法找尾數(shù)F

判斷 Y or N F從右向左的二進(jìn)制占位
IF 25 >=24 Y 1
IF 25 >=28 N 10
IF 25 >=26 N 100
IF 25 >=25 Y 1001

解釋一下巷怜,階區(qū)間[24,25),中位數(shù)的十進(jìn)制表示是24暴氏,25>24延塑,判斷為真,F(xiàn)的最高位填1答渔。
剩余區(qū)間中位數(shù)28关带,25<28,判斷為假沼撕,F(xiàn)的下一位填0宋雏。依次類推,最終F為1001時(shí)务豺。
所以最終25f的二進(jìn)制表示為:
高16位:0 1000 0011 1001 000
低16位:0000 0000 0000 0000
十六進(jìn)制表示:41 C8 00 00

浮點(diǎn)數(shù)表示帶來(lái)的精度問(wèn)題

  1. python中: 0.3+0.6=0.899999

  2. 32位浮點(diǎn)數(shù)磨总,超過(guò)2的24次方之后,精度大于1笼沥,運(yùn)算 準(zhǔn)確性不如整數(shù)蚪燕。

    2,000,000,000f+1f = 2,000,000,000f

解決方法:Kahan Summation算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奔浅,隨后出現(xiàn)的幾起案子馆纳,更是在濱河造成了極大的恐慌,老刑警劉巖汹桦,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲁驶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舞骆,警方通過(guò)查閱死者的電腦和手機(jī)钥弯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門壹罚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寿羞,你說(shuō)我怎么就攤上這事猖凛。” “怎么了绪穆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵辨泳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玖院,道長(zhǎng)菠红,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任难菌,我火速辦了婚禮试溯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郊酒。我一直安慰自己遇绞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布燎窘。 她就那樣靜靜地躺著摹闽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褐健。 梳的紋絲不亂的頭發(fā)上付鹿,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音蚜迅,去河邊找鬼舵匾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谁不,可吹牛的內(nèi)容都是我干的坐梯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拍谐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烛缔!你這毒婦竟也來(lái)了馏段?” 一聲冷哼從身側(cè)響起轩拨,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎院喜,沒(méi)想到半個(gè)月后亡蓉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喷舀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年砍濒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淋肾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爸邢,死狀恐怖樊卓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠河,我是刑警寧澤碌尔,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站券敌,受9級(jí)特大地震影響唾戚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜待诅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一叹坦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卑雁,春花似錦募书、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至弛房,卻和暖如春道盏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背文捶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工荷逞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粹排。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓种远,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親顽耳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坠敷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容