2018. február 5., hétfő

Számábrázolás – Lebegőpontos számok

Lebegőpontos ábrázolást akkor használjunk, ha túl nagy/kicsi számokkal, illetve ha pontosan (törtekkel) akarunk számolni. Ez az ábrázolás a hatványkitevős felíráson alapszik. Minden szám fölírható ún. exponenciális alakban, méghozzá végtelen sok féleképpen is. Például:

1234 = 1,234*103 = 12,34*102 = ... = 0,1234*10-4 ... A tizedes vessző/tizedespont "lebeg".
Egy tetszőleges szám tehát fölírható az
eMpk
alakban, ahol:
  • e ∈ {-1, +1} (Szokás ezt s-sel is jelölni. s = signum)
  • M a mantissza, 1/p ≤ M < p
    • Ez decimálisban 0,1 ≤ M < 1, míg binárisban 0,5 ≤ M < 1
    • A törtvonaltól/törtponttól jobbra álló szám nem lehet 0!!!
    • Ha egy szám eleget tesz a fenti két pontnak, akkor a szám normál formájú.
  • p a számrendszer alapszáma
  • k a karakterisztika (Szokás exponensnek is hívni.)
Az ábrázolásnál előnyös a 0 egészes kezdés, mert így nem kell ábrázolni a szám egész részét! A kettes alapra való normalizálás azt jelenti, hogy a kettesdes pontot úgy választjuk meg, hogy az egészrész 0 legyen, míg a tőle jobbra álló első kettedes jegy pedig 1 legyen!
Kettes alapra normálizált esetben a mantissza 2-1 helyiértéke mindig 1, így azt fölösleges ábrázolni. Ezt a megvalósítást hívják rejtett egyes technikának. Ez csak kettes alapra normált esetben alkalmazható!!! A felszabadult helyen tárolhatjuk az előjelbitet (vagy növelhető az ábrázolás pontossága).
A mantisszát előjelnélküli számként szokták tárolni.
Napjaink számítógépein az Institute of Electrical and Electronics Engineers (IEEE) által az 1980-as években kiadott IEEE-754 szabvány a meghatározó. Eszerint az egyszeres pontosságú (32 bites) számokat a következő alakban tárolják:

bitek sorszáma
31302928 27262524 23222120 19181716 15141312 11198 7654 3210
ekkkkkkkkMMMMMMMMMMMMMMMMMMMMMMM

A matissza és a karakterisztika szokásos tárolását az alábbi táblázat mutatja:
típuspontossághosszbiteloszlásnulla pontPascalC/Java
egyszerű pontosság6-7 jegy321-8-23127singlefloat
dupla pontosság15-16 jegy641-11-521023doubledouble
bővített pontosság19 jegy801-15-1-6316383extendedlongdouble

Egy számról tehát 4 dolgot kell eltárolni:
  1. a szám (mantissza) előjele
  2. a mantissza abszolút értéke
  3. a kitevő előjele
  4. a kitevő abszolút értéke

  • A 31. bit a szám előjele: 0 - pozitív, 1 - negatív
  • 24-30. bit az előjeles kitevőt tárolja
  • 0-23. biten ábrázolják a mantisszát
A mantissza tárolásánál két megoldás terjedt el.
  • Az IBM gépcsaládnál a normálást megelőzően a bináris számot hexadecimálisba váltják és így végzik a normálást. (Vagyis a törtpont utáni 1. hexa számjegynek kell 0-tól különböznie!)
  • A PDP típusú gépeknél egyből a bináris számot normálják.
Példa_1:
11100010.10012 = 0.1110001010012 * 28 Ez tehát egy binárisan normált alak.
Ebben az esetben a mantissza: 111000101001
A kitevő 7 biten: 0001000
Példa_2:
0.00012 = 0.12 * 2-3
A bináris normáláskor a mantissza legmagasabb helyiértékű bitje mindig 1. Ezt a bitet fölösleges eltárolni, vagyis a 23. bitet nem használják a mantissza ábrázolásásra. Ehelyett inkább összevonják a 24-30. bitekkel. Így most már a kitevő ábrázolására használható a 23-30. bit. Általánosan alkalmazott módszer, hogy a szám kitevőjét hozzáadják az 10000000 bináris (=128) számhoz és ezt az összeget tárolják el azon a bizonyos 8 biten. (Ez a fixpontos ábrázolásnál már megismert "eltolt" módszer.)
Például, ha a kitevő -3, akkor: -310 = -112
A tárolt érték 8 biten (23-30. bit):
 10000000
-00000011
---------
 01111101
Ennek a módszernek az előnyei (állítólag :-)) a gépi aritmetika megvalósításánal érzékelhetők. Biztosan így van. :-)))

Példa_3:
Ábrázoljuk a 179,375 decimális értéket 4 bájton, lebegőpontosan, kettes alapra normáltan, 8 bites karakterisztikával, a lehető legnagyobb pontossággal! A bájtok tartalmát hexadecimálisan adjuk meg!

179 = 101100112
0,375 = 0,0112
Tehát: 179,375 = 10110011.0112
Ez normált alakban: 0.10110011011 * 28
Az előjel tehát pozitív: e = +1, vagyis a 31. bit 0.
A karakterisztika: k = 8, vagyis ehhez hozzászámítva az eltolást, ami 128 (8 biten ennyi az eltolás), kapjuk azt, hogy 136-ot kell a 23-30. biten ábrázolni. 136 = 100010002
A mantissza: M = 0.1011001101 Az első 1-est nem szokták ábrázolni (ugyanis a normálás miatt az mindig 1), így a 0-22. bit tartalma: 011001101
Ez egy kicsit szebben:
bitek sorszáma
313029282726252423222120191817161514131211109876543210
01000100001100110100000000000000

Ha az a feladat, hogy a végeredményt hexadecimálisan adjuk meg, akkor a fenti ábrázolás eredménye: $44334000

Példa_4:
Melyik számot tárolja a gép a következő formában?
11000100101011111101000000000000
(Ez hexában: $C4AFD000)

Mivel a 31. bit 1, ezért a szám negatív.
A 23-30. bit: 10001001. Ez 137-tel egyenlő. Az elolt ábrázolás miatt a karakterisztika 9. (137-128)
A 0-22. bit: 0110 1111 1101 0000 0000 0000
Ez utóbbi elé elé kell írni egy 1-est, mert a normalizálás miatt azt nem ábrázoltuk.
Az így kapott szám tehát: 1 0110 1111 1101 0000 0000 0000
A bináris pontot 9-cel jobbra lebegtetve kapjuk a 1 0110 1111. 1101 0000 0000 0000 számot.
Ezt visszaírva decimálisba megkapjuk a 367,8125-et. Vagyis ezt a számot tárolta a gép. :-)

Nincsenek megjegyzések:

Megjegyzés küldése