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

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 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 tizedespont „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.)

A lebegőpontos ábrázolás 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 | forrásszöveg szerkesztése]

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:

x = ± r\times10^n

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:

x = ± q\times2^m

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 | forrásszöveg szerkesztése]

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:

 x = \left(-1\right)^s q\times2^m

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: 0, ha pozitív: 1), 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ű:

 e = 1\times2^7 + 0\times2^6 +...+0\times2^3 +1\times2^1+1\times2^0 = 128 + 2 + 1 = 131

Következésképpen a szám exponenciális része 2131127 = 24 . Az utolsó 23 bit a mantisszát határozza meg:

 f = 1 \times \left( \frac{1}{2} \right)^1 + 1 \times \left( \frac{1}{2} \right)^3 + 1 \times \left( \frac{1}{2} \right)^4 + 1 \times \left( \frac{1}{2} \right)^5 + 1 \times \left( \frac{1}{2} \right)^8 + 1 \times \left( \frac{1}{2} \right)12

Ezek alapján a fenti számítógépes szám pontosan a következő decimális számot ábrázolja:

\left( -1\right)^s 2 e – 127 \left(1+f\right)=\left(-1\right)^0\times 2^4\left(1 +\left(\frac{1}{2}+\frac{1}{8}+\frac{1}{16}+\frac{1}{32}+\frac{1}{256}+\frac{1}{4096}\right)\right)=27.56640625

Nulla. Végtelen. NaN.[szerkesztés | forrásszöveg szerkesztése]

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 nagy é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.

NaN nem-számot jelöl, amely 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 | forrásszöveg szerkesztése]

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-ik számjegy alapján: ha ez a számjegy nagyobb, mint 5, felfele kerekítünk, ha kisebb, lefele; ha 5, akkor az n-ik 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-ik 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-el jelöljük az eredeti számot, és x*- al 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.

Forrásanyag[szerkesztés | forrásszöveg szerkesztése]

  • 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.