浮點數的編碼

2022-04-03 10:58:05 字數 3515 閱讀 7973

(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

本文**

浮點數的編碼

1 浮點數 小數點位置可移動的資料稱為浮點數,可用下式表示 n m re 其中,m 尾數,r 階的基數 也就是指數部分的底 r 一般取2 8或16,為約定的常數,大多數機器 r 取定為2。e 階的階碼。當基數約定後,對浮點數的編碼就只需對尾數和階碼部分進行編碼。浮點數在機器中的形式如下 尾數m用定點...

浮點數的儲存以及 浮點數的比較

浮點數的儲存採用的是近似的原理 float儲存格式為 s e m 1位符號位 8位指數 23位尾數 轉成數值即為 v 1 s 1.m 2 e 127 對於16.5轉成二進位制為00010000.1 1.00001 2 4,那麼在記憶體的表示為 符號位 指數4 127 131 尾數 0 1000001...

浮點數 儲存

關鍵字 體系結構 ieee754 浮點數 儲存 main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001。為什麼會是123.456001?有六位小數可以理解,最後那個1是為何?有很多人解釋說最後那個1是亂碼,隨機的。嘿嘿 其實無論你...