Eller dvs. algebraisk, når vi regner med uendelig stor præcision, er 6,1*7 selvfølgelig lig med 42,7. Men hvis vi f.eks. beder Matlab verificere dette:
viser det sig, at 42,7-6,1*7 ikke er lig med nul, men derimod ca. 7*10^(-15). Empirisk kan dette forstås ved at spørge Matlab, hvad 42,7 og 6,1*7 er:
og som det ses afviger begge disse tal fra 42,7 på den femtende decimal, hvilket forklarer afvigelsen mellem tallene, ifølge Matlab, fra det første billede.
Dette er en af de første ting, man stifter bekendtskab med, når man lærer at lave numeriske beregninger på en computer; computere har kun en endelig præcision og kan derfor kun repræsentere et endeligt antal tal. Det tilfældigt valgte tal 42,7, med nuller på alle følgende decimalpladser, hører i opsætningen i Matlab fra ovenfor ikke til den mængde af tal, som computeren "kender" - hvilket tallene 42,700000000000003 og 42,699999999999996 derimod gør. Og eftersom disse tal for de fleste praktiske formål er lig med 42,7, accepterer vi, at computeren bruger disse og ikke den eksakte værdi 42,7.
I would love to own a computer with infinite precision. #coding
— Jakob R. de Lasson (@Jakobrdl) July 24, 2013
Når man laver mange beregninger, kan disse afrundingsfejl - som i eksemplet ovenfor ledte til, at vi accepterede 7*10^(-15) som værende ca. lig nul - akkumulere; ved hver enkelt beregning introduceres potentielt små unøjagtigheder, og hvis disse adderer uheldigt, bliver det sluttelige resultat, som f.eks. kunne forventes at være lig nul, væsentlig større end afrundingsfejlen fra den enkelte beregning (~10^(-15)). Og så kan man komme i tvivl; har afrundingsfejlene akkumuleret, eller er der en fejl et andet sted? Hvor lille skal et tal være for, at det beregningsmæssigt kan siges at være nul? Man er på dette sted nødt til at vælge en tolerance og løbende forholde sig til, om denne tolerance er valgt tilpas, eller om den skal justeres - f.eks. baseret på om der kommer rimelige og sandsynlige resultater ud med dette valg af tolerance.
I mit ph.d. projekt på DTU Fotonik laver jeg computersimuleringer til at analysere lysudbredelse i mikro- og nanostrukturerede materialer - og ovenstående problematik er således vigtig at forholde sig til og undersøge, når computerkoden og -algoritmerne udvikles. Vælges en nultolerance for lavt eller for højt, risikerer jeg, at beregningerne bliver numerisk ustabile, f.eks. pga. eksponentielt voksende tal.
Så på samme måde som at debugging er en vigtig del af processen i programmering og algoritmeudvikling, er det centralt at forstå betydningen af en computers endelige præcision. Eller med andre ord at 6,1*7 ikke altid er lig 42,7.
