Ugrás a tartalomhoz

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

Ellenőrzött
A Wikipédiából, a szabad enciklopédiából

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 = e127, 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 = e127 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 = e127, 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 2131127 = 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,23754990,2375
0,99995001,0000
0,65717080,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]
  1. 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.