A táblázatok listája
6. Műveletek lebegőpontos számokkal
Végül elérkeztünk a lebegőpontos ábrázolás és használat valódi céljához, a műveletek szabályaihoz. Amikor szabványos lebegőpontos műveletet végzünk, akkor az alábbiak valamelyikét hajthatjuk végre:
• összeadás, kivonás, szorzás, osztás
• karakterisztika feszített eltolásos / kettes komplemens konverzió
6.1. Lebegőpontos számok kerekítése
Már az előbbi saját kis lebegőpontos példánkban láttuk, hogy a kiinduló adatok és a műveletben részt vevő adatok nem azonosak a tárolási korlátok és egyéb okok miatt, sőt, amikor egy eredmény keletkezik, akkor az általában hardver szempontból egy 4–6 bittel szélesebb mantissza tárolására alkalmas regiszterben jön létre, az ALU-ban (Aritmetikai Logikai Egység). Vagyis mielőtt használni kezdenénk, és a memóriába töltenénk a számunkat, az adott lebegőpontos reprezentációra kerekíteni kell.
Ennek a műveletnek már induláskor közvetlen befolyása van a végső pontosságra, ezért több kerekítési mód van attól függően, hogy milyen eredménypontosságot várunk el később.
6.1.1. A legközelebbi ábrázolható számra történő kerekítés
Láttuk a 2,210=10,00110011001100112=1, 000110011001100112∙21 példán, hogy a teljes mantissza nem felhasználható, ezért keressük meg azt az ábrázolható számot alul vagy felül, amelyik a legkisebb távolságra van az egzakt mantissza által meghatározottól. Ilyenkor kapnak szerepet az ún. őrző bitek, melyek a pontosságot befolyásoló a számításokban közvetlenül nem részt vevő biteknek a pontosságát „őrzik”. Ezekről még nem beszéltünk, és jelentőségük abban van, hogy az eredeti egzakt mantisszának az ábrázolható szakaszát követő biteket is tároljuk abban a 4–6 bittel szélesebb regiszterben, az ALU-ban, ahol az eredmény létrejön.
Alkalmazásával mód van a rejtett egyes alkalmazásakor jobbról értékes jegyet/jegyeket beléptetni a mantisszába.
Ennek a mantisszában tárolt legalább három bit hosszú bitmintának (őrző bitek) az elemzésével módunk van a mantissza LSB-jének (legalacsonyabb helyi értékű bitjének) a kerekítésére. Például, ha az őrző bitek bitmintája 101, akkor az LSB követő bitjei nagyobbak, mint az utolsó bit fele (mint az áru vásárlásnál a decimális „5”), ezért a kerekítés a következő alaki értékre célszerű. Ez azt jelenti, hogy az LSB-hez adunk egy bináris 1-et.
6.1.2. Levágás
A másik kerekítési eljárás a levágás, ami a mantisszában nem tárolható bitek figyelmen kívül hagyását jelenti.
Használata persze jobban rontja a pontosságot, mint a kerekítés, de sokszor az így kapott pontosság is elegendő.
6.1.3. Reprezentáns keresése
Használatos még a számnak a legközelebbi pontosan ábrázolható valós számhoz való „húzása”, ami azt jelenti, hogy ha a szám nem egy reprezentáns (korábban már említettük, hogy azokat a valós számokat, amelyeket a tárolási tartományon egzakt pontossággal képesek vagyunk tárolni a mantisszában, reprezentánsoknak nevezzük), akkor megkeressük a hozzá legközelebbi reprezentánsát, és a továbbiakban ezzel helyettesítjük az eredeti számot.
A pontosság megbecsülésére alkalmazott ún. intervallumaritmetikai ellenőrzés, hogy a számot a lehetőség szerinti felső és alsó reprezentánsára kerekítjük és ezek különbségének nagyságrendjével becsüljük meg a hibát.
Most, hogy ismerjük a lebegőpontos számábrázolás elméletét, vizsgáljuk meg a gyakorlatban egy intelligens prezentáción a szabványos lebegőpontos számok előállításának elemeit, melynek segítségével közvetlenül is tapasztalhatjuk az egyes elméleti fogalmat gyakorlati magvalósítását.
5-14. ábra - http://gate575.hu/ITMagister/Float
A segítségével vizsgáljuk meg, és számoljunk utána a kiválasztott decimális szám konverziójának, és keressük meg az őrző biteket, illetve azok hatását a kerekítésre és a hiba számítására.
6.2. Lebegőpontos összeadás
Az összeadást azonos karakterisztikájú összeadandókkal végezhetjük el.
Tételezzük fel, hogy a két összeadandó szám karakterisztikája nem azonos: e1 <> e2
Az első szám fenti ábrázolásában a rejtett egyes helyreállításával a teljes mantissza , és mivel a karakterisztika 128, azaz 127 + 1, ezért a szám abszolút értéke:
|N1| = 1,12×21=3, az előjellel pedig N1 = −310
A második szám fenti ábrázolásában a rejtett egyes helyreállításával a teljes mantissza 1,012, és mivel a karakterisztika 129, azaz 127 + 2, ezért a szám abszolút értéke:
|N2| = 1,012×22=5, az előjellel pedig N2 = −510.
Először hozzuk a két karakterisztikát azonos alakra. Legyen a közös karakterisztika a második számé, ami e1=100000012. Ha az első szám karakterisztikáját szintén erre állítjuk, vagyis növeljük, akkor a mantisszát egy bináris helyi értékkel csökkenteni kell ahhoz, hogy az eredeti érték ne változzon. A közös karakterisztika tehát
E=100000012, ami megfelel 22 = 4-nek. Az első szám mantisszája ezért m1=0,112 lesz. Most már elvégezhetjük a két mantissza összeadását:
Az eredményt kötelezően normálnunk kell, mert a művelet eredményének nagyságrendje eltérhet a korábban meghatározott közös karakterisztikától. Mint a mi esetünkben is, az eredmény, 10.00×22 már nem normál alakú, ezért a normálás után 1,000×23 lesz. Ezzel az új karakterisztikával és a rejtett egyes eljárással az eredményül kapott szám:
N2 = , ami 0xC080000 lesz.
Ellenőrzés: e = 130-127 = 3 és m = 1 → N = 1×23∙= −810
6.3. Lebegőpontos kivonás
Az azonos karakterisztikájú kisebbítendőből kivonjuk az azonos karakterisztikájú kivonandót.
Tételezzük fel, hogy a két összeadandó szám karakterisztikája nem azonos: e1 <> e2
Az első szám a fenti ábrázolásban a rejtett egyes helyreállításával a teljes mantissza 1,012, és mivel a karakterisztika 129, azaz 127 + 2, ezért a szám abszolút értéke:
A második szám a fenti ábrázolásban a rejtett egyes helyreállításával a teljes mantissza 1,12, és mivel a karakterisztika 128, azaz 127 + 1, ezért a szám abszolút értéke:
|N2| = 1,12×21=3, az előjellel pedig N2 = 310.
Először hozzuk a két karakterisztikát azonos alakra. Legyen a közös karakterisztika az első számé, ami e1=100000012. Ha a második szám karakterisztikáját szintén erre állítjuk, vagyis növeljük, akkor a mantisszát egy bináris helyi értékkel csökkenteni kell ahhoz, hogy az eredeti érték ne változzon. A közös karakterisztika tehát E=100000012, ami megfelel 22 = 4-nek. A második szám mantisszája ezért m2=0,112 lesz. Most már elvégezhetjük a két mantissza kivonását:
Az eredményt kötelezően normálnunk kell, ami exponenscsökkenést jelent, vagyis balra léptetést, melynek eredményeként az eredmény normál alakja ∙ lesz. Így a karakterisztika és a rejtett egyes eljárással az eredményül kapott szám:
N2 = , ami 0xC0C0000 lesz.
Ellenőrzés: e = 128-127 = 1 és m = 1 → N = 1×21∙= 210
A kivonás és az összeadás algoritmusát célszerűen a műveletvégzőben összevonják és az eredmény, valamint az alkalmazott eljárás az előjelbitek kiértékelésétől és számos más tényezőtől is függ.
6.4. Lebegőpontos szorzás
A mantisszákat szorozzuk egymással, a karakterisztikákat pedig összeadjuk. Az előjel a két előjel kizáró vagy kapcsolatának eredménye.
Az első szám fenti ábrázolásában a rejtett egyes helyreállításával a teljes mantissza 1,012. Mivel a karakterisztika 129, azaz 127 + 2, ezért a szám abszolút értéke:
A második szám fenti ábrázolásban a rejtett egyes helyreállításával a teljes mantissza 1,12. Mivel a karakterisztika 128, azaz 127 + 1, ezért a szám abszolút értéke:
|N2| = 1,12×21=3, az előjellel pedig N2 = 310.
Most nem kell a két karakterisztikát azonos alakra hozni, elvégezhetjük a két mantissza szorzását a táblázatos léptetés és összeadás módszerével:
1 0 1
0 1 1
1 0 1
1 0 1
0 0 0
0 1 1 1 1
A karakterisztikák összege 3 lesz, és mivel pozitív, ezért 127+3=130 a feszített előjeles alak. Az eredmény tehát
a rejtett egyes alkalmazásával lesz. Az előjelet a két előjelbit kizáró
vagy kapcsolatának eredménye adja, vagyis s1 xor s2 = 0 xor 0 = 0, vagyis a szám pozitív.
6.5. Lebegőpontos osztás
A mantisszákat osztjuk egymással, az osztandó karakterisztikájából kivonjuk az osztó karakterisztikáját. Az előjelet a két előjel kizáró vagy kapcsolatának eredménye adja.
Az első szám fenti ábrázolásában a rejtett egyes helyreállításával a teljes mantissza1,012. Mivel a karakterisztika 129, azaz 127 + 2, ezért a szám abszolút értéke:
A második szám fenti ábrázolásban a rejtett egyes helyreállításával a teljes mantissza 1,12. Mivel a karakterisztika 128, azaz 127 + 1, ezért a szám abszolút értéke:
|N2| = 1,12×21=3, az előjellel pedig N2 = 310.
Most sem kell a két karakterisztikát azonos alakra hozni, elvégezhetjük a két mantissza osztását a sorozatos kivonás alkalmazásával és léptetés módszerével:
A karakterisztikák különbsége 2–1 = 1, vagyis az osztás eredménye: 0,1101010101010101010101012∙21, amit viszont kötelezően normálnunk kell, így kapjuk az 1,101010101010101010101012∙20 –t. Az új karakterisztika 0, eltolással E=100000002.
Az eredmény tehát a rejtett egyes alkalmazásával, valamint a két előjelbit xor kapcsolatba hozásával (s1 xor s2 = 0 xor 0 = 0, vagyis pozitív)
lesz.
Ellenőrizzük az eredményt: 510:310=1,66666666710=1,101010101010101010101012