浮點數的編碼

                浮點數的編碼

(1)浮點數:
    小數點位置可移動的數據稱爲浮點數,可用下式表示:N=M*RE
其中,M—尾數,
   R—階的基數(也就是指數部分的底)。R 通常取二、8或16,爲約定的常數,大多數機器 R 取定爲2。
   E—階的階碼。編碼


  當基數約定後,對浮點數的編碼就只需對尾數和階碼部分進行編碼。浮點數在機器中的形式以下:spa

                  

尾數M用定點小數表示,階碼E是整數。 M乘以RE後小數點的位置改變,改變指數部分RE的值,小數點的位置隨之變更,故稱上述表示法表示的數據爲浮點數。
 
 (2)浮點數的編碼
    階碼E通常用移碼或補碼錶示,尾數用原碼或補碼錶示。.net

 機器零 當浮點數的尾數部分M=0時,不論階碼爲什麼值,都看做是零值,稱爲機器零。
 上溢 浮點數的絕對值太大而機器不能表示的狀況,此時浮點數的階碼大於機器所能表示的最大階碼。
 下溢 浮點數的絕對值過小(階碼小於機器所能表示的最小階碼)的狀況稱爲下溢。當浮點數下溢時,一般將尾數各位強置爲零 ,按機器零處理。 orm

        
 
 (3)規格化浮點數
    爲了便於浮點數之間的運算與比較,也爲了提升浮點數的精度,規定計算機中的浮點數尾數部分必須知足1/R≤|M|<1,也即,小數點後的第一位必須是有效數字。當尾數用補碼錶示,且R=2時,其規格化形式通常爲:                              blog

                                 

上式代表,當尾數的最高數值位與符號位相反時,即爲規格化形式。但對於M<0 有兩種特殊狀況需考慮。排序

   *M=-1/2,按規定是規格化數,但[-0.5]補=1.10…0,與通常狀況相悖,爲便於硬件判斷,特規定-0.5不    是規格化的數(對補碼而言)。內存

   *M=-1,因小數補碼容許表示-1,且[-1]補=1.00…0.故將-1做爲規格化數(對補碼而言 )
 
 (4)IEE754標準
  現代計算機中,浮點數通常採用IEEE制定的國際標準,形式以下;字符串

  符號位s 階碼e 尾數 總位數
     短實數(單精度數) 1 8 23 32
     長實數(雙精度數) 1 11 52 64
     臨時實數 1 15 64 80 get

           

在IEEE754浮點數標準中,符號位也是「0」表示正數,「1」表示負數。階碼也用移碼錶示,尾數也是規格化表示,但爲以下形式:1.ff---f.在實際表示中,整數位的1省略,稱隱藏位 (臨時實數不採用隱藏位方案)。因爲尾數形式的變化,階碼部分也與通常移碼不一樣,對短實數而言,[X]移=27+x-1=127+x,也就是說此種移碼比通常移碼的值小1,如.[810]移爲13310  而不是13410。因此,短實數.長實數和臨時實數的階碼偏移量分別爲7FH、3FFH和3FFFH。單精度數所表示的數值爲:(-1)5 1.ff---f*2e-127。it

注意:浮點數的編碼有多種方法,在實際應用時,首先必定要明確是哪一種編碼方法,分清各類編碼方法的不一樣之處,這樣才能不出差錯。
 
  

4.文字的編碼
 (1)  西文字符的編碼 目前經常使用的編碼系統是ASCII碼(American Standard  Code  for  Information Interchange)。
  ASCII碼特色:
*每一個字符用7位二進制代碼表示。在計算機中每一個符號實際用8位表示,最高位置「0」或做爲奇偶校驗位。
*共有128個符號。其中95個可印刷字符(包括空格),其他爲控制字符。
*字符0——9的高3位編碼爲011,低4位爲0000——1001(正好爲二進制形式的0—9),知足正常的排序關係,且大、小寫英文一位字母編碼的對應關係簡單,大寫字母的高2位編碼10,低5位爲00001-11010(爲二進制形式的1—26),小寫字母高2位爲11,低5位也爲0000—11010。
 (2)中文編碼
  漢字編碼分輸入碼、機內碼和字形碼等三大類。
漢字輸入碼  主要有數字編碼、拼音編碼和字形編碼等。這幾種編碼方式都是利用相應的編碼規則,用字母數字串代
      替漢字,從西文標準鍵盤上輸入漢字。
漢字機內碼 用於漢字信息存儲、交換、檢索等的機內代碼,通常用兩個或三個字節表示一個漢字。爲了區別於ASCII
      碼,漢字機內代碼中字節的最高位均爲「1」。
漢字字形碼 根據漢字字形信息進行編碼,存儲在字形庫中,用於漢字的輸出,經常使用點陣表示漢字字形。
 (3)十進制數的編碼
  *字符串形式  一個字節存放一個十進制的數位或符號,用連續的多個字節表示一個完整的十進制數據。
十進制數據的機內表示經常使用ASCII碼。有前分隔字符串和串兩種方式。

#前分隔字符串  符號位在數字位以前單獨佔用一個字節。字符「+」(2B)16表示正號,「-」(2D)16表 示負號。

#後嵌入字符串   將符號位嵌入最低一位數字裏。規則:將「-」號變成(40)16與最低位數相加。「+」號省略。

上述兩種表示方法主要用於非數值計算的應用領域,算術運算不方便。

*壓縮十進制數串形式  一個字節存放兩個十進制數位,用連續的多個字節表示一個完整的十進制數據。比前一種形式節省存儲空間而且便於數據處理,應用普遍。
  在壓縮十進制數串形式中,能夠用ASCII碼的低4位或BCD碼錶示十進制數。符號位也用4位二進制代碼表示,並放在最低數位以後(C)16=(1100)2表明正號,(D)16=(1101)2表示負號。
  用十進制數串表示十進制數據的特色是位長可變,但需給出首地址和串長。

 

插入一點內容:  十進制小數變爲二進制
例如:0.25,
轉換過程爲:0.25×2=0.5,因此小數點後第一位取0
0.5×2=1.0,因此小數點後第二位取1,如今十進制小數的小數點後爲0,因此轉換結束。結果爲0.01。
例如:0.65,
轉換過程:0.65×2=1.3,取1,
          0.3×2=0.6,取0,
          0.6×2=1.2,取1,
          0.2×2=0.4,取0………………
結果爲0.1010……

 

好的,下面是實戰,看一個簡單的例子:(沒了解實現機制以前真是頭疼)

float f=0.5 ,應該表示爲1* 2^(-1)

看到內存裏是怎麼表示的 f = 0x3f 00 00 00

二進制的表示是 0011 1111 0000 0000 ............

第31位是0,表示符號+

第23-30 是階碼,通常用移碼錶示,-1(1000 0001)的反碼就是0111 1110 (這裏用的反碼),不錯

第0-22位是基數,怎麼是0,應該是1 啊 ,原來ieee754的浮點數使用了隱含位,即尾數部分要加上1纔是真正的尾數

.... 真是的,規矩還真多

 

再看float f=2.5

0010.1 = 1.01*2(1)

正數,因此32位爲0

-1:  0000 0001+ 127 =128 =1000 0000

因此2.5 的內存表示爲0100 0000 0000 ..................    (0x40 00 00 00)

 

 若是float f=-2.5

負的,因此32位爲1

2.5=10.1=1.01*2^1

1+127=128=1000 0000

因此-2.5的內存形式就是1100 0000 0010 0000...................

 16進制就是0xc0200000

 

本文轉自http://blog.csdn.net/cslie/article/details/2121355

相關文章
相關標籤/搜索