TL;DR
Komputer pokładowy statku liczy zasięg przy 120 litrach paliwa i spalaniu równym zero. Wynik: nieskończenie daleko, bez wyjątku i bez ostrzeżenia. W C# `double` dzieli przez zero po cichu i zwraca nieskończoność, a `int` i `decimal` rzucają `DivideByZeroException`. Ta różnica potrafi zepsuć logikę, której nikt nie podejrzewa.
Prawdziwa pułapka zaczyna się przy 0/0. Wychodzi z tego NaN, a NaN przegrywa każde porównanie, nawet z samym sobą, bo `NaN == NaN` daje `false`. Alarm w stylu `if (zasieg < 50)` po prostu się nie włączy, a program pójdzie dalej z błędną wartością. Autor pokazuje na tym przykładzie, dlaczego program, który się wywraca, jest uczciwszy od takiego, który liczy dalej. Podaje też krótką listę obron, w tym `double.IsFinite` i `double.IsNaN`.
Statek ma 120 litrów paliwa. Komputer pokładowy liczy, jak daleko na tym zajedzie, i odpowiada: nieskończenie daleko. Program się nie wywrócił, nie było błędu ani ostrzeżenia. A to...
Czytaj cały wpis u źródła