32位ieee 754的階碼偏移量為何用127 而不是128

時間 2021-06-02 11:57:13

1樓:

袁老師說,全0和全1有特殊用途,所以規格化階碼的表示範圍是0000 0001-1111 1110(1-254)。如果偏置是128,則階碼最大是126(254-128)。偏置是126,階碼最大是127,這樣表示的範圍就更大些了。

可是,我想那偏置是125豈不是表示範圍更大些?難道是說寧願犧牲精度也要增大表示範圍?

2樓:

餘127碼,

指數占用8位,

八位二進位制數有,0000 0000-1111 1111,

也就是十進位制正整數的0-255。

用256個正數,代表的是實際指數-127到0再到+128的正負數,這256個實際冪值數。

就是2的-127次冪到2的128次冪。

至於為什麼是-127到128,尤其這個128讓人覺得頭大,128變成二進位制可是1000 0000啊,這不是負零嗎,哈哈。人家就規定的這個樣子,畢竟制定遊戲規則的人就是可以為所欲為。

原因就是這256個數不是普通的變個±符號得來的,而是向右整體移位得到的。

整體向右移動了127位,

把-127移到了0(0000 0000)的位置,

把128移到了255(1111 1111)這個位置。

拋棄了負數符號,方便了計算。

正常的帶符號的二進位制是有正負零的,符號二進位制0000 0000和1000 0000用表示的零和負零。使用時容易製造混亂。

(特殊的地方)但在餘碼中0只有乙個位置,是0111 1111,正0和負零都是這個位置了。

而1000 0000如果是帶符號的二進位制應該是-0,

但是在餘碼指數裡卻是128了。

我們正常使用中冪指數一般是1-254,

就是0000 0001到1111 1110這254個數。

而0000 0000即2的0次冪和1111 1111即2的255次冪,是兩個特殊數字,被定義了其它特殊的意義,什麼正負無窮大,什麼非數字什麼溢位啦等等等,這是造CPU和造程式語言操心的事了。

CPU處理器對各種特殊情況都有特殊定義,我也不懂,只能理解到這了。

餘碼的精髓就是向右移位變正數。

3樓:舊先生

首先我們要清楚偏移量這個東西!

為了簡化浮點數的比較,故我們使用移碼來表示階碼位,這樣就不至於在比較時去考慮兩次符號位了。

這樣一來,階碼位就不存在負數這麼一說了,那麼以8位階碼為例,它的取值範圍就應該在0~255;(即全零和全一)

但是真正的指數肯定得有負數吧,那麼我們就對這個範圍減去乙個固定數,得到另乙個範圍來表示真正指數部分的取值。(即搞上乙個偏移量)

我們原來指數部分如果用乙個帶有符號為的8位數表示的話,應該是從1111 1111~0111 1111即-127~+127

又但是,有幾個特殊的數需要去除掉,因為他們被作為邊界條件被定義了,即0000 0000和1111 1111

我們同時把這兩個數從上邊兩組中去除,得到下面的結果:

0~255變為1~254了

-127~+127變為-126~-0並上+1~+127了;即([-126,+127])

那麼我們就可以得到[1,254]變為[-126,+127],減去127就好了,然後我們就可以獲得真正E的值了

這個減去的127就是我們的偏移量了。

(需要說明的是:

當E為0000 0000時,為了保證取值範圍在[-126,+127],所以這時偏移量應該為126

當E為1111 1111時,它被用來表正負無窮大和NaN無效數,所以就沒必要偏移它了,因為太特殊了

)從結果上看,這也保證了指數取值範圍的對稱性,其根本是來自於那個最高位被拿去當符號位了的原因。

下來我們再繼續說尾數M為什麼要在規範化和非規範化時做加一和不加一!

規範化時,E在[1,254]區間內:

此時,E的偏移量是127,意味著E不可能取到0,那麼當M為零的時候,我們發現,零乘任何數都等於零,不管E怎麼取值,現在結果都為零。這樣我們在表示浮點數的時候便不會出現絕對零值,因為這樣的零起碼有254個,計算機會瘋的。我們知道,1乘以任何數都不變這個道理!

如果我們現在想要表示1x2^-126這個最小精度,如果這時假如對應尾數是M成立,那麼我們只可以用1.00000000000000(...

...)0000000001x2^-126來近似表示這個極小數,你根本不可能準確的取到這個數,而且你還浪費了254個數去表示其他數。所以我們不妨在規範化情況下,尾數使用1+M去表示,這樣我們不但可以取到最小精度,而且還利用了這254個數去準確的表示2^-125,2^-124...

2^-1,2^1,2^127這些數。所以我們巧妙的使用了1乘以任何數都不變的道理,讓M值可以取到0,從而完整了浮點數在數軸上的表示。

非規範時,E為0000 0000

此時,指數部分為0,2的零次方為1,這時的真值即全靠尾數表示

這時當尾數M為0時,才是浮點數真正的0

如果此時M不為0:

那麼它的最小值應該是(以32位浮點數表示為例)2^-23,如果在規範化時採用1+M的形式表現,可想而知,我們是永遠取不到最小精度的值了。【再次應證了為啥規範化時用尾數用1+M】

我們再仔細觀察,發現在規範化下表示1.0000這個數是不可能的,因為規範化下E是取不到0的,並且不管M怎麼取值它都因為加了乙個1而永遠大於等於1,所以是根本不可能表示到1.0000000000000這個數的。

規範化下,撐死只能用1.9999998807907104x2^-1,在尾數字都取1的時候,用它的一半去表示。

有沒有更近似的數去表示1呢?

這時,我們來看看非規範化數,因為不需要加那個1,所以我們可以用0.9999998807907104這個更精確的數去表示1了,這樣一來,我們便更加豐富了浮點數在正負1之間的表示。

雖然很遺憾,我們永遠無法通過編碼讓它取值到1,但是正因為有了非規範化數的存在,讓我們離1更近了一步!!!

(我想這也正是為什麼在瀏覽器開發工具的控制台裡輸入0.1+0.2而得不到0.3的原因吧!)

至於E去1111 1111這種情況,就是規定了,很容易理解。

IEEE 754格式是什麼

Binary life 之前詳細的寫了一篇文章 本文試圖深入淺出的講明白浮點數標準IEEE 754,並分析其精妙的設計原理。通過舉例說明 回答為什麼,帶你漸進的了解浮點數的知識。 計算機再進行數的表達時,沒有直接對正負 小數點的表達方式,人類設計了多種計數編碼方式的,但最著名 應用最廣泛的便是IEE...

IEEE754中真正的指數值e範圍為什麼是 126 127?

Ehco 在IEEE754標準中進行了單精度浮點數 float 和雙精度數浮點數 double 的定義。float有32bit,double有64bit。它們的構成包括符號位 指數字和尾數字。這些位的構成如下 種類 符號位 指數字 尾數字 float 第31位 佔1bit 第30 23位 佔8bit...

為什麼32位的計算機記憶體要用32位二進位制數編址,用64位二進位制數編址記憶體不就可以更大了嗎?

幾乎所有8位微控制器位址匯流排都是16位或16位以上的,幾乎所有16位微控制器位址匯流排都是24位或20位的,為什麼32位的x86cpu位址匯流排是32位呢,這樣做設計方便是乙個原因,最主要的原因是386設計的時候記憶體還普遍使用的是4M,8M的記憶體條,在pc發展速度如此驚人的情況下,10年後12...