Suma floatów, a raczej błąd, zależy od kolejności sumowania:
(a + b) + c będzie zwykle różne od a + (b+c).
W przypadku sumowania wielu składników błąd rośnie statystycznie zgodnie z sqrt(n), n - liczba składników; ale w najgorszym scenariuszu błąd może być dowolnie duży, nawet ponad 100% poprawnej sumy.
Przykład:
suma 1/i = 1 + 1/2 + 1/3 + ... + 1/N;
Sumujemy w pojedynczej precyzji, czyli float.
float s = 0;
for(i = 1; i <= N; i++) s += 1.0f/i;
Dla porównania sumujemy tak samo ale na double:
Wyniki:
N = 1 mln; s = 14.357358, błąd 0.25%
N = 10 mln; s = 15.403683, błąd 8%
N = 100 mln; s = 15.403683, błąd 20%
Najmniejszy błąd byłby dla odwrotnej kolejności sumowania: 1/N + ... + 1/2 + 1;
ale suma nadal będzie mniejsza od tej z podwójną precyzją i bez odwracania.
Na double są oczywiście również błędy, ale musimy sumować więcej składników - biliony, czy nawet tryliony.
Niby dużo, bo po co sumować tyle liczb?
Zwykle nie ma takiej potrzeby, no, ale przecież w przypadku równań różniczkowych my właśnie bez przerwy sumujemy:
http://pl.wikipedia.org/wiki/Algorytm_Rungego-Kutty
y_k+1 = y_k + dy; dy - wyliczamy z równań...
W innych metodach podobnie sumujemy, tylko inaczej wyliczamy te dy.
**Pytanie:
Mamy tu taką katastrofalną kumulację błędów, jak w przykładzie, czy też nie?
**
I jeśli nie, to dlaczego?
Weźmy przykładowo numeryczną symulację Układu Słonecznego.
W astronomii często symulują to nawet w miliardach lat - sprawdzają sobie co się stanie z orbitami, np. czy Księżyc nam ucieknie, albo czy orbita Ziemi się powiększy, itp.
Potem rozgłaszają rewelacyjne odkrycia, np. Merkury wyleci z orbity za 6 mln lat, albo
A ostatnio, i coraz częściej, nawet weryfikują takimi symulacjami teorie - modele fizyczne, np. ta słynna precesja Merkurego: zapuszczamy symulację n-body na kilka tysięcy lat, liczymy wszystko wg równań Newtona, i sprawdzamy czy tam faktycznie brakuje 43'' / wiek.
Potem korygujemy te 43'', np. zwiększając troszeczkę dy, być może dokładnie tyle, ile nam ucieka w tym sumowaniu... i już gra!
Można oczywiście sumować lepiej, ale to dość dużo kosztuje.