Lebegőpontos számábrázolás
A számítástechnikában a lebegőpontos számábrázolás[1] lehetővé teszi a valós számok kezelését véges tárhely esetében, széles skálát fedvén le a számhalmazon belül. A számok rögzített számú számjegyekkel ábrázolhatóak, és egy kitevő (exponens) segítségével vannak skálázva. A skálázás alapja leggyakrabban 2, 10 vagy 16. A szám a következő alakban adható meg:
- értékes számjegy × alapexponens
A lebegőpontos szám lényege, hogy az ábrázolásánál a tizedesvessző „lebeg”, vagyis az ábrázolható értékes számjegyeken belül bárhova kerülhet. (Példa erre az 1,23, 12,3, 123 számok, melyek mindegyike 3 értékes számjegyet tartalmaz.) Előnye a fixpontos számábrázolással szemben az, hogy sokkal szélesebb tartományban képes értékeket felvenni; a számokat reprezentáló adat mennyisége főként az ábrázolható számjegyek mennyiségét határozza meg, és sokkal kisebb mértékben az ábrázolható számok nagyságrendjét. Számos számábrázolási rendszer létezik a lebegőpontos számok kezelésére, de az elmúlt évtizedben legelterjedtebb az IEEE 754 szabvány lett.
Normalizálás
[szerkesztés]A tízes számrendszerben felírhatjuk a számokat normalizált formában: a tizedesvesszőt eltoljuk, és a tíznek megfelelő hatványával szorozzuk a számot, hogy a számjegyek a tizedesvesszőtől jobbra helyezkedjenek el, és az első számjegy ne legyen 0. Például:
- 364,7896 = 0,3647896 × 103
- -0,005674 = -0,5674 × 10-2
Egy nem nulla valós szám a következő általános alakban írható fel:
ahol r ≥ 0,1 és r < 1, n pedig egy integer (pozitív, negatív egész szám vagy nulla), amelyet úgy választunk meg, hogy r a megadott intervallumon belül helyezkedjen el.
Kettes számrendszerben is hasonló módon járunk el normalizálás esetén:
Az eltérés ott adódik, hogy kikötjük: az első értékes számjegy 1 legyen, amely a tizedesvesszőtől balra helyezkedjen el. Ebben az esetben q = (1.f)2, és 1 ≤ q ≤ 2. Ez az alak azért előnyös, mert amikor a számjegyeket biteken tároljuk, megspórolhatunk egy bitet, ha nem tároljuk az első egyest, hanem feltételezzük annak jelenlétét.
Felépítés
[szerkesztés]Ahhoz, hogy megértsük a lebegőpontos számok felépítését, nézzük meg konkrét példaként, miként van ábrázolva egy ilyen szám 32 biten. A szám ábrázolásához három rész szükséges:
- Az x valós szám előjele (szignum): s – 1 bit
- Eltérített exponens (integer): e – 8 bit
- Értékes számjegyek (mantissza): q – 23 bit
Tehát a nem nulla normalizált számítógépes szám bitek sorozata, amelyet a következő módon dekódolnak:
ahol : m = e – 127, illetve q = (1,f)2.
Ebben az esetben 1 ≤ q < 2, melynél a legfontosabb bit az első, amelyik nincs expliciten tárolva. Az s az x szám előjelét adja meg (ha negatív: 1, ha pozitív: 0), m = e – 127 a 8 bites eltérített exponens, és f a 23 bites törtrésze a számnak, amely az első egyessel együtt adja az értékes számjegyeket.
Az e-re való kikötés, miszerint csak 8 biten ábrázolható, korlátozza a számítógépen ábrázolható számok nagyságát:
- 0 < e < (11 111 111) 2 = 28 – 1 = 255
ahol az e = 0 és az e = 255 különleges esetekre vannak fenntartva, mint a ±0, ±∞ és a NaN (Not a Number). Mivel m = e – 127, következésképpen -126 ≤ m ≥ 127, tehát 32 biten a legkisebb szám, amely ábrázolható, 2-126 ≅ 1,2 x 10-38 (ennél kisebb szám esetében underflow hibaüzenetet kapunk), a legnagyobb ábrázolható szám (2–2-23)2127≅ 3,4 x 10 38 (ezen fölül overflow hibaüzenetet kapunk). Ez a tartomány nem minden esetben elégséges, ezért használnak bizonyos esetekben kétszeres helyet is egy számnak (double precision), ahol a mantisszának akár kétszer több bit jut.
Tekintsük példának a következő számítógépes számot:
- 01000001110111001000100000000000
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ű:
Következésképpen a szám exponenciális része 2131 – 127 = 24 . Az utolsó 23 bit a mantisszát határozza meg:
Ezek alapján a fenti számítógépes szám pontosan a következő decimális számot ábrázolja:
- e – 127
Nulla, Végtelen, NaN
[szerkesztés]Az IEEE standard alapján kétféle nulla létezik: +0 és -0, melyeket a következő szavak jelképeznek: [00000000]16 és [80000000]16. A legtöbb aritmetikai művelet, amelynek eredménye 0, a +0 értéket kapja. A nagyon kis abszolútértékű negatív szám, amely a számítógépnek 0, a -0 értéket kapja.
Ugyanúgy kétféle végtelen van: +∞ és -∞, melyeket a [7F800000]16 és [FF800000]16 szavak jelképeznek. Ha szükséges, a végtelent úgy kezelik, mint egy nagyon nagy szám, azaz a következő műveletek érvényesek az x lebegőpontos számmal (0 < x < ∞):
- (+∞) + x = (+∞)
- (+∞) × x = (+∞)
- (+∞) / x = (+∞)
- x / (+∞) = +0
Hasonlóképpen végezhetők a műveletek -∞ -nel is.
A NaN azt jelenti, hogy az érték nem-szám: ami lehet egy határozatlan művelet eredménye, mint a 0/0, ∞ – ∞, x + NaN stb. A NaN ábrázolására van fenntartva az e = 255 és az f ≠ 0.
Kerekítés, kerekítési hiba
[szerkesztés]A kerekítés, amely elengedhetetlen a számítástechnikában, kétféleképpen történhet:
- Kerekítünk az n+1-edik számjegy alapján: ha ez a számjegy nagyobb, mint 5, felfele kerekítünk, ha kisebb, lefele; ha 5, akkor az n-edik számjegy alapján döntünk (például felfele kerekítünk, ha az páros, és lefele, ha páratlan).
- Levágjuk az n-edik számjegy után az összeset.
Ha az alábbi héttizedes számjegyű számokat négytizedes számra kerekítjük, a következőket kapjuk:
- 0,2375499→0,2375
- 0,9999500→1,0000
- 0,6571708→0,6572
A hiba, ami fellép, ha az eredeti számot annak megközelítésével helyettesítjük, kerekítési hibának nevezzük. Ha x-szel jelöljük az eredeti számot, és x*-gal a kerekítés utáni számot, akkor a kerekítési hiba kerekítés esetén |x-x*| ≤ 0.5 x 10n. Levágás esetén a hibakorlát kétszer nagyobb, azaz |x-x*| ≤ 10n.
Az |x-x*| kifejezést abszolút hibának nevezzük, míg a |x-x*|/|x| kifejezés a relatív hibát adja. A két hiba közül a relatív hiba értékesebb, mivel figyelembe veszi az érték nagyságát.
Ha egy valós x számot ábrázolok lebegőpontos számként 32 biten, akkor a következő kifejezés igaz:
- fl(x)=x(1+δ) , |δ| ≤ 2-24
ahol fl(x) jelöli a lebegőpontos számot, δ a kerekítési hibát.
Jegyzetek
[szerkesztés]- ↑ Az elnevezés az angolszász irodalomból honosodott meg a magyarba, ahol a számjegyeknél tizedespontot használnak, ellentétben a magyar tizedesvesszővel.
Források
[szerkesztés]- Richard L. Burden, Douglas Faires: Numerical Analysis, 1.2-es fejezet, Roundoff Errors and Computer Arithmetic, 18-26. old.
- Kincaid, D. – Cheney, W.: Numerical Analysis, Mathematics of Scientific Computing, 2. kiadás (1996), 2. fejezet, Computer Arithmetic, 39-51. old.