szerző:
techline.hu
Tetszett a cikk?

Különböző szoftverek különböző  számolási hibákat vétenek , és a számolási hibák olykor akár életeket is követelhetnek.

 Különböző szoftverek különböző  számolási hibákat vétenek , és a számolási hibák olykor akár életeket is követelhetnek. A legtöbben valószínűleg úgy vagyunk vele, hogy ha valami, akkor a számítógép száz százalékig korrekt és pontos – a valóságban azonban ez sajnos nincsen így. A számítógépek teljesen másképpen számolnak, mint az emberi agy – igaz milliószor gyorsabban, de ez nem jelenti azt, hogy ugyanolyan pontosan is!

Valóban jobb a számítógép mint az ember?

Mielőtt belemerülnénk a témába, lássunk néhány egyszerű példát: üssük be Google-ba hogy 5*9+(sqrt 9)^3. Örömmel láthatjuk, hogy a Google kalkulátora előállt a helyes válasszal: 72. A teszt megvolt, a Google számológép működik. 

Eddig jó... Helyes, korrekt, gyors.

 

Most írjuk be, hogy: 599 999 999 999 999 – 599 999 999 999 998

A válasz, mint első pillantásra is látszik, az kellene legyen, hogy 1. A gép szerint azonban nem.  Szerinte nulla. Talán csak egy elszigetelt eset ez a hiba? (Segítünk: nem elszigetelt: a 399999999999999-399999999999998 is nullát ad például...)

... ez viszont már nem teljesen korrekt.

 

Nem járunk jobban akkor sem, ha elindítjuk az Excelt, (legalábbis a 2007-es verziót) és beírjuk az A1-es cellába, hogy: 850*77.1. Ennek eredménye 65,535, az Excel szerint azonban 100,000. Elég jelentős különbség.

Az online kalkulátorok sem jobbak: szinte mindegyik helytelen eredményt ad például a 1,0 – 0,9 – 0,1 műveletre (minek eredménye helyesen nulla).  Erre a műveletre a legnépszerűbb helytelen eredmény a netes kalkulátorok körében a 0.0000000000000000277555756.

Az apró hibák és eltérések oka bonyolult: a számítógépek és kalkulátorok (órák, mobilok és minden egyéb, ami digitális) a számokat lebegőpontos formában tárolják, a jobb memóriakihasználás miatt. A hibák csak szélsőséges esetekben jelentkeznek – kit érdekel a 599 999 999 999 999 – 599 999 999 999 998 művelet, kérdezheti az egyszeri felhasználó? 

Nos, sokakat bizony érdekel: az Ariane V rakéta például 370 millió dollárba került – a felszállás után egy szép tűzijátékban semmisült meg. Lássuk be, 370 millió dollár, egy közepes cirkuszi tűzijátéknak megfelelő látványért nem túl költséghatékony befektetés.

Ariane V - katasztrófa egy kis számolási hiba miatt.

A hibáért akkor, a programozók körében jól ismert „overflow” volt a felelős. Az overflow röviden: 64 bites integerek esetében egy számítógép maximum eddig „képes számolni”: 9 223 372 036 854 775 807. Ha ezt a számot elérte, akkor „betelik a pohár” és túlcsordul – innen az overflow kifejezés. Ha tehát elérjük ezt a bűvös számot, onnan nincs tovább: a számítógépek világában 9 223 372 036 854 775 807 + 1 egyenlő -9 223 372 036 854 775 808 (figyelem:az eredmény előtt mínuszjel található…)

Az Ariane V nem az egyetlen példa, amikor számolási hiba követelt anyagi vagy ami még rosszabb, emberi áldozatokat. 1991. február 25-én a Dhahran légibázist egy rakéta találata érte: 28-an meghaltak, több mint százan megsebesültek. Az iraki SCUD rakéta ellenállás nélkül repült be a bázisra, a védelemre kijelölt Patriot elhárító rakéták meg sem moccantak. Miért is? Nos, valami olyasmi történt, mint a fentebb említett 1,0 – 0,9 – 0,1 példában. A védelmi rendszer 0.1 mp-es időközönként küldte a jelet a Patriot rakétáknak.

Ha az elhárító rakéta nem indul időben, akkor bizony baj van!

Ez a jel határozza meg, hogy alapállapotban maradjanak-e (nincs veszély), vagy ellenséges rakéta közeledik, ergó indulhat a kilövési szekvencia. A 0,1 mp-es időközök (szaknyelven „tick”) szuper biztonságosnak tűnnek. Sajnos azonban a Patriot 24 bites regiszterekkel dolgozó kis fejecskéjében, a bináris módon gyakorlatilag csak pontatlanul eltárolható 0,1-es érték, azaz másodperc „elcsúszott”. 0,1 másodperc, egy kicsivel elcsúszva, kit érdekel? - kérdezhetnénk jogosan, ez azonban nem ilyen egyszerű. Sok kicsi sokra megy: a támadás pillanatában a Patriot már 100 órája üzemben volt (azaz 3 600 000 tick történt meg), ennyi idő alatt a mérhetetlenül pici „elcsúszás” egészen pontosan 0,3433 mp-re „dagadt”.

Mi az a 0,3433 másodperc? Semmi! … mondhatnánk, de ne tegyük: egy SCUD rakéta 0,3433 másodperc alatt egészen pontosan 687 métert tesz meg. Azaz: a radar azt mondta, hogy nincs bejövő rakéta, nincs veszély – hiszen az ellenséges rakéta már 687 méterrel odább volt, mint ahol a radar nézte. Nincs más hátra, mint elvégezni a tragikus matekot: 0,3433 másodperc = 28 fiatal emberélet.  Legalábbis a számítógépek szerint.

HVG

HVG-előfizetés digitálisan is!

Rendelje meg a HVG hetilapot papíron vagy digitálisan, és olvasson minket bárhol, bármikor!