Siamo sicuri di utilizzare i float come contatori di loop e di incrementarli/decrementarli di quantità frazionarie ad ogni iterazione, come nel seguente programma apparentemente privo di rischi? Naturalmente so che usare i float come operandi per lo == l'operatore è una cosa stupida da fare. Ma cosa c'è di sbagliato nell'usare i float come operandi per altre operazioni di confronto per scopi "normali"? Con "normale" intendo ciò, beh, anche se i float potrebbero non essere la esatta rappresentazione digitale del numero, ma non è una variazione come 0.000000001
irrilevante e può essere ignorata nella maggior parte dei casi? (Ad esempio, nel seguente programma che non è nemmeno apparente)Qualche rischio di utilizzare variabili float come contatori di loop e il loro incremento/decremento frazionario per condizioni non "=="?
Ma detto questo, ecco la mia apprehension.Suppose la rappresentazione non è esatta e 5,0 è in realtà 4,999,999 mila .Così come andiamo sul decremento da 0,5 a ogni iterazione, l'ultimo confronto con potrebbe risultare falso e il loop potrebbe uscire a causa di una differenza di 0,000001 e l'ultima riga dell'output corrente non verrà visualizzata. Spero che tu stia prendendo la mia strada. Come sbaglio, sono io?
#include<stdio.h>
int main(void)
{
float f;
for(f=5.0;f>=0;f-=0.5)
printf("%f\n",f);
}
uscita:
5.000000
4.500000
4.000000
3.500000
3.000000
2.500000
2.000000
1.500000
1.000000
0.500000
0.000000
+1 Risposta piacevole. –
Dovrebbe essere chiaro che questi criteri si applicano ai cicli che terminano a zero. Se si dispone di un ciclo che va da + X a -Y, ad esempio, allora possono verificarsi errori se Y è maggiore di X. –
@EricPostpischil: Penso che la condizione che il valore risultante nel mezzo deve essere rappresentabile copre quel caso? – nhahtdh