浮點數的基礎知識

1.浮點數的十進制表現形式

·咱們知道,在 十進制中一般一個浮點數能夠用科學計數法來表示,舉例: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。 

 


 

2.十進制浮點數轉換爲二進制浮點數

在計算機內部,浮點數都是以二進制表示的。因此對於十進制浮點數,咱們要把它先轉換爲二進制浮點數。

分兩步走:

a.整數部分的轉換,採用"除2取餘法"。

b.小數部分採用"乘2取整法"。即把小數部分乘2(第一次計算),所得結果的整數部分做爲小數的十分位,所得結果的小數部分再乘2(第二次計算),第二次計算所得結果的整數部分做爲小數的百分位...以此類推,直到達到所需精度。

 


 

3.二進制浮點數的尾數及規格化

當十進制浮點數轉換完成二進制浮點數後,就要像十進制數那樣對二進制數規格化,以便於計算機表示。

·二進制浮點數的規格化

規格化標準:經過調整小數點的階碼使得該數的有效值在1和2之間,既二進制浮點數的整數部分爲1。

例如:0.8125 = 0.1101(二進制) = 1.101*2^(-1)   

注意:上例末尾的(-1)是階碼,它也是二進制表示。然而,提到階碼就不得不提移碼(增碼),計算機移碼就是在原有的補碼的基礎上對於符號取反。

·那麼爲何會用移碼來表示階碼呢?

由於用補碼錶示階碼的時候,當階碼無限小,產生了下溢的時候,階碼變成了0,那麼這個浮點數的值變爲了1。而實際上這個數是無限接近於零的。那麼咱們就須要取出其中的 "-0「 值做爲機器零。

 

4.計算機二進制浮點數表示過程

先看浮點數二進制表達的三個組成部分:

主要成分是:

  • Sign(1bit):表示浮點數是正數仍是負數。0表示正數,1表示負數
  • Exponent(8bits):指數部分。相似於科計數法中的M*10^N中的N,只不過這裏是以2爲底數而不是10。須要注意的是,這部分中是以2^7-1即127,也即01111111表明2^0,轉換時須要根據127做偏移調整。
  • Mantissa(23bits):尾數部分。浮點數具體數值的實際表示

實例:

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不會形成任何兩個浮點數的混淆。

相關文章
相關標籤/搜索