«

»

feb 18

Pontatlan számítási eredmények: amikor a nulla nem nulla

floatingpoint1Öcsém mutatott pár napja egy érdekes hibát az Excelben. Összeadott néhány számot, az eredménynek 0-nak kellett volna lennie, e helyett azonban valami ilyesmit kapott: 1,4210854715202E-14

Például az alábbi nagyon egyszerű esetben, ahol egy SZUM formulával számoltuk az összeget:

Mi ez az E betűs furcsaság?

Az E betűs furcsaság a tudományos (Scientific) számformátum: az E betű után álló szám (-14) azt jelenti, hogy 10-nek ezzel a hatványával kell megszorozni az előtte álló számot. Az Excel automatikusan ebbe a formátumba tette a számot, mert a cellára nem volt más formázás beállítva.

Ha átállítod a formázást Számra és 30 tizedes jegyre, ezt fogod látni:

floatingpoint02

Tehát ez egy nagyon kicsit szám, egy majdnem-nulla érték. De mégsem nulla, pedig látjuk, hogy a fenti 4 szám összege pontosan nulla kellene, hogy legyen.

Miért nem nulla?

Azért, mert a számokat a számítógép kettes számrendszerben (vagyis bináris számként) tárolja, és ami a jól megszokott tizes számrendszerben egyszerű, véges tizedes tört (pl. 0,1) az kettes számrendszerben lehet végtelen szakaszos tört (0,0001100110011100110011…). Ilyen esetben pedig – mivel a számok tárolására szolgáló memória véges – a szám kerekítődik, csonkolódik. Ezzel a sok számjegyből álló bináris tört számmal végzünk aztán műveletet, s előfordulhat, hogy a tört rész megmarad a számítás végére is. Ezt aztán tizes számrendszerbe visszakonvertálva nem 0-t, hanem egy 0-hoz közeli számot kapunk.

Ez tehát egy sajátosság, amit megváltoztatni nem tudunk – azonban vannak egyszerű módszerek, amivel áthidalhatjuk a problémát.

MEGOLDÁSOK

Szám formátum beállítása

A legegyszerűbb eset az, amikor nem kell ezzel a majdnem-nulla számmal tovább számolni: ilyenkor elég, ha beállítod a Szám formátumot, és annyi tizedes jegyet, amennyi számodra fontos. A fenti esetben például egy tizedest:

floatingpoint4

A beállítást a Kezdőlap (Home)  közepén levő Szám csoportban tudod megadni. A legördülő listában válaszd a Szám-ot (Number), és állítsd be a tizedes jegyeket a kis nyilas-nullás gombokkal:

floatingpoint03

Kerekítés

A probléma súlyosabb, ha a majdnem-nulla számot fel szeretnéd használni valamire. Tipikus eset, hogy az ilyen számításokat ellenőrzésre használjuk, és be szeretnénk ágyazni egy HA (IF) formulába például:

=HA( B7=0 ; “rendben” ; “hiba” )

=IF( B7=0 , “rendben” , “hiba” )

Ez a formula a fenti esetben “hiba”-t ad vissza, mert az összeg csak majdnem-nulla, nem pontosan nulla. Ahhoz, hogy pontosan 0-t kapjunk, az eredeti összeget kerekíteni kell. Ezt legegyszerűbben a KEREKTÉS (ROUND) formulával tudod megtenni. Második paraméternek kell megadnod, hogy hány tizedes jegyre kerekítesz. Ez mindig legalább annyi legyen, mint ahány tizedes jegyű számokkal dolgozol. [Gábor: Így van eza hibaellenőrzésnél megmondjuk, hogy milyen kis hiba az, amit még tolerálunk. Persze általában az ember nem arra gondol, hogy maga az Excel fog hibázni… 😉 ]

=KEREKÍTÉS( SZUM(B2:B5) ; 2)

=ROUND( SZUM(B2:B5) , 2 )

Én itt biztos, ami biztos, két tizedesre kerekítettem.

Így már az ellenőrzés sem mutat hibát:

floatingpoint5

Mostmár akár feltételes formázást is építhetsz az összegző formulára… de ez majd egy következő cikk témája lesz! :-)

 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.

Az alábbi HTML kódok használhatóak: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

css.php