Tuesday, June 14, 2011

HW: Zakladne operacie s floating point

Cisla, ktore zobrazujeme vo FP by sme urcite radi v nejakom bode pouzili na vypocty. Na zopar zakladnych hodime okom a spravime si k tomu priklady, aby sme si tvrdenia mohli uverit.

Zakladne operacie, ktorymi sa budeme zaoberat

  • Scitanie 
    Scitame mantisy pri rovnakych exponenetoch
  • Odcitanie 
    Odcitame mantisy pri rovnakych exponentoch
  • Nasobenie 
    Scitame exponenty a vynasobime mantisy
  • Delenie 
    Odcitame exponenty a vydelime mantisy
  • Porovnanie 
    Porovname mantisy pri rovnakych exponentoch
  • Posuv 
    Posuv spravime nad mantisou a exponent zvacsime/zmensime 
Scitane a odcitanie
  1. zarovname na exponent
    1. ak je to mozne, tak spravime posuv vlavo mantisy, prisluchajucej vacsiemu exponentu a exponent znizujem. Posuv dolava nemusi byt mozny, napriklad to nejde z normalizovaneho tvaru ... 
    2. ak to mozne nie je, vykonam posuv vpravo mantisy prisluchajucej vacsiemu exponentu a exponent zvysujem. Posuvom doprava stracame presnost.  
      Situaciu si mozme ulahcit a vylucit posuv vlavo, ak pripustime len normalizovany tvar. Pretoze v takom pripade budeme posuvat len doprava. Pre normalizovany tvar plati: (vid reprezentaciu cisel pomocou FP)
        • epxonent je najmensi mozny 
        • mantisa je posunuta co najviac vlavo 
  2. scitam podla

                                        (M1+/-M2)*(z^E); E1 = E2

    Inak, toto vsetko sme sa uz ucili niekde na strednej skole, ale ziaden dobrak nam nepovedal, ze sa to vola mantisa :), 2*10^2 + 5*10^2 = (2+5)*10^2

    Ak chceme v rovnici vyjadrit aj posuv, tak obecne a aj spravnejsie by sme zapisali takto:
    (M1, E1) +/- (M2, E2) =
      • (M1 +/- M2 * (z^(E2 - E1)), E1); E1 >= E2
      • (M1*(z^(E1 - E2) +/- M2), E2); E1 < E2
    • Vsimnite si, ze vzdy posuvame vacsiu mantisu, to ma svoj zmysel. Ako sme uz vraveli, posuvanim doprava stracam presnost a preto radsej posuvame dolava vacsiu mantisu a potom pousvame doprava mensiu mantisu. Samozrejme, ak mame normalizovany tvar, tak prvy problem je vyrieseny a uz nam zostava len posuv doprava. 
Priklad 
0 x 309000000 + 0 x 2D800000, ktore su zapisane podla standardu BFLM, z = 16, mantisa v priamom kode a exponent v aditivnom kode. 

30900000
+            30                                | 900000 |
0 |0 0 1 1 0 0 0 0 | 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |  
+

2D800000
+            2D                                | 800000 |
0 |0 0 1 0 1 1 0 1 | 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |  

Zapiseme si cisla ako usporiadane dvojice (M, E), s ktorymi sa nam bude lahsie pracovat. Aby sme to dokazali, musime previest cislo v mantise z aditivneho kodu. 

Ak(E1) = A + K => A1 = 30 - 40 = -10     Pocitame v z = 16
Ak(E2) = A + K => A2 = 2D - 40 = -13    Pocitame v z = 16 (v z = 10 to je 45 - 64 = -19)

(M1, E1) = (0,9 ; 10^-10 )
(M2, E2) = (0,8 ; 10^-13)

Kedze E1 > E2, tak budeme postupovat podla (M, E) = (M1 +/- M2 * (z^(E2 - E1)), E1); E1 >= E2. znamena to, ze mantisu E2 musime posunut, (M2, E2) = (0,0008 ;10^-10). A mozme pocitat 
(0,9 + 0,0008) = 0,9008 

Vysledok je 0,9008 * 10^-10 v z =16, takze to vlastne 0,9008  * 16^-16 pre z = 10. 

Vysledok nemusi mat vzdy normalizovany tvar, tak ako sa to podarilo teraz. V pripade, ze chceme dodrziavat normalizovane tvary, tak po operacii by sme mali previest normalizaciu, t.j. posunut mantisu a upravit exponent

Nasobenie a delenie
V pripade FP je nasobenie a delenie podstatne prijemnejsou zalezitostou, ako pri binarnych cislach a zaroven je aj jednoduchsie, ako scitanie a odcitanie vo FP. 

Pri nasobeni sa mantisy vynasobia a exponenty scitaju.
Pri deleni sa mantisy podelia a exponenty odpocitaju. 

(M1; E1) * (M2; E2) = (M1*M2; E1+E2) a cislo teda bude v tvare (M1*M2) * z^(E1+E2)
(M1; E1) / (M2; E2) = (M1/M2; E1-E2) a cislo teda bude v tvare (M1/M2) * z^(E1-E2)



Pri vsetkych operaciach, ktore sme popisovali, sme vzdy spravili operacie v pevnej radovej ciarke, aby sme potom mohli spravit operaciu v pohyblivej. Pri tychto operaciach moze dochadzat k problemom/chybam, ako je napriklad overflow a underflow. V takychto pripadoch musime spravne cisla upravit pred tym, ako vykoname operaciu. Ale ani v pripade, ze dojde k over/underflowu, to neznamena, ze sa cisla nedaju zobrazit. Ak scitame cisla 47A00000 + 47900000, tak dostaneme mantisu, ktora je 0,A + 0,9  = 1,3 a musime si ju posunut tak, aby sme ju mohli zobrazit. 

Vysledok operacie nebude zobrazitelny, ak nebude mozne zabezpecit splnenie podmienky
                                   Emin <= E < Emax  
Ak E > Emax, tak hovorime o preteceni (overflow).
Ak E < Emin, tak hovorime o nenaplneni (underflow, podteceni). Znamena to, ze vysledok je prilis blizko 0-e a niekedy sa aj nulou nahradzuje. 

Ozaj, este stale sme nepovedali, ako zobrazime 0-u. Vyzera to jednoducho, ale uz tusite, ze to bude mat fintu :). 0 ma nulovu mantisu, ale pri posunuti 0 sa posuva exponent a ten nie je mozne posuvat uplne donekonecna. Normalizovany tvar nuly ma teda najmensi mozny exponent.