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
- zarovname na exponent
- 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 ...
- 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
- 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.