• Nem Talált Eredményt

Fixpontos számok

In document Informatikai alapok (Pldal 59-64)

2. Számrendszerek. Digitális számábrázolás és műveletek

2.4. Számítógépes számábrázolás

2.4.1. Fixpontos számok

A fixpontos számoknál az elnevezés arra utal, hogy a kettedes pontnak a helye nem változik.

Ezeket a számokat különböző hosszakon lehet ábrázolni, amelyek általában a bájtnak a többszörösei. Tehát találkozhatunk 1 bájt (byte) méretű számokkal, 2 bájt méretűekkel (ezeket az Intel wordnek hívja), 4 bájtosakkal (double word) vagy 8 bájtos számokkal (quad word). A különböző alkalmazásokra való tekintettel meg kell, hogy különböztessünk előjel nélküli és előjeles számábrázolást. Például a hallgatók szakonkénti nyilvántartásában nincs szükség negatív számokra, de a napi hőmérsékletet nyilvántartásához előjeles számokat kell használni.

Előjel nélküli számok

Előjel nélküli szám azt jelenti, hogy csak a számnak az értékét kell kódolnunk, mégpedig úgy, hogy a kettedes pontnak a helye rögzítve van. Az a konvenció, hogy a kettedes pontnak a helye mindig a legkisebb helyi értékű számjegytől jobbra helyezkedik el. Magát a kettedes pontot nem is kell külön ábrázolni, mert úgyis tudjuk, hol van. Ennek folytán a fixpontos számok mindig egész számok lesznek, mert már a ponttól jobbra törtrész nincsen. (A processzoron belül a fixpontos számokkal való műveleteket végző aritmetikai egység az integer unit.)

A 2.1. ábrán látható példa egy 16 bites fixpontos számra, amely decimálisan a 71-es számérték.

A bináris kód magának a számnak a kettes számrendszerbeli kifejezése. A legkisebb szám a 0, a legnagyobb pedig a 16 darab 1-esből álló 216–1, azaz 65635. (8 biten a legnagyobb előjel nélküli szám 28–1 = 255.)

2.3. ábra. Fixpontos előjel nélküli szám

60 Két fixpontos szám összeadása természetesen az összeadás szabályainak megfelelően történik, mindegyik számjegy helyi értékkel bír. A 2.4. ábrán láthatunk egy példát az összeadásra. Ebben az esetben a két 16 bites szám összeadása után ugyancsak egy 16 bites szám keletkezett, de megtörténhetne az is, hogy egy 17 bites szám szülessen, amennyiben a legmagasabb helyi értékű biten keletkezik egy átvitel (angolul carry). angolul. Mivel ez az egy bit már nem fér be az eredményt tároló tárterületre, ezt túlcsordulásnak nevezzük.

2.4. ábra. Fixpontos számok összeadása Előjeles számok

Az előjel megjelenítésére az a konvenció, hogy erre a célra a tárterület legmagasabb helyi értékű bitjét használjuk. Ha ez a bit 0, akkor a számot pozitívnak minősítjük, ha 1, akkor negatívnak.

Amennyiben 16 bit áll a rendelkezésünkre az előjeles szám ábrázolására, akkor 15 bit marad a szám értékének a kifejezésére. Pozitív szám esetében ez a mező megegyezik a szám abszolút értékének kettes számrendszerbeli alakjával. Például a +93 ábrázolása a 2.5. ábrán látható. A legnagyobb szám, amit ki tudunk fejezni a 215–1, azaz +32767. A negatív számot a szám kettes komplemensével fejezzük ki. Ezt úgy kapjuk meg, hogy a szám pozitív alakját (előjel bittel együtt) invertáljuk (ez az 1-es komplemens), majd hozzáadunk 1-et. Így az előjelbit is automatikusan adódik. Erre mutat példát a 2.6. ábra. (Természetesen feltehetjük a kérdést, hogy mi történt volna, ha hozzáadjuk az 1-est az egyes komplemenshez, és az előjel 0-ra változik?

Ez azt jelenti, hogy olyan számot kaptunk, amelyiknek az értéke már nem fért bele a 15 bitbe, és ezért az átvitel megváltoztatta az előjelet.)

2.5. ábra. A +93 ábrázolása

Az előbbiek alapján belátható, hogy 8 biten a legnagyobb szám, amit ki lehet fejezni a +127 (binárisan 0111 1111), és a legkisebb szám a –128 (binárisan 1000 0000).

2.6. ábra. A –84 ábrázolása

61 A műveleteket előjeles számok esetében, úgy az összeadást, mint a kivonást, természetesen összeadással hajtjuk végre. A 2.7. ábrán látható erre egy példa: +93 –84 = +9. A –84 kettes komplemensben van kifejezve, és amint azt már láttuk korábban, ahhoz, hogy helyes legyen az eredmény, a legmagasabb helyi értékről keletkezett átvitelt törölni kell.

2.7. ábra. Fixpontos számok kivonása

Nézzünk meg egy másik példát (–93 +84 = –9), amikor az eredmény negatív lesz (2.8. ábra).

Az első sorban látható a –93 kettes komplemensben kifejezve (ezt könnyen beláthatjuk a gyakorlati módszer alkalmazásával is, hogy ha jobbról balra végigpásztázzuk a 2.7. ábra első sorában lévő számot, akkor az első 1-ig semmit nem változtatunk, a többit invertáljuk), amihez az összeadás szabályai szerint hozzáadjuk a +84-et, az előjelbiteket is számjegyként kezelve (!). Az eredmény negatív lesz, mert az első bitje 1-es. Ahhoz, hogy megtudjuk az eredmény abszolut értékét, a kettes komplemesbeli kódot visszakomplementáljuk. Ezzel 9-et kapunk, tehát az eredmény –9, mivel az előjelét már tudtuk.

Két azonos előjelű szám összeadásánál túlcsordulás – angolul overflow – akkor fordulhat elő, ha olyan számot kapunk, amelyiknek az értéke már nem fér bele a 15 bitbe, és ezért az átvitel megváltoztatja az előjelet. Tehát előjeles számok esetében a túlcsordulás kimutatásánál nem csak a legmagasabb helyi értéken keletkezett átvitelt, hanem az előjelbit felé történő átvitelt is figyelembe kell venni.

2.8. ábra. Előjeles számok összeadása 2.4.2. Lebegőpontos számok

Ha egy programot írunk, és egy változót integernek deklarálunk, akkor a fordítóprogram egy fixpontos kezelésű tárolóhelyet fog hozzárendelni. Ha azonban a változót real (valós) változónak deklaráljuk, akkor ezt a fordítóprogram lebegőpontos módon kezelendő tárolóhelyet fog hozzárendelni. A lebegőpontos számokat tízes számrendszerben is szoktuk használni nagyon nagy, vagy nagyon kis számok kifejezésére (például +1,6 × 10–19). Binárisan egy lebegőpontos számnak az általános alakja a következő:

62

±m × 2±e

A számítógépes ábrázoláshoz a memóriában két előjeles bináris számot kell tárolni: a mantisszát és a hatványkitevőt (exponenst). A 2-es az alapszám, azt nem szükséges tárolni, mert azt úgyis ismerjük.

A lebegőpontos számábrázolásnak az a sajátossága, hogy egy számot többféleképpen is ki tudunk fejezni, a (bináris esetben) kettedes vesszőnek a jobbra-balra történő mozgatásával,

„lebegtetésével”. Természetesen, ha elmozdítjuk a vesszőt (angol nyelvterületen pontot), akkor megfelelően kell a hatványkitevőt is változtatni. Ha egy pozícióval balra mozgatjuk a vesszőt, akkor a hatványkitevőt 1-gyel kell növelni, ha jobbra mozgatjuk, akkor 1-gyel csökkenteni kell.

Hogy elkerüljük egy számnak a többféle ábrázolását – és következésképpen az értelmezését –, normalizált alakot használunk. A normalizálás történhet nullára, amikor a kettedes vessző után következő pozícióba hozzuk a legelső 1-est. A számítástechnikában használt ANSI/IEEE 754/854-es szabvány az 1-esre normalizált alakot határozza meg. (A rövidítések jelentése:

American National Standards Institute, illetve Institute of Electrical and Electronic Engineers.) Ez azt jelenti, hogy a kettedes pont előtt lesz az első 1-es, tehát a mantissza (hivatalosan:

szignifikandus) alakja 1.M lesz. Takarékosságból elég csak a mantisszának a törtrészét (az M-et) ábrázolni, de persze ha ki akarjuk számítani az eredeti értékét, akkor figyelembe kell vegyük a nem tárolt 1-est is. A szabvány különböző pontosságokat határoz meg, amint az a 2.9. ábrán látható.

2.9. ábra. Lebegőpontos számábrázolás

Figyeljük meg, hogy a mantisszának az előjele (S, mint sign), ami lényegében magának a számnak az előjele, a legmagasabb helyi értékű pozícióba kerül. Az általános alakból láthattuk azonban, hogy az exponensnek is van előjele, + vagy –. Annak érdekében, hogy az ábrázolt számban ne legyen két előjel, az exponens helyett egy mindig pozitív karakterisztikát tárolunk. Ezt úgy kapjuk meg, hogy az exponenshez hozzáadjuk az értelmezési tartományának a felét, pontosabban: 2n−1–1-et, például 8 biten 127-et.

Álljon itt egy példa: –5,375 ábrázolása lebegőpontos számként egyszeres pontossággal a fenti szabvány szerint. Felírjuk a számnak a bináris alakját és ezt normalizáljuk 1-esre:

–5,375 = –101,00112 = –1,0100112 × 2+2

A hatványkitevőhöz hozzáadunk 127-et, hogy kialakítsuk a 8 bites karakterisztikát: 2+127 = 129 = 100000012. Figyelembe véve, hogy a mantisszának csak a törtrészét tároljuk, valamint hogy a szám negatív (az előjele 1), megkapjuk a számnak a 2.10. ábrán látható 32-bites alakját.

2.10. ábra. Példa az ANSI/IEEE 754/854 szabvány szerinti számábrázolásra

63 2.4.3. Binárisan kódolt decimális (BCD) számok

A harmadik egy nagyon egyszerű módszer a számok számítógépes ábrázolására. Ez a BCD (Binary Coded Decimal), azaz binárisan kódolt decimális szám, amikor nem is a számot egészében véve, hanem a számban lévő számjegyeket kódoljuk. Minden egyes számjegyet behelyettesítünk a számjegynek a kettes számrendszerbeli kifejezésével (ezért ezt még természetes BCD-nek is szokták nevezni). Minden számjegy helyén négy bit (tetrád) fog állni, a 2.11 ábrának megfelelően.

2.11. ábra. BCD kódolás

Mivel a számítógépes tárolóhelyek bájt szervezésűek, így egy bájtra juthat két BCD számjegy – ez a tömörített (csomagolt) ábrázolás. Például a 2019 tömörített alakja:

00100000 00011001

Ezt úgy nevezzük, hogy tömörített vagy csomagolt BCD ábrázolási mód. Az általános alakját a 2.12. ábra mutatja.

2.12. ábra Csomagolt BCD

Ha előjeles számot akarunk használni, akkor az előjel kifejezésére a megmaradt 6 tetrádból kell kettőt választani (általában pozitívnek 1100-t, negatívnak 1101-et helyeznek a szám elejére vagy a végére). Létezik zónázott (csomagolatlan) ábrázolás is, amikor minden egyes bájton egy számjegyet ábrázolunk, de ez nem takarékos. Ebben az esetben a 2019 így nézne ki BCD kódban:

00000010 00000000 00000001 00001001

64 Vizsgáljuk meg, hogy történik két BCD számnak az összeadása. Vegyünk először a 4+2-t:

Az eredmény 6, helyes. De 4+9 esetében már érvénytelen kódot kapunk (1011), és ilyenkor egy korrekciót kell alkalmazni, mégpedig hozzá kell adni +6-ot, és akkor megkapjuk a helyes eredményt:

Tehát BCD számok összeadásánál figyelni kell arra, hogy érvénytelen kód (vagy átvitel) esetén korrekció szükséges.

In document Informatikai alapok (Pldal 59-64)