·咱們知道,在 十進制中一般一個浮點數能夠用科學計數法來表示,舉例:spa
eg.1 -306.5能夠表示爲-0.3065*10^3orm
其中 - 是符號,指數3是階或稱階碼,0.3065是小數部分,左右兩端非0包起來的部分是有效值,此例中的有效值是3065。因爲小數部分也稱爲尾數,因此3065也是尾數。it
eg.2 -3.87效率
其中,有效值爲387,尾數爲87基礎
·爲何稱爲浮點數呢?原理
由於他能夠表示爲 -3.065*10^2 也能夠表示爲 -0.03065*10^4 等,小數部分能夠左右「浮動」 ,但無論小數部分怎麼移動,其有效值保持不變,都是3065(注意:尾數是變化的)。因而,兩個浮點數相加就先要經過小數點的左右浮動,將階碼對齊後進行尾數相加。二進制
(當階碼爲固定值時,數的這種表示法稱爲定點表示,這樣的數稱爲「定點數」;當階碼爲可變時,數的這種表示法稱爲浮點表示,這樣的數稱爲「浮點數」。)im
·十進制浮點數規格化img
爲了使有效值和尾數可以統一,在空間上表達更有效率,有必要將全部浮點數規格化。計算機
規格化標準:經過調整階碼將浮點數寫成小數點前不含有有效數字,小數點後第一位由非0數字表示,舉例-306.5規格化爲-0.3065*10^3。
在計算機內部,浮點數都是以二進制表示的。因此對於十進制浮點數,咱們要把它先轉換爲二進制浮點數。
分兩步走:
a.整數部分的轉換,採用"除2取餘法"。
b.小數部分採用"乘2取整法"。即把小數部分乘2(第一次計算),所得結果的整數部分做爲小數的十分位,所得結果的小數部分再乘2(第二次計算),第二次計算所得結果的整數部分做爲小數的百分位...以此類推,直到達到所需精度。
當十進制浮點數轉換完成二進制浮點數後,就要像十進制數那樣對二進制數規格化,以便於計算機表示。
·二進制浮點數的規格化
規格化標準:經過調整小數點的階碼使得該數的有效值在1和2之間,既二進制浮點數的整數部分爲1。
例如:0.8125 = 0.1101(二進制) = 1.101*2^(-1)
注意:上例末尾的(-1)是階碼,它也是二進制表示。然而,提到階碼就不得不提移碼(增碼),計算機移碼就是在原有的補碼的基礎上對於符號取反。
·那麼爲何會用移碼來表示階碼呢?
由於用補碼錶示階碼的時候,當階碼無限小,產生了下溢的時候,階碼變成了0,那麼這個浮點數的值變爲了1。而實際上這個數是無限接近於零的。那麼咱們就須要取出其中的 "-0「 值做爲機器零。
先看浮點數二進制表達的三個組成部分:
主要成分是:
實例:
Step 1 改寫整數部分
以數值5.2爲例。先不考慮指數部分,咱們先單純的將十進制數改寫成二進制。
整數部分很簡單,5.即101.。
Step 2 改寫小數部分
小數部分咱們至關於拆成是2^-1一直到2^-N的和。例如:
0.2 = 0.125+0.0625+0.007825+0.00390625即2^-3+2^-4+2^-7+2^-8….,也即.00110011001100110011
Step 3 規格化
如今咱們已經有了這麼一串二進制101.00110011001100110011。而後咱們要將它規格化,也叫Normalize。其實原理很簡單就是保證小數點前只有一個bit。因而咱們就獲得瞭如下表示:1.0100110011001100110011 * 2^2。到此爲止咱們已經把改寫工做完成,接下來就是要把bit填充到三個組成部分中去了。
Step 4 填充
指數部分(Exponent):以前說過須要以127做爲偏移量調整。所以2的2次方,指數部分偏移成2+127即129,表示成10000001填入。
尾數部分(Mantissa):除了簡單的填入外,須要特別解釋的地方是1.010011中的整數部分1在填充時被捨去了。由於規格化後的數值整部部分老是爲1。那你們可能有疑問了,省略整數部分後豈不是1.010011和0.010011就混淆了麼?其實並不會,若是你仔細看下後者:會發現他並非一個規格化的二進制,能夠改寫成1.0011 * 2^-2。因此省略小數點前的一個bit不會形成任何兩個浮點數的混淆。