轉自 百度百科


定點數

navmesh 定點數_補碼

原碼乘法

目錄 定點數

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:

  

navmesh 定點數_浮點數_02

除法


  餘數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. 移碼只用於浮點數的階碼部分,故只用於表示整數。

定點數與浮點數的比較

  數值的表示範圍 :浮點表示法所能表示的數值範圍將遠遠大於定點表示法 。

  精度 :對於字長相同的定點數與浮點數來説,浮點數雖然擴大了數的表示範圍,但這是以降低精度為代價的,也就是數軸上各點的排列更稀疏了 。

  數的運算 :浮點運算要比定點運算複雜 。