浮点型数据存储格式详解
本文是對 Computer Systems__A Programmer's Perspective 一書中 Chapter2__2.4 Floating Point一節(jié)的理解
在1985年之前,每個pc制造商都有自己的浮點(diǎn)數(shù)表示和計算方法。那時更讓人關(guān)心的是浮點(diǎn)數(shù)的計算速度和實(shí)現(xiàn)方法而非數(shù)值和計算的精度。在1985年,IEEE標(biāo)準(zhǔn)進(jìn)行了統(tǒng)一,提升了程序的可移植性。
生活中常用的是10進(jìn)制表示的數(shù)值,dmdm-1…d1d0.d-1d-2…d-n表示如下:
d0與d-1間的小數(shù)點(diǎn)“.”,表示該符號左邊的數(shù)值10的指數(shù)是正數(shù),右邊的數(shù)值10的指數(shù)是負(fù)數(shù)。
同理,考慮一個2進(jìn)制表示的數(shù)值,bmbm-1…b1b0.b-1b-2…b-n表示如下:
其中,bi只能是0或1。同時,小數(shù)點(diǎn)“.”符號左邊的數(shù)值2的指數(shù)是正數(shù),右邊的數(shù)值2的指數(shù)是負(fù)數(shù)。比如,101.112表示1*2^2+ 0*2^1 + 1*2^0 + 1*2^-1 + 1*2^-2 = 4 + 0 +1 + 1/2 + 1/4 = 5 + 3/4。
通過2進(jìn)制數(shù)值的表示方式,可知將小數(shù)點(diǎn)符號“.”向左或向右移位,分別表示原有數(shù)值除2或乘2。10.1112的數(shù)值是2 + 7/8,1011.12表示11 + 1/2。
數(shù)值的X進(jìn)制的編碼不可能是無限長的,因此一些數(shù)值受限于編碼長度只能近似表示而不能完全精確。如1/3、5/7的10進(jìn)制在編碼長度一定時,就不能完全精確表達(dá)該數(shù)值;1/5在2進(jìn)制表示下只能通過增加編碼長度無限逼近該值。這就是浮點(diǎn)數(shù)精度產(chǎn)生的原因:在計算機(jī)中,因?yàn)?/span>2進(jìn)制編碼長度的限制,浮點(diǎn)數(shù)中小數(shù)點(diǎn)后的部分?jǐn)?shù)值因?yàn)椴荒鼙硎径粊G棄。基于這個原因,就可以理解浮點(diǎn)數(shù)比較為什么不和整形數(shù)值之間的比較一樣,直接用“<”、“>”、“==”等運(yùn)算符得到數(shù)值間的大小,而一定要用if (a-b<0.000001)條件來判斷了。
?
IEEE標(biāo)準(zhǔn)中的的浮點(diǎn)數(shù)表示形式為V = (-1)s * M * 2E,
S—符號位,s為0時,浮點(diǎn)數(shù)大于0;s為1時,浮點(diǎn)數(shù)小于0。當(dāng)浮點(diǎn)數(shù)為0.0時,s當(dāng)作特殊情況處理,具體請看下面說明
E—指數(shù)位,2的指數(shù)數(shù)值
M—數(shù)值位,小數(shù)的2進(jìn)制數(shù)值,范圍為0—1或1—2
對應(yīng)浮點(diǎn)數(shù)的表示形式,浮點(diǎn)數(shù)的bits分為三部分:
S—符號位,占用1 bit
E—指數(shù)位,占用k bits,exp = ek-1…e1e0
M—數(shù)值位,占用n bits,frac = fn-1…f1f0,M的解譯取決于E是否為0
32 bits的單精度浮點(diǎn)數(shù)(C語言中的float型)中s,k,n分別為1,8,23; 64 bits的雙精度浮點(diǎn)數(shù)(C語言中的double型)中s,k,n分別為1,11,52。
浮點(diǎn)數(shù)的解譯依據(jù)E的不同,分為三種情況:
Normalized values常規(guī)數(shù)值:
E中的bit位不全為0,也不全為1,大部分浮點(diǎn)數(shù)屬于這此類。這種情況下E以biased form(偏差形式)解譯為signed integer。Biased form為:
E = e – Bias
e是exp = ek-1…e1e0的unsigned number;Bias是偏差值,計算方式為Bias = 2k-1-1(單精度為127,雙精度為1023)。E的范圍是單精度為-126—+127,雙精度為-1022—+1023。
M數(shù)值占用的n bit被解譯為2進(jìn)制的小數(shù)f(0 ?<= ?f ?< 1),即0. fn-1…f1f0。M = 1 + f,可以把M看作為2進(jìn)制的1. fn-1…f1f0。在V = (-1)s * M * 2E表示形式中,可以調(diào)整E的大小保證1 <= M < 2,所以2進(jìn)制的1. fn-1…f1f0的1可以去掉,增加小數(shù)部分的值用以提升數(shù)據(jù)精度。
Denormalized values非常規(guī)數(shù)值:
E中的bit為全為0,E以denormalized form(非常規(guī)形式)解讀。Denormalized form為:
E = 1 – Bias,M = f。
非常規(guī)數(shù)值有兩種用途:第一,可以表示0.0。在常規(guī)數(shù)值中,M始終是>=1的,不可能產(chǎn)生0.0。+0.0時,所有的bit值都是0,即符號位s為0,E的bit為0,M=f=0。當(dāng)-0.0時,符號位s為1,其他的bit都是0。在IEEE浮點(diǎn)數(shù)格式中,-0.0與+0.0是否相同取決于應(yīng)用場景。第二,可以表示接近0.0的數(shù)值。
Special Values特殊值:
當(dāng)E中的bits全部為1時,M的bits全部為0時,表示無窮大,s=0時為正無窮+oo;s=1時為-oo。無窮可以表示數(shù)值的溢出,如兩個很大的數(shù)相乘,或者除0;當(dāng)M中的bit不全為0時,表示為NaN(Not a Number),即不是一個數(shù)。當(dāng)操作的結(jié)果不能作為實(shí)數(shù)或者無窮返回時,就返回NaN,如計算或者oo-oo;NaN在某些應(yīng)用中可以用來表示未初始化的值。
IEEE Floating-Point總結(jié)為下圖
轉(zhuǎn)載于:https://www.cnblogs.com/Taiwantomzhang/p/3618542.html
總結(jié)
以上是生活随笔為你收集整理的浮点型数据存储格式详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RSA大会播报 – 2014最佳安全博客
- 下一篇: Cannot unwrap to req