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
e•M•pk
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.)
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 | |||||||||||||||||||||||||||||||||||||||
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 1 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||||||
e | k | k | k | k | k | k | k | k | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M | M |
A matissza és a karakterisztika szokásos tárolását az alábbi táblázat mutatja:
típus | pontosság | hossz | biteloszlás | nulla pont | Pascal | C/Java |
---|---|---|---|---|---|---|
egyszerű pontosság | 6-7 jegy | 32 | 1-8-23 | 127 | single | float |
dupla pontosság | 15-16 jegy | 64 | 1-11-52 | 1023 | double | double |
bővített pontosság | 19 jegy | 80 | 1-15-1-63 | 16383 | extended | longdouble |
Egy számról tehát 4 dolgot kell eltárolni:
- a szám (mantissza) előjele
- a mantissza abszolút értéke
- a kitevő előjele
- 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
- 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-3A 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 --------- 01111101Ennek 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 | |||||||||||||||||||||||||||||||||||||||
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||||||
0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
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?1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
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