浮點數的表示中為什麼要用移碼錶示階碼?
用移碼的意義何在?先行謝過
便於浮點數比大小。
如果階碼(指數)也用補碼來表示,就會使得一個浮點數中出現兩個符號位:浮點數自身的和浮點數指數部分的。這樣的結果是,在比較兩個浮點數大小時,無法像比較整數時一樣使用簡單的無邏輯的二進位比較。故而浮點數的指數部分採用了移碼(無符號整數)來表示。我來解釋下為什麼IEEE標準中,8位階碼的偏置為127。
1、8位移碼的取值範圍為0~255(00000000~11111111),但在浮點數的階碼中,00000000與11111111被保留用作特殊情況,所以階碼可用範圍只有1~254,總共有254個值。
2、8位有符號數取值範圍為-128~+127(10000000~01111111),這裡的二進位用補碼錶示,其中特別規定補碼10000000沒有原碼,為-128的補碼,總共有256個值。
3、如果採用偏置128,在表達+127時會產生上溢(移碼11111111被保留),所以在階碼中偏置為(128-1),與此同時,在表達-127時會產生下溢(移碼00000000被保留),所以階碼中去掉-127與-128,取值範圍為-126~127,總共254個值。
——————————————————————————————————————————
另外我再補充一下對32位float型數據的取值範圍的研究:
最高位為符號位;指數:共8個bit,佔據30~23位;底數:實際是佔用24個bit,由於其最高位始終為1,所以最高位省去不存儲,在存儲中只有23個bit,佔據22~0位;當22~0位全部置1時,底數取得最大值,接近於2。
當22~0位全部置0時,底數取得最小值,為1。因此float型的取值範圍為: -2*2^127 ~ -1*2^(-126) 與 1*2^(-126) ~ 2*2^127轉化得:-3.4*10^38 ~ -1.2*10^(-38) 與 1.2*10^(-38) ~ 3.4*10^38
移碼,故名思意,就是在原碼的基礎上加上一個偏移量。
什麼?!它為啥要這樣?
至於為什麼要用移碼錶示exponent,這當然是有它的原因的啦~
想一下,在進行浮點數的加減運算時,我們需要怎麼辦?
忘了?
好吧。。。想一想,我們對兩個用科學記數法表示的數進行加減法的時候,我們怎麼做最簡單?
通過比較exponent的大小,然後通過移動小數點,讓它們一致,之後,把數值部分相加,即可。
同樣的,在計算機硬體的實現上,也是這樣處理浮點數的加減法的~也就是通常所說的:求階差、對階,尾數相加,結果規格化(這個不知道是啥意思不要緊,只要知道是把得到的結果調整成為官方格式就好)
那麼,這就產生了一個問題:如何比較兩個階的大小,以右移小階所對應的fraction呢?
在原碼的情況下,這樣的比較是不方便的!
因為,我們規定,對於負數,符號位是1;正數,符號位是0。
那麼一個正數01xxx和另一個正數00xxx比較,顯然,01xxx大。
但是,一個正數0xxx和一個一個負數1xxx比較。。。還是按照上面的比較的話,我們認為是1xxx那個大。。。
為了一個比較設計不同的電路?不划算,不如,加個偏移量,讓負數都變成正數吧。
對!這樣一來,比較就變得容易了!一套簡單電路即可實現~~~
————————————————————————————————
寫這樣粗略地寫一個吧。。。有時間寫詳細一點。。。因為浮點數的階碼錶示指數大小,有正有負,對每個階碼都加上一個正的常數(稱偏移常數),使能表示的所有階碼都為正整數,這就變成「偏移」了的階碼也就是移碼,浮點數小數點的實際位置由移碼減去偏移常數來決定。
比如 階碼為7 和-7兩個值進行比較
如果直接用補碼或者源碼 則需要符號位即0 0000111/ 1 0000111
這樣在比較浮點數的時候就要比較兩次符號位 即 階碼的符號位 跟尾數的數符 對機器來說麻煩而如果採用移碼 機器位為8的話 偏移量為2^7=127 即7=134 -7=120這樣對134 跟120比較進行比較就不需要考慮符號位之所以偏移量一般為2^n-1 就是為了將[-2^(n-1),2^(n-1)-1)的值域轉換為[0,2^n-1)免除符號位(純屬個人理解)你可以想一下,如果我們比較兩個向量,是不是要把它們平移到同一起點譬如坐標原點。所有數加同樣一個數,然後無論正負階碼都成為正的了。
浮點數表示法中,階碼通常要用移碼錶示的主要原因是:
規格化浮點數的最大負數(-Nmax)和取小正數(Nmin)都與通過階碼的最小負數值有關,而在除移碼之外的其它所有碼制中,最小負數都不是全0(包括符號位)。如果浮點零與機器零不一致,對軟體設計和硬體設計都會造成許多麻煩。
各位答主說的都挺對,但是好像沒有解釋為何IEEE中階碼偏置是2^(n-1) - 1而不是2^(n-1),這個我有時間就補充完整。
推薦閱讀: