Jakiekolwiek ryzyko użycia zmiennych float jako liczników pętli i ich ułamkowego przyrostu / dekrementacji dla warunków „==”?

Czy możemy bezpiecznie używać floatów jako liczników pętli i zwiększać / zmniejszać je o wartości ułamkowe przy każdej iteracji, jak w pozornie wolnym od ryzyka programie poniżej? Oczywiście wiem, że używanie floatów jako argumentów dla== operator jest głupią rzeczą do zrobienia. Ale co jest nie tak z użyciem floatów jako argumentów dla innych operacji porównania dla „normalnych” celów? Przez „normalne” mam na myśli to, że nawet jeśli pływaki nie sądokładny numeryczna reprezentacja liczby, ale nie jest to wariacja0.000000001 nieistotne i można je w większości przypadków zignorować? (Na przykład w poniższym programie, który nie jest nawet widoczny)

Ale to powiedziało, oto moja obawa. Załóżmy, że reprezentacja nie jest dokładna i5.0 jest aktualne4.999999.Tak, jak idziemy dalej przez0,5 przy każdej iteracji ostatnie porównanie z0 może okazać się fałszywa i pętla może wyjść z powodu różnicy0,000001, a ostatnia linia bieżącego wyjścia nie będzie wyświetlana. Mam nadzieję, że dostaniesz mój dryf. Jakże się mylę?

#include<stdio.h>

int main(void)
{
float f;

for(f=5.0;f>=0;f-=0.5)
printf("%f\n",f);
}

Wydajność:

5.000000
4.500000
4.000000
3.500000
3.000000
2.500000
2.000000
1.500000
1.000000
0.500000
0.000000

questionAnswers(4)

yourAnswerToTheQuestion