Czy możemy bezpiecznie używać pływaków jako liczników pętli i zwiększać/zmniejszać je o ułamkowe wartości w każdej iteracji, tak jak w poniższym programie bez ryzyka? Oczywiście wiem, że używanie zmiennoprzecinkowych jako argumentów dla == operator jest głupim posunięciem. Ale co jest złego w używaniu zmiennoprzecinkowych jako operandów dla innych operacji porównania dla "normalnych" celów? Przez "normalny" mam na myśli to, że nawet jeśli liczba znaków nie może być liczbową reprezentacją liczby, ale nie jest odmianą taką jak ta, która jest nieistotna i może być zignorowana w większości przypadków? (Na przykład w poniższym programie, który nie jest jeszcze widoczny)Czy istnieje ryzyko wykorzystania zmiennych zmiennoprzecinkowych jako liczników pętli i ich ułamkowego przyrostu/dekrecji dla warunków innych niż "= "?
Ale powiedział, że tu jest mój apprehension.Suppose reprezentacja nie jest dokładna i 5,0 jest rzeczywiście 4,999999 .Tak jak idziemy na zmniejszanie przez 0.5 w każdej iteracji, ostatnie porównanie zmoże okazać się nieprawdą, a pętla może zostać zakończona z powodu różnicy w stosunku do 0.000001, a ostatnia linia bieżącego wyjścia nie będzie wyświetlana. Mam nadzieję, że dostaję mój dryf. Jak się mylę?
#include<stdio.h>
int main(void)
{
float f;
for(f=5.0;f>=0;f-=0.5)
printf("%f\n",f);
}
wyjściowa:
5.000000
4.500000
4.000000
3.500000
3.000000
2.500000
2.000000
1.500000
1.000000
0.500000
0.000000
+1 Dobra odpowiedź. –
Powinno być jasne, że te kryteria mają zastosowanie do pętli kończących się na zero. Jeśli masz pętlę, która działa na przykład od + X do -Y, wtedy mogą wystąpić błędy, jeśli Y jest większe niż X. –
@EricPostpischil: Myślę, że warunek, że wynikowa wartość pomiędzy musi być reprezentowalna pokrywa ten przypadek? – nhahtdh