piszę pętlę sumujący z pływakiem, ale nie natknąłem się na arytmetyki zmiennoprzecinkowej problemu przedstawionego w poniższym przykładzie:C++ Jak uniknąć zmiennoprzecinkową błąd arytmetyczny
for(float value = -2.0; value <= 2.0; value += 0.2)
std::cout << value << std::endl;
Oto wyjście:
-2
-1.8
-1.6
-1.4
-1.2
-1
-0.8
-0.6
-0.4
-0.2
1.46031e-07
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
Dlaczego właśnie ja się 1.46031e-07
zamiast 0
? Wiem, że ma to coś wspólnego z błędami zmiennoprzecinkowymi, ale nie mogę zrozumieć, dlaczego tak się dzieje i co powinienem zrobić, aby temu zapobiec (jeśli jest jakiś sposób). Czy ktoś może wyjaśnić (lub wskazać mi link), który pomoże mi zrozumieć? Dowolne wejście jest doceniane. Dzięki!
"Jak uniknąć arytmetyki zmiennoprzecinkowej błąd" - nie można, przepraszam. –
to pytanie zostało zadane i wiele razy odpowiedziano: – bernie
'0.2' nie może być dokładnie reprezentowane przez' float' (przy założeniu arytmetyki zmiennoprzecinkowej IEEE754). Możesz to zobaczyć, jeśli zwiększysz precyzję wyniku: [przykład] (http://liveworkspace.org/code/3ZXIxx$0). – Mankarse