浮點(diǎn)數(shù)的表示方法
浮點(diǎn)數(shù)的表示方法
基本知識(shí)
定義
浮點(diǎn)數(shù)是一串 0 和 1 構(gòu)成的位序列(bit sequence),從邏輯上用三元組{\(S\),\(E\),\(M\)}表示任意的實(shí)數(shù) \(??\) 可如下表示:
注意:IEEE 中浮點(diǎn)數(shù)的尾數(shù) \(??\) 中僅記錄了小數(shù)位(默認(rèn)省略了整數(shù)位1),所以上述公式中的 \(??\) 實(shí)際值為 \(??+1\),另外由于該實(shí)數(shù)使用二進(jìn)制表示,所以基數(shù) \(??\) 為 2
綜上所述,在 IEEE 754 標(biāo)準(zhǔn)的前提下,任意一個(gè)實(shí)數(shù) \(??\),可表示為如下的形式
類(lèi)型
| 數(shù)符(S) | 階碼(E) | 尾數(shù)(M) | 總位數(shù) | 偏移值 | |
| 短實(shí)數(shù)(Float) | 1位 | 8位 | 23位 | 32位 | 127 |
| 長(zhǎng)實(shí)數(shù)(Double) | 1位 | 11 位 | 52位 | 64位 | 1023 |
| 臨時(shí)實(shí)數(shù) | 1位 | 15位 | 64位 | 80位 | 16383 |
關(guān)鍵字 (什么叫做 數(shù)符,階碼,尾數(shù))
- 數(shù)符:符號(hào)位,0正1負(fù)
- 階碼:科學(xué)計(jì)數(shù)法中的指數(shù)部分(補(bǔ)碼表示)
- 尾數(shù):科學(xué)計(jì)數(shù)法中的尾數(shù)部分(即小數(shù)點(diǎn)后面的部分。因?yàn)樾?shù)點(diǎn)前面的整數(shù)部分僅可能是1,可以將這個(gè)1忽略掉以減少不必要的存儲(chǔ)空間)
關(guān)于 float 類(lèi)型階碼偏移值為什么是 127 而不是 128 的解釋
-
預(yù)備知識(shí)
階碼在浮點(diǎn)數(shù)中占 8 位,對(duì)于 8 位的有符號(hào)整數(shù),其補(bǔ)碼可表示的范圍為:[-128, 127],但為了方便比較直接比較階碼的大小,會(huì)將實(shí)際值偏移固定數(shù)值,使得存儲(chǔ)值均為非負(fù)整數(shù),于是目的為存儲(chǔ) 8 位的有符號(hào)整數(shù)便改為了存儲(chǔ) 8 位無(wú)符號(hào)整數(shù),其補(bǔ)碼可表示的范圍為:[0, 255],IEEE 754 的規(guī)定:若階碼全為 0 或全 1 要進(jìn)行特殊處理,所以 [0, 255] 中的數(shù)值 0 和 255 被排除,剩下的無(wú)符號(hào)數(shù)字范圍為:[1, 254],為了可表示的正數(shù)和負(fù)數(shù)范圍均衡,IEEE 754 設(shè)置移碼為 127,則實(shí)際可表示的指數(shù)范圍為:[-126, 127] -
疑問(wèn)解答
若設(shè)置偏移值為 128,指數(shù)的實(shí)際范圍為 [-127, 126],也能達(dá)到正負(fù)數(shù)均衡的要求,但:
移碼為 127 與 128 相比多表示的指數(shù)是 +127,而少表示的指數(shù)是 -127,實(shí)際生活中 \(1.x?2^{127}\) (\(x\) 表示任意數(shù)量的任意數(shù)字) 遠(yuǎn)比 \(1.x?2^{-127}\) 要有意義的多,畢竟我們接觸的更多的是宏觀世界。
階碼全0和全1
- 階碼全為 0 (非規(guī)格化數(shù))
- 尾數(shù)為0,則表示該數(shù)為 +0或-0,符號(hào)由符號(hào)位決定
- 尾數(shù)非0,此時(shí)隱藏的整數(shù)位不再是1,而是零,此時(shí)可用于表示比規(guī)格化數(shù)更小的數(shù)
- 階碼全為 1
- 尾數(shù)為0,則表示該數(shù)為 \(+\infty\)或\(-\infty\),符號(hào)由符號(hào)位決定
- 尾數(shù)非0,這樣的數(shù)稱(chēng)之為 NaN (Not a Number), 1/0的結(jié)果就是一個(gè)典型的 NaN
- 非規(guī)格化數(shù)
- 在上文中我們說(shuō)到,浮點(diǎn)數(shù)默認(rèn)隱藏的整數(shù)位為1,在這種情況下怎樣表示 0 呢,很明顯無(wú)法表示,所以這里引出非規(guī)格化數(shù)來(lái)處理。非規(guī)格化的數(shù)的兩個(gè)作用為:
- 處理 0 的問(wèn)題
- 處理比規(guī)格化數(shù)更小的數(shù)值
- 在上文中我們說(shuō)到,浮點(diǎn)數(shù)默認(rèn)隱藏的整數(shù)位為1,在這種情況下怎樣表示 0 呢,很明顯無(wú)法表示,所以這里引出非規(guī)格化數(shù)來(lái)處理。非規(guī)格化的數(shù)的兩個(gè)作用為:
單精度浮點(diǎn)數(shù)的有效數(shù)字問(wèn)題
舉個(gè)栗子
-
將十進(jìn)制數(shù) 8.125 轉(zhuǎn)化為單精度的浮點(diǎn)數(shù)表示
8.125 的二進(jìn)制表示為 1000.001
科學(xué)計(jì)數(shù)法表示為 \(1.000001*2^3\),對(duì)于該數(shù),階碼實(shí)際值為 3,偏移之后的值為 \(3 + 127 = 130\),130轉(zhuǎn)為二進(jìn)制數(shù)為 10000010,尾數(shù)部分為 000001,首位符號(hào)位為0,得到其二進(jìn)制表示為:
0 10000010 00000100000000000000000
注:尾數(shù)位不足23位則在后面補(bǔ)零,階碼不足8位則在前面補(bǔ)零,小數(shù)后面補(bǔ)零不影響小數(shù)的值,整數(shù)前面補(bǔ)零不會(huì)影響整數(shù)的值。 -
計(jì)算單精度浮點(diǎn)數(shù)所能表示的最大正整數(shù)
當(dāng)符號(hào)位為0,小數(shù)位全為 1,實(shí)際指數(shù)為 127 時(shí),得到最大正值,可知最大正值為\(a=(1+ (1 - 2^{-23}))*2^{127}=3.4028234663852886*10^{38}\)
對(duì)我產(chǎn)生幫助的網(wǎng)站或文章
IEEE 754 浮點(diǎn)數(shù)標(biāo)準(zhǔn)
在線浮點(diǎn)數(shù)計(jì)算轉(zhuǎn)換
十進(jìn)制整數(shù)以及小數(shù)轉(zhuǎn)二進(jìn)制
階碼全0和全1的浮點(diǎn)數(shù)

浙公網(wǎng)安備 33010602011771號(hào)