A számítógépek a számokat véges pontossággal, általában lebegõpontos
alakban tárolják. A véges pontosság azt jelenti, hogy az aritmetikai
mûveletek eredményeként kapott érték nem egyezik meg a mûvelet egzakt
értelemben vett eredményével, hanem csak megközelíti azt. Ha egy
számot közelítõ értékével a-val ábrázolunk, akkor
ennek az ábrázolásnak az abszolút hibája
![]() |
(1) |
Az ábrázolás relatív hibája
![]() |
(2) |
Ha egy számítógép a tízes számrendszert használja, és a számokat 8
tizedesjegy pontossággal tárolja, akkor az 1/3 mûvelet eredménye
0.33333333 lesz, ami több mint
-nel tér el a valódi
értéktõl. Egy tízes számrendszerben felírt szám értékes jegyeinek
nevezzük azokat a számjegyeket, amelyek nem nulla értékûek, valamint
azokat a nulla számjegyeket, amelyek értékes jegyek között vannak.
Mivel a számítógépek többnyire nem a tízes számrendszert
használják, hanem a kettest, ezért nem a tárolt tizedes jegyek számát
szokták az ábrázolás pontosságának jellemzésére használni. Általában
az ábrázolás pontosságának szokták nevezni azt az
legkisebb abszolút értékû valós számot, amelynek ha a lebegõpontos
alakját hozzáadjuk az 1.0 valós szám lebegõpontos alakjához,
akkor az eredmény eltér 1.0-tól. Ez a szám 32 bites mantissza
esetén
érték. Azt lehet mondani, hogy az
érték a számok lebegõ pontos ábrázolás tört részének a
pontossága. Ennek a pontosságnak, és az aritmetikai mûveletek
pontosságának elegendõen jónak kell lennie ahhoz, hogy az eredményünk
a számítás végén elfogadható legyen. Ez nem jelenti azt, hogy ha két
tizedes jegy pontosságú eredményre van szükségünk, akkor
megfelel. A számítás során fellép ugyanis egy
ún. kerekítési hiba, amelynek az értéke legalább
,
és
amely a számítások során halmozódik. Ha egy számításhoz N aritmetikai mûveletre van szükségünk, akkor szerencsés esetben
nagyságú kerekítési hibára számíthatunk.
Az elemi aritmetikai mûveleteket figyelembe véve azt lehet mondani, hogy közelítõ számok összegének abszolút hibája nem haladja meg a számok abszolút hibáinak összegét,
![]() |
(3) |
és közelítõ számok különbségének abszolút hibája nem haladja meg a két
szám abszolút hibáinak összegét, azaz
![]() |
(4) |
Egy másik hibalehetõség, amelyet azonban elkerülhetünk, ha két egymáshoz közeli számot vonunk ki egymásból. Ilyen esetben az értékes bitek nagy része azonos, és csak néhány olyan bit lesz, amelyik valóban értékes eredményt ad. Így az eredményül kapott szám pontossága jóval alatta lesz a valódi számábrázolási pontosságnak. Ezt úgy is megérthetjük, ha megvizsgáljuk a kivonás eredményeként kapott abszolút, és relatív pontosságot. Ha két közel azonos számot vonunk ki egymásból, akkor az abszolút hiba ugyan nem nõ meg radikálisan, de a relatív hiba igen, ugyanis a
![]() |
(5) |
képletben a-b értéke igen kicsi lehet.
Azt hihetnénk, hogy ilyen kivonás csak nagyon ritkán fordul elõ. Néhány képlet azonban magában hordozza az ilyen jellegû kivonásokat.
Ennek példájaképpen oldjunk meg egy másodfokú egyenletet! A megoldás során a számolási pontosság ne legyen több, mint 10-2.
(x-100)(x-0.1)=x2-100.1x+10=0 | (6) |
Ha csak két értékes jegy pontossággal számolunk, akkor az egyenlet alakja:
(x-100)(x-0.1)=x2-100x+10=0 | (7) |
Használva a jólismert megoldó képletet:
![]() |
(8) |
Kiszámolva a determinánst:
![]() |
(9) |
A helyes érték persze 9960 lenne, de mivel csak két tizedes jegy pontossággal számolunk a 40-t hiába vonjuk le, a detemináns értékén nem változtat. A megoldóképlet ezek után így alakul:
![]() |
(10) |
Ebbõl:
![]() |
(11) |
és
![]() |
(12) |
Ennek a második eredménynek a relatív hibája 100%. Ha ebben az esetben nem a
![]() |
(13) |
képletet használjuk, hanem ismerve x1, valamint az együtthatók a,b,c értékeit, a
![]() |
(14) |
képletet, akkor kiküszöböljük azt a hibát, amely az utolsó lépésben teljes pontosságvesztéshez vezetett, és megkapjuk a helyes 0.1eredményt.
További elemi aritmetikai mûveleteket megvizsgálva, azt tapasztaljuk, hogy közelítõ számok szorzatának relatív hibája nem haladja meg a számok relatív hibáinak összegét, két szám hányadosának relatív hibája nem haladja meg a számok relatív hibáinak összegét, valamint egy szám m-edik hatványának relatív hibája a szám relatív hibája az m-ediken.
Ha nem csak az elemi mûveletekre szorítkozunk, hanem általánosabb állítást akarunk kimondani, akkor az mondható, hogyha egy
![]() |
(15) |
függvényben a paraméterek abszolút hibái
,
akkor az eredmény abszolút hibája
![]() |
(16) |
Van egy másik hibafajta is, amelyet a program határoz meg. A legtöbb numerikus módszer diszkrét módon közelít valamilyen folytonos mennyiséget. Egy integrált például úgy számítunk ki numerikusan, hogy kiszámítjuk a függvény értékét véges sok pontban, de korántsem minden pontban. Egy másik példa, amikor egy függvény értékét számítjuk ki valamely a függvényt közelítõ sor elsõ néhány tagjának összegeként, de természetesen sohasem veszünk végtelen sok tagot. Ezekben az esetekben van egy paraméterünk, az elsõ esetben a pontok száma, a másodikban a tagoké, amelyeket megfelelõen nagyra választva, az eredmény megfelelõ potossággal kapjuk meg. Ennek a paraméternek a megválasztása persze egy kompromisszum eredménye, mert igaz ugyan, hogy minél nagyobb ez a paraméter, annál pontosabb az eredmény de annál tovább is fut a program. Azt a hibát, amely így adódik, csonkítási hibának hívják. Ez a csonkítási hiba még akkor is meglenne, ha a számítógépünk abszolút pontossággal tárolná a számokat, és végezné a mûveleteket. Addig, amíg a kerekítési hibával a programozó semmit sem tud kezdeni, a csonkítási hiba teljesen a hatalma alatt van. Egy kis túlzással azt állíthatjuk, hogy a numerikus analízis nem más, mint ennek a hibának a minimalizálása. A kerekítési és csonkítási hiba az esetek döntõ többségében független egymástól. Egy számítás hibája kezelhetõ úgy, mint a csonkítási hiba, amely egy végtelenül pontosan számoló számítógépen keletkezne, plusz a kerekítési hiba, amely a mûveletek számától függ.
Ugyanakkor, néha mégis elõfordul, hogy egy máskülönben vonzó eljárás nem stabilis. Ez azt jelenti, hogy a kerekítési hiba, amely a számítás egy korai stádiumában keletkezik, a számítás során megnõ, és a számítás végére az eredményként kapott számokban dominánssá válik. Egy ilyen nem stabilis eljárás nagyon jól használható lenne egy abszolút pontos számítógépen. Nézzünk meg egy egyszerû, bár kissé mesterkélt példát!
Tegyük fel, hogy ki szeretnénk számolni az aranymetszési arány egész hatványait. Ez az arány:
![]() |
(17) |
Egyszerûen belátható, hogy
.
Ha tudjuk az elsõ két értéket,
és
,
akkor könnyen, és gyorsan, csupán kivonásokat
alkalmazva lassú szorzások helyett, egymás után kiszámíthatjuk
egész
hatványait. Sajnos ennek a rekurzív egyenletnek van egy másik megoldása
is,
.
Mivel az összefüggés lineáris, és mivel
ennek a
megoldásnak az abszolút értéke nagyobb mint 1, bármilyen kicsiny
kerekítési hiba exponenciális gyorsasággal nõ. Egy tipikus, 32 bites
mantisszával rendelkezõ számábrázolásnál, n=16-nál már teljesen hibás
eredményt ad. Az összefüggés nem stabilis, és ezért nem használható
egész hatványainak kiszámításához.