Ma a Lebegőpontos számábrázolás olyan téma, amely emberek millióinak figyelmét ragadta meg szerte a világon. Relevanciájával és jelentőségével a Lebegőpontos számábrázolás növekvő érdeklődést váltott ki különböző területeken, a politikától a szórakoztatásig. Akár a társadalomra, akár a populáris kultúrára gyakorolt hatása miatt, a Lebegőpontos számábrázolás-nek sikerült kihagyhatatlan beszédtémaként pozícionálnia magát. Ebben a cikkben alaposan megvizsgáljuk a Lebegőpontos számábrázolás minden aspektusát, elemezve annak fontosságát és hatását a mai világban. Készülj fel, hogy elmerülj a Lebegőpontos számábrázolás lenyűgöző univerzumában!
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:
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.
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:
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.
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:
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:
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:
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:
Az IEEE standard alapján kétféle nulla létezik: +0 és -0, melyeket a következő szavak jelképeznek: 16 és 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 16 és 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 < ∞):
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.
A kerekítés, amely elengedhetetlen a számítástechnikában, kétféleképpen történhet:
Ha az alábbi héttizedes számjegyű számokat négytizedes számra kerekítjük, a következőket kapjuk:
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:
ahol fl(x) jelöli a lebegőpontos számot, δ a kerekítési hibát.