2010-07-30 5 views
1

je l'ai lu une machine ne peut pas exprimer nombre à virgule flottante exaclty par exemple 1.1 nous allons prendre le codeopérations à virgule flottante

float x=0.1; 
do{ 

x+=0.1; 
printf("%f\n",x); 
} while(x!=1.1); 

ce code n'a jamais terminé comment puis-je faire que la finition de code? peut-être le convertir en double ou?

+0

Vous n'êtes pas censé utiliser les comparaisons d'égalité sur les nombres à virgule flottante. – phkahler

+0

Ceci est mon explication préférée de la raison pour laquelle les nombres à virgule flottante, de toute précision ou type, ne peuvent pas représenter exactement tous les nombres réels: http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly -in-binary/1089026 # 1089026 – mtrw

Répondre

0

Dans ce cas, la vérification "<" fera l'affaire:

float x=0.1; 
do{ 

x+=0.1; 
printf("%f\n",x); 
} while(x<1.05); 

En général, vous devez tester contre un "epsilon". Regardez here pour plus d'informations.

2

Par exemple, comparer dans une marge acceptable. C'est à dire.

while (abs(x-1.1)>0.001); 

Les doubles auront le même problème, mais avec plus de précision. Certaines langues vous proposent également des types rationnels, dans lesquels vous pouvez spécifier un nombre comme la fraction 1/10 ou des types de données à virgule fixe.

0

Travailler en point fixe, pour ce genre de tâche. Le type decimal par exemple pourrait aider. Cependant, ce n'est pas la solution pour tous les problèmes.

3

Pour des problèmes numériques, il est courant de spécifier un epsilon de précision:

bool within_epsilon(float x, float y, float e) { 
    if (abs(x - y) > e) { 
     return false 
    } else { 
     return true 
    } 
} 

Le epsilon vous choisissez va changer votre précision et l'epsilon vous pouvez choisir dépend de votre implémentation en virgule flottante: Machine epsilon.

+0

+1 pour faire référence à epsilon, puisque cela permettra aux gens de google pour cette information d'une manière plus facile – davbryn

Questions connexes