Indeks giełdy w Vancouver przez miesiące sztucznie spadał, bo każdą kolejną wartość obcinano zamiast poprawnie zaokrąglać
Vancouver Stock Exchange uruchomiła w 1982 r. indeks startujący od 1000,000. Po każdej transakcji indeks był ponownie przeliczany, a wynik miał ograniczoną liczbę miejsc po przecinku. Historyczne opisy wskazują, że wartość była systematycznie obcinana, co za każdym razem wprowadzało niewielki błąd w dół. Ponieważ kolejne obliczenie używało już zaniżonej wartości jako podstawy, błąd kumulował się tysiące razy. Indeks spadł w okolice 520, choć prawidłowe przeliczenie dawało około 1098,892. To czysta demonstracja systematycznego błędu numerycznego.
Truncation nie jest tym samym co rounding
Zaokrąglenie do trzech miejsc może podnieść albo obniżyć wynik w zależności od czwartej cyfry. Obcięcie zawsze wyrzuca dalsze cyfry. Dla dodatnich wartości wprowadza więc systematyczny bias w dół. Pojedyncza różnica jest mikroskopijna, ale jej średnia nie wynosi zero.
Błąd był używany jako wejście do następnego obliczenia
Gdyby każdą publikowaną wartość obcinać tylko do wyświetlenia, a kolejne obliczenia korzystały z pełnej precyzji, problem byłby znacznie mniejszy. Tutaj kolejny krok opierał się na już przyciętym indeksie. Każda strata precyzji stawała się nowym stanem początkowym.
Tysiące transakcji zmieniły drobiazg w ogromny efekt
Indeks był aktualizowany po każdej zarejestrowanej transakcji. Nawet błąd rzędu tysięcznych, powtarzany bardzo często w tym samym kierunku, może po miesiącach zmienić wynik o setki punktów. To lekcja accumulation error.
Intuicja „trzy miejsca wystarczą” była myląca
Trzy cyfry po przecinku wydają się bardzo precyzyjne przy indeksie około 1000. Problem nie zależy jednak tylko od precyzji jednego wyniku, ale od liczby iteracji i kierunku błędu. Projektant musi analizować stabilność algorytmu w długiej sekwencji operacji.
Finanse są szczególnie wrażliwe na reguły zaokrągleń
Systemy pieniężne muszą jawnie określać, kiedy i jak zaokrąglać oraz czy używać decimal arithmetic. Nie można pozostawić tej decyzji przypadkowym konwersjom float lub formatowaniu ekranu. Różnica kilku groszy w jednej operacji może stać się dużą kwotą przy milionach rekordów.
Błędy numeryczne mają kierunek
Programista często mówi o „szumie zaokrągleń”, jakby dodatnie i ujemne odchylenia się znosiły. Truncation jest kontrprzykładem: jeśli metoda zawsze przesuwa wynik w jedną stronę, błąd ma bias. To zasadnicza różnica między losowym szumem a systematycznym błędem algorytmu. W algorytmach iteracyjnych warto też analizować conditioning i propagację błędu. Nie każda utrata ostatnich cyfr ma znaczenie, ale jeśli wynik trafia z powrotem jako wejście, nawet bardzo mały bias może stać się dominującą częścią długoterminowego zachowania.
Obliczenia finansowe często potrzebują arytmetyki dziesiętnej, nie binarnego float
Liczby zmiennoprzecinkowe IEEE 754 świetnie nadają się do pomiarów naukowych, ale wiele wartości dziesiętnych, np. 0,1, nie ma dokładnej reprezentacji binarnej. Dla pieniędzy często lepszy jest typ decimal albo integer przechowujący najmniejszą jednostkę, np. grosze. Nie rozwiązuje to jednak problemu Vancouver Stock Exchange, jeśli algorytm nadal świadomie obcina wynik po każdym kroku. Kluczowe są dwie osobne decyzje: jak reprezentować wartość i kiedy tracić precyzję. Dobrą praktyką jest wykonywanie obliczeń z większą precyzją wewnętrzną i zaokrąglanie dopiero na jasno określonej granicy biznesowej, np. przy zaksięgowaniu transakcji. Wskaźnik giełdowy pokazuje, że format wyświetlania i format obliczeniowy nie powinny być tym samym. Trzy miejsca na ekranie nie oznaczają, że algorytm musi porzucać wszystkie dalsze cyfry w każdym kroku. Weryfikacja algorytmu powinna więc obejmować nie tylko pojedynczy przykład, ale tysiące iteracji na danych syntetycznych i porównanie z obliczeniem referencyjnym o większej precyzji. Dopiero wtedy widać, czy mały bias pozostaje mały. W systemach regulowanych reguła zaokrąglania powinna być częścią specyfikacji biznesowej i testów akceptacyjnych. Pozostawienie jej przypadkowemu zachowaniu języka lub formatowaniu interfejsu jest ukrytą decyzją finansową.