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:

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.

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.

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ő.

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.


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.

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

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.

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.

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