• Nem Talált Eredményt

Műveletek lebegőpontos számokkal

In document Az ábrák listája (Pldal 129-135)

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

6. fejezet - Bevezetés az assembly

In document Az ábrák listája (Pldal 129-135)