// dev.hobby.pl

Dzielenie przez zero w C# — double, nieskończoność i NaN

Streszczenie wpisu i odnośnik do pełnej treści u źródła.

Dzielenie przez zero w C# — double, nieskończoność i NaN

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

// tagi

// powiązane wpisy