程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 浮點數的編碼,浮點數編碼

浮點數的編碼,浮點數編碼

編輯:C#入門知識

浮點數的編碼,浮點數編碼


                浮點數的編碼

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


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

                  

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

 機器零 當浮點數的尾數部分M=0時,不論階碼為何值,都看作是零值,稱為機器零。
 上溢 浮點數的絕對值太大而機器不能表示的情況,此時浮點數的階碼大於機器所能表示的最大階碼。
 下溢 浮點數的絕對值太小(階碼小於機器所能表示的最小階碼)的情況稱為下溢。當浮點數下溢時,通常將尾數各位強置為零 ,按機器零處理。

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

                                 

上式表明,當尾數的最高數值位與符號位相反時,即為規格化形式。但對於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

           

在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。

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

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


問算浮點數據的編碼方式?

這個我知道:
任意一個十進制數 N 可以寫成

N=10E.M (2.3)

同樣,在計算機中一個任意進制數 N 可以寫成

N=Re.m (2.4)

m :尾數,是一個純小數。

e :比例因子的指數,稱為浮點的指數,是一個整數。

R :比例因子的基數,對於二進計數值的機器是一個常數,一般規定R 為2,8或16。

一個機器浮點數由階碼和尾數及其符號位組成(尾數:用定點小數表示,給出有效數字的位

數決定了浮點數的表示精度;階碼:用整數形式表示,指明小數點在數據中的位置,決定了浮點

數的表示范圍。):
32位的浮點數中,S:浮點數的符號位,1 位,0表示正數,1表示負數。M:尾數,23位,

用小數表示,小數點放在尾數域的最前面。E:階碼,8 位階符采用隱含方式,即采用移碼方

式來表示正負指數。移碼方法對兩個指數大小的比較和對階操作都比較方便,因為階碼域值大

者其指數值也大。采用這種方式時,將浮點數的指數真值e 變成階碼E 時,應將指數 e 加上

一個固定的偏移值127(01111111),即 E=e+127.

[例1] 若浮點數x的二進制存儲格式為(41360000)16,求其32位浮點數的十進制值。

[解:]
將十六進制數展開後,可得二進制數格式為

指數e=階碼-127=10000010-01111111=00000011=(3)10

包括隱藏位1的尾數1.M=1.011 0110 0000 0000 0000 0000=1.011011

於是有
x=(-1)s×1.M×2e
=+(1.011011)×23=+1011.011=(11.375)10

[例2] 將十進制數數20.59375轉換成32位浮點數的二進制格式來存儲。

[解:]

首先分別將整數和分數部分轉換成二進制數:

20.59375=10100.10011

然後移動小數點,使其在第1,2位之間

10100.10011=1.010010011×24 e=4

於是得到:

S=0, E=4+127=131, M=010010011

最後得到32位浮點數的二進制存儲格式為:

0100 0001 1010 0100 1100 0000 0000 0000=(41A4C000)16
參考資料:計算機組成原理
 

對於浮點數的規格化表示

問題2和1很類似,就不重復了,我們來看一下問題1和問題3。
(1) 56(10)
1) 符號位
首先這是一個正數,所以符號位是0
2) 尾數和階碼的推導
56的二進制表示是:111000。用小數表示相當於是111000.0000000...
現在我們移動小數點,使得小數點前只有1位。對於這個數當然是向左移動:
移動1位是:11100.000000...
移動2位是:1110.000000...
類推
移動5位是:1.11000000...
好了,現在我們知道階碼應該是5,尾數應該是1100000...
你可能會問,怎麼少了一個1?因為有數字前面的0是沒有意義的,所以最高位一定是1(比如00000111,相當於111,所以第一個1前面的0都可以省略)。我們移動小數點的時候保證小數點前面的是那個最高位的1。所以沒有必要表示出來。
3) 階碼
現在我們知道階碼是5,但是是采用移碼的。所謂移碼就是加上01111(最高位是0,其它位是1)。所以最後的階碼是:10100
4) 尾數
補夠你要求的10位就行了。因此是1100000000
5) 完整的數
把上面的符號位、階碼和尾數表達出來就可以了,是:
0 10100 1100000000 16進制就是0x5300

(3) -0.00381(10)
1) 符號位
負數,所以是1
2) 尾數的推導
由於整數部分不存在,所以單獨推導小數就可以了。采用乘2法,每次乘2取整數,然後繼續把小數乘2。
比如你的0.00381乘2是0.00762,整數是0
再乘2是0.01524,整數是0
再乘2是0.03048,整數是0
再乘2是0.06096,整數是0
再乘2是0.12192,整數是0
再乘2是0.24384,整數是0
再乘2是0.48768,整數是0
再乘2是0.97536,整數是0
再乘2是1.95072,整數是1(終於是1了),以後乘的是小數部分
小數部分乘2是1.90144,整數是1
小數部分乘2是1.80288,整數是1
小數部分乘2是1.60576,整數是1
小數部分乘2是1.21152,整數是1
小數部分乘2是0.42304,整數是0
小數部分乘2是0.84608,整數是0
小數部分乘2是1.69216,整數是1
小數部分乘2是1.38432,整數是1
小數部分乘2是0.76864,整數是0
小數部分乘2是1.53728,整數是1
終於算滿了10個有效位(心算的,有可能算錯,但是大概意思是這樣的)。
現在我們知道這個數是0.0000000011111001101...
現在我們向右移動小數點,直到整數位是1,
移動1位是:0.000000011111001101...
類推
移動9位是:1.1111001101...
好了,我們知道階碼是-9,尾數是1111001101(同上面的說明,最高的1忽略了)
3) 階碼
階碼是-9,加上01111是00110
4) 尾數
尾數是1111001101
5) 完整的數
合並上面的結果,是:
1 00110 1111001101 16進制是0x9BCD

另,有的浮點數規范中不省略尾數中最高的1,他們相當於從0.1xxxxx...開始計算的。那麼階碼和尾數會右略微變化。

寫得好累,希望對你有幫助。...余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved