轉自 百度百科
定點數
原碼乘法
目錄 定點數
1 定點數的表示
1.1 無符號數的表示
1.2 帶符號數的表示
(1) 定點整數
(2) 定點小數
(3) 原碼錶示
(4) 補碼錶示
(5) 反碼錶示
(6) 移碼
定點數與浮點數的比較
【dìng diǎn shù 】
計算機中採用的一種數的表示方法。參與運算的數的小數點位置固定不變。
1 定點數的表示
1.1 無符號數的表示
指整個機器字長的全部二進制位均表示數值位,相當於數的絕對值。若機器字長為n+1為,則數值表示為:
X=X0X1X2...Xn 其中Xi={0,1}, 0<=i<=n 即X0*2^n + X1*2^(n-1) + X2*2^(n-2) + ... + Xn-1*2 + Xn
數值範圍是 0≤X≤2^(n+1) - 1
例如:1111表示15。
1.2 帶符號數的表示
最高位被用來表示符號位,而不再表示數值位。
(1) 定點整數
小數點位固定在最後一位之後稱為定點整數。若機器字長為n+1為,數值表示為:
X=X0X1X2...Xn,其中Xi={0,1},0≤i≤n 即(-1)^X0 * (X1*2^(n-1) + X2*2^(n-2) + ... + Xn-1*2 + Xn)
數值範圍是 -(2^n-1)≤0≤2^n-1
例如:1111表示-7。
(2) 定點小數
小數點固定在最高位之後稱為定點小數。若機器字長為n+1為,數值表示為:
X=X0.X1X2...Xn,其中Xi={0,1},0≤i≤n (這裏X0不表示數字,只表示符號,若X0=0,則代表X=0.X1X2...Xn,X0=1,則代表-0.X1X2...Xn)。
即 (-1)^X0 * (X1*2^(-1)) + X2*2^(-2) + ... + Xn-1*2^(-n+1) + Xn*2^(-n)
數值範圍是 -(1-2^(-n))≤X≤1-2^(-n)
例如:1111表示-0.875
(定點小數也被用在浮點數的尾數(Mantissa)部分)
(3) 原碼錶示
原碼是用機器數的最高一位代表符號,以下給位給出數值絕對值的表示方法。其定義為:
整數:
[X]原=X (0≤ x<2^n)
[X]原=2^n-X (-2^n<X≤0)
小數:
[X]原=X (0≤X<1)
[X]原=1-X (-1<X≤0)
這裏X是數的實際值(真值),[X]原為原碼錶示的機器數。
例如:真值X=+1001,[X]原=01001;真值X=-1001,[X]原=10000-(-1001)=11001;真值X=-0.1001,[X]原=1-(-0.1001)=1.1001。
原碼的性質:
1. 符號位+數的絕對值。
2. 0有兩個編碼。
3. 加減運算規則複雜,乘除運算規則簡單。
4. 表示簡單,易於和真值之間進行轉換。
原碼的運算:
加法:
先判斷符號位,若相同,絕對值相加,結果符號位不變;若不同,絕對值大的數減去絕對值小的數,符號位和絕對值大的數相同。
[X]原=00010,[Y]原=01010,X+Y=00000+1010+0010=01100;[X]原=10010,[Y]原=01010,X+Y=00000+1010-10=01000。
減法:
將減數符號取反,然後將被減數和符號取反的減數相加。
[X]原=10010,[Y]原=01010,X-Y=10010+11010=10000+0010+1010=11100。
乘法(原碼一位乘):
是模擬豎式手算的方法。引入一個值為部分積(初值為0)。符號位是被乘數和乘數符號位的異或值。之後檢視乘數(符號位以外)從低向高的每一位,若為1,部分積(對齊最高位)加被乘數(符號位以外),並右移一位;若為0,部分積加0,右移一位。
例如:[X]原=11101,[Y]原=01011。X*Y:符號位S=1⊕0=1
則X*Y=110001111。
除法(交替加減法):符號位為被除數和除數符號位異或獲得。之後被除數減除數(補碼錶示),當餘數為正時,商“1”,餘數左移一位減除數;當餘數為負時,商“0”,餘數左移一位,加除數。
例如:[X]原 = 0.1001,[Y]補= 0.1011,X/Y:
除法
餘數r0<0,商0
商0,r和q左移一位
加y
餘數r1>0,商1
商1,r和q左移一位
減y
餘數r2>0,商1
商1,r和q左移一位
減y
餘數r3<0,商0
商0,r和q左移一位
加y
餘數r4>0,商1
X/Y 的商 [Q]原 = 0.1101,餘數[R]原 = 0.0001。
(4) 補碼錶示
補碼定義為:
整數:
[X]補=X (0≤X<2^n)
[x]補=2^(n+1)+X (-2^n<X≤0 mod 2^(n+1)(意味相對與2^(n+1)做補))
小數:
[X]補=X (0≤X<1)
[x]補=2+X (-1<X≤0 mod 2(意味相對與2做補))
例如:真值X=+1001,[X]補=01001;真值X=-1001,[X]補=100000+(-1001)=100000-1001=10111;真值X=-0.1001,[X]補=2+(-0.1001)=10-0.1001=1.0111。
補碼的性質:
1. 機器數和真值的關係為: [X]補=2*符號位+X
2. [X]補和真值的關係:X=[X]補 - 2*X0=X0.X1X2...Xn - 2*X0=-X0 + 0.X1X2...Xn
3. 0有唯一的編碼。
4. 兩數補碼加法,把符號位和數值位等同處理,結果的符號位與數值位都正確。
5. 補碼數的算數移位
把[X]補的符號位和數值位一起右移一位並保持原符號位的值不變,可用來實現除法功能(除以2)。
變形補碼,又稱模4補碼,把普通補碼由模2改為模4,其中雙符號位00代表正,11代表負,01上溢,10下溢。
(5) 反碼錶示
反碼是用機器數的最高位代表符號,數值位是對負數各位取反的表示方法,定義為:
整數:
[X]反=X (0≤X<2^n)
[X]反=(2^(n+1)-1)+X (-2^n<X≤0 mod (2^(n+1)-1))
小數:
[X]反=X (0≤X<1)
[X]反=(2-2^(-n))+X (-1<X≤0 mod (2-2^(-n)))
例如:真值X=+1001,[X]反=01001;真值X=-1001,[X]反=10110;真值X=-0.1001,[X]反=1.0110。
反碼的性質:
0有2個編碼。
現在計算機中,較少使用反碼。
(6) 移碼
移碼定位為:
[X]移=2^n+X (-2^(-n)≤X<2^n)
當真值用補碼錶示時,由於符號位和數值部分一起編碼,與習慣上的表示法不同,因此人們很難從補碼的形式上直接判斷其真值的大小。
十進制數X=31,對應的二進制數為+11111,則[X]補=011111;十進制數X=-31,對應的二進制數為-11111,則[X]補=100001,看上去好像100001>011111,其實正好相反。如果我們對每個真值加上一個2^n,X=11111加上2^5可得11111+100000=111111;X=-11111加上2^5可得-11111+100000=000001,這樣就可以直接通過二進制代碼比較大小。
移碼的性質:
1. 最高位為符號位。
2. 0有唯一編碼。
3. 保持了數據原有的大小順序。
4. 移碼只用於浮點數的階碼部分,故只用於表示整數。
定點數與浮點數的比較
數值的表示範圍 :浮點表示法所能表示的數值範圍將遠遠大於定點表示法 。
精度 :對於字長相同的定點數與浮點數來説,浮點數雖然擴大了數的表示範圍,但這是以降低精度為代價的,也就是數軸上各點的排列更稀疏了 。
數的運算 :浮點運算要比定點運算複雜 。