#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?
#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?
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
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...
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
Tu jest rzeczowe wyjaśnienie: http://osilek.mimuw.edu.pl/index.php?title=WDP_Reprezentacja_liczb
Dziękuję :)
Podstawowy dokument na ten temat:
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html