Citat:
Srđan Pavlović: Salu na stranu, jel moguce ove greske detektovati i ispraviti?
Recimo ako je jasno da ce izvestan broj odredjenih operacija sigurno
dovesti do greske - unapred predvideti i nekako ispraviti?
Jer nije mi jasno da se ne moze programski detektovati i resiti da 1,2 - 0,2 nije 0,9999999997.... nego je 1?
Prilikom sumiranja više sabiraka dolazi do dodatne greške, koja se nagomilava u procesu sumiranja. Postoje algoritmi sumiranja kod kojih ne dolazi do te dodatne greške. Jedan od takvih je Shewchuk-ov algoritam implementiran
ovde kao prva python funkcija. Taj algoritam je implementiran u pythonovoj standardnoj biblioteci kao
math.fsum funkcija.
Naravno ovo
>>> sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
0.9999999999999999
>>> fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
1.0
je samo optička varka, jer kada se doda -1 kao prvi sabirak, dobija se
>>> sum([-1, .1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
-1.3877787807814457e-16
>>> fsum([-1, .1, .1, .1, .1, .1, .1, .1, .1, .1, .1])
5.5511151231257827e-17
U drugom slučaju imamo samo grešku konverzije iz dekadnog sistema u binarni (do na to se vrši full precision sabiranje, tj. dobija se najbliži predstavljiv broj tačnoj sumi, koja je u našem slučaju 0), a u prvom i algoritam sumiranja u pokretnom zarezu pravi svoju grešku. Dakle, ima algoritama različite numeričke stabilnosti, ali su neke vrste grešaka neminovne (konverzija iz dekadnog sistema u binarni i nemogućnost smeštanja u FP tip onoliko bitova koliko ih ima tačan rezultat).
Ova funkcija na primeru koji priložen za excel daje manju grešku, ali je daje, jer je već pri pretvaranju iz dekadnog sistema u binarni došlo do neke greške.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.