Lebegőpontos számábrázolás

Itt megint egy kis matematikával kell kezdeni, mégpedig a valós számok normálalakjával. Mindenki találkozott már a 6*1023 számmal. Ez három részből áll: a szorzó (6), a hatványalap (10), illetve a kitevő (23). Ezt kell átírnunk kettes alapú hatványra, illetve kitevőre, pl.: r*2m. Még mielőtt nekifognánk a konkrét átszámításnak, tisztázni kell a normalizálás fogalmát! Ennek lényege, hogy a kettes hatvány előtt álló szorzót (a példában: r) 0 és 1 közé kell hozni – persze előjelet is lehet hozzá illeszteni. Hogy a dolog érthetőbb legyen, lássunk néhány 10-es alapú példát:

123,456 = 0,123456 * 103

-0,00789 = -0,789*10-2

6*1023 = 0,6*1024

Matematika nyelvén megfogalmazva a feltételek az r*2m képletben: 0<=r<1 és m egész szám.

Példaként vegyünk egy 32 bites valós számot. Itt az előjelbit (a számé): 1 bit. A kitevő (m) 8 bit, míg a maradék 23 bit lesz a valós szám szorzója, ami a példában r néven szerepelt. A dolog annyiban bonyolódik, hogy a bináris számábrázolás miatt az r értékét addig toljuk el, amíg ½ <= r <1 közé esik. Így viszont az r értéke mindig 1-es bittel kezdődik, amit így felesleges ábrázolni. (Ezt az elhagyott bitet hívják implicitbit-nek.

 

Tekintsük példának a következő számítógépes számot: 0.10000011.10111001000100000000000.

A legelső számjegy nulla, ami azt jelenti, hogy a szám pozitív. A következő 8 bit 10000011, amely adja az eltérített exponenst, a következő decimális számmal egyenértékű:

Kitevő = 1*27+0*26+0*25+0*24+0*23+0*22+1*21+1*20 = 128+2+1= 131.

Tehát a kivető: 131-127 = 4, pontosabban számként felírva: 2131-127 = 24. Az utolsó 23 bit a szorzót határozza meg: 10111001000100000000000.

Szorzó = 1*2-1+1*2-3+1*2-4+1*2-5+1*2-8+1*2-12 = 1/2+1/8+1/16+1/32+1/256+1/4096 = 0,722900390625.

Így a fenti számsor összesítve a következőt jelenti:

Előjelbit * 2Kitevő-127*(1+Szorzó) = + 2131-127*(1+0,722900390625) = 16*1,722900390625 = = 27,56640625

Ezzel a módszerrel elég gyorsan és jól tudnak működni a CPU-k, így végrehajtáskor szinte észre sem vesszük a számítások elvégzését.

 

Persze egyes operációs rendszerek, illetve programozási nyelvek ettől kicsit eltérő módszert is alkalmazhatnak, például a kitevő hossza 8 helyett 16 vagy 24 bit is lehet, míg a szorzó hossza a fenti példa 23 bitjével ellentétben lehet 47, illetve 71 bit is. A módszernek azért vannak korlátai! Lehet túlcsordulás, amikor a szám nagyobb, mint az ábrázolható maximum (2max_kitevő-nél is nagyobb), illetve alulcsordulás, amikor a szám kisebb, mint az ábrázolható legkisebb kitevő (2-max_kitevő), de ezek a számok vagy túl nagyok, vagy igen kicsik, azaz szinte nulla. A legtöbb programozási nyelvben van lehetőség egy a megszokott valós számoknál nagyobb csoport, illetve számábrázolási módszer választására. Ilyen lehet például a duplapontos valós szám, ami már egész nagy kitevőkig is pontos értéket ad.

 

 

Tisztelt Olvasó! Köszönöm figyelmét, mellyel ezt a cikket végigolvasta. Kérem, ha valami megjegyzése vagy kérése van, vagy valami félreértelmezhető (esetleg hibás) anyagot fedezett fel, na habozzon és feltétlenül küldje el nekem írásban ezen link segítségével. Előre is köszönöm!

 

Használt szakirodalom:

 

©TFeri.hu, 2011.
Újraszerkesztve: 2016 és 2020.