Problem precyzji double

0
#include <iostream>

int main()
{
for (double a = 0; a != .3; a+=.1)
std::cerr<<"Test\n";
}

Ten kod będzie się wywoływał w nieskończoność. Dlaczego?
Chodzi o przybliżone wartości .1 i .3?

0

liczb zmiennoprzecinkowych nigdy się tak nie porównuje!!!! Robisz to np. tak

for (double a = 0; abs(a - .3) > .00000001; a+=.1)

gdzie .00000001 to dokładność wyniku, jaka Cię interesuje

0

Wiem, pytam dlaczego tak się dzieje. Chodzi o brak możliwości zapisu liczby w systemie binarnym, bo nie zmieści się w pamięci. Ale coś dokładniej jakby było wytłumaczone...

0

Liczb wymiernych pomiędzy 0, a 1 jest nieskończenie wiele. Nie da się zapisać nieskończenie wielu liczb na skończonej liczbie bitów.
http://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa

0

Dziękuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1