Sunday, June 12, 2011

HW: Zobrazenie cisel so znamienkom v dvojkovej sustave

Nasim problemom bude, ako pocitacu povedat, ze cislo, ktore zobrazujeme je zaporne, alebo kladne. V beznom zivote napiseme pred cislo dane znamienko, ale mame pomerne neobmedzene miesto. Pruser nastava napriklad v registroch, kde je pevne dana dlzka radovej mriezky (mame dane pocet policok), ktoru mozme vyuzit. Pre zobrazenie pouzijeme bud priamy kod, alebo aditivny kod, alebo doplnkovy kod.

Priamy kod
V priamom kode predstavuje najvyssi rad znamienko. Zvysok radovej mriezky je absolutna hodnota zobrazovaneho cisla. Znamienko + je reprezentovane 0-ou a - 1-kou. 

Formalna definicia hovori, ze obraz cisla A v priamom kode je A pre A vacsie ako 0 a mensie ako z^n, kde n je najvyssi rad, alebo sucet z^n a absolutnej hodnoty A, ak A je mensie ako 0 a zaroven vacsie ako -z^n

P(A)  =

  • A; 0 =< A < z^n               #pre n = 3, z = 2, cislo 2 to znamena, ze 0 =< 2 < 8
  • z^n + |A|; -z^n < A =< 0  #pre n = 3, z = 2, cislo -2 to znamena, ze -8 < -2 =< 0
P(-25); z = 10, n = 3
-25 je mensie ako 0, takze bude platit P(A) = z^n + |A| = 10^3 + 25 = 1025. V radovej mriezke to bude 
                                           
                                                        1 |  0 |  2  |  5   

P(0,05); z = 10, n = 0, m = 2
0,05 je vacsie ako 0 a zaroven mensie ako z^n (1). 

                                                        0, |  0 |  5  

P(101); z = 2, n = 3, m = 0
101 je mensie ako 2^3 a vacsie ako 0 

                                                      0 | 1 |  0 |  1  

P(-0,11); z = 2, n = 0, m = 3
jedna sa o zaporne cislo, ktore je stale vacsie, ako -1. Preto 1 +  0,75 = 1,75

                                                      1, |  0  |  0  |  0 
                                                      0, |  1  |  1  |  0
                                                      1, |  1  |  1  |  0
  
Tento sposob je dost intuitivny a jednoduchy, ale vsimnite si, ako nam pridanie jedneho bitu znizilo rozsah a zaroven by sme sa mali vyvarovat zapornej 0-y (1,0000), ktora je dostatocne velmi zbytocna :). 

Aditivny kod
Tento kod sa obcas oznacuje za "kod s posunutou 0-ou". K zobrazovanemu cislu sa pripocita konstanta a "voila", cislo je na svete :). Toto znie ale az prilis jendoducho na to, aby to bola pravda. Aditivny kod meni sposob interpretacie dat. Hodnotu cisla pred zapisom zvysime o pevne zvolenu konstantu (vacsinou 1/2(z^(n+1))). Tym sa zbavime zapornych cisel. Pri dekodovani zase hodnotu odpocitame. 

Formalne vyjadrime zobrazenie cisla takto
                                
                                   Ak(A) = A + K pre -K =< A < Z - K 

Obraz cisla A v aditivnom kode, pre ktore plati, ze je vacsie ako -K a mensie ako baza - K, kde K je vhodne zvolena konstanta, je rovny suctu povodneho cisla a konstanty. Zostava nam zvolit K. To sa vacsinou voli ako 
  • 1/2 * Z, kde z je modul, Z = z^(n+1)
  • 1/2 * (Z - epsilon), kde epsilon je jednotkou mriezky (z^-m)
Uvedme si radsej priklad. 

-25, z = 10, n = 3, m = 0
K = 1/2 * Z = 1/2 * z^(n+1) = 1/2 * 10^(3+1) = 1/2 * 10^4 = 5000

                                   Ak(A) = -25 + 5000 = 4  |  9  |  7  |  5 

+0,05, z = 10, n = 0, m = 3
K = 1/2 * Z = 1/2 * 10^0 = 0,5 je ale prilis malo, tak zvolime Z - epsilon = 1 - 10^(-3) = 1 - 0,999 = 0,001 a to je tiez malo ... pruser je v tom, ze najmensie cislo moze byt 0,999 (z^-m) a my potrebujeme take cislo, aby sme mohli aj toto cislo preklopit, zvolime teda 1-ku.   

                                   Ak(A) = 0,05 + 1 = 1,  |  0  |  5  |  0

+101, z = 2, n = 3, m = 0 
K = 1/2 * Z = 1/2 * 2 ^ (4) = 8 => 1000
 
                                   Ak(A) = 0101 + 1000 = 1  |  1  |  0  |  1

-0,11, z = 2, n = 0, m = 3 
K = 1/2 * Z = 1/2 * 2 ^ 0 = 0,5 .. hmm? 
Jednotka = z^-m = 0,999 ... takze zvolime 1,000

                                   Ak(A) =-  0,110 + 1,000 = 0,  |  0  |  1  |  0


Doplnkovy kod 
Posledny zo serialu kodov v tomto prispevku :). V dalsej casti sa budeme zaoberat operaciami s cislami zapisanymi v tomto kode. 

Urcite si spominate na prvy kod. Priamy kod, ktory mal par much, napriklad plytvanie miestom v mriezke. Toto riesi doplnkovy kod. Znamienko v doplnkovom kode je organickou sucastou cisla a takisto, ako aditivny kod, meni interpretaciu cisla. Interpretaciu meni len pre zaporne cisla.

D(A) = 
  • A; 0 <= A < 1/2 Z
  • Z + A; -1/2*Z <= A < 0
-25, z = 10, n = 3, m = 0
Z = 10^(n+1) = 10000

                              D(A) = 1000 - 25 = 9 |  9  | 7  | 5

+0,05, z = 10, n = 0, m = 3
0<= A < 5000

                                D(A) = 0, |  0  |  5  |  0

+101, z = 2, n = 3, m = 0 
0 <= A < 1/2 * Z
 
                                D(A) = 0 | 1  |  0  |  1

-0,11, z = 2, n = 0, m = 3 
Z = 2^(1) = 2 

                              D(A) = 10,000 - 00,110 = 1, |  0  |  1  | 0

Doporucujem: http://voho.cz/wiki/kodovani-celych-cisel-v-radove-mrizce/ pre priklady a volne podanie