2016-03-31 2 views
-4

Dans un cas particulier j'ai le numéro 0.068404 dans deux variables (elles changent pendant que le programme fonctionne donc je ne sais pas ce qu'il contient). Lorsque je soustrais tout seul, il donne l'infini ou précisément un nombre à la puissance -9. Toutes les opérations booléennes me donnent un mauvais résultat.Un nombre moins lui-même donne l'infini

Des idées?

+0

Ceci est juste la représentation à virgule flottante très proche de zéro. Ce n'est pas infini, c'est juste très petit. Ce "-9" auquel vous faites référence est "10^-9" et c'est la notation scientifique du nombre. –

+0

Vous ne devez pas comparer les nombres à virgule flottante pour l'égalité. Le point flottant est [inexact] (https://isocpp.org/wiki/faq/newbie#floating-point-arith) – PaulMcKenzie

+0

Mais ça devrait donner 0, c'est bizarre! Quand je ne le multiplie pas par un nombre entre 0 et 1 (pour changer la longueur du vecteur) cela fonctionne – Render

Répondre

3

Vous rencontrez probablement des problèmes d'arrondi à virgule flottante, un problème très courant qui a été résolu à maintes reprises. Considérez le programme suivant:

float a, b, c; 

cin >> a; 
b = a; 
a = a*3; 
a = a/3; 
c = a - b; 
cout << c << " " << (c == 0) << endl; 

Par tous les droits que vous devriez obtenir une impression de 0 1, mais quand vous essayez here. Vous obtenez:

2.48353e-09 0 

Ceci est parce que les nombres à virgule flottante ne peuvent pas représenter chaque numéro de base 10, de sorte que les erreurs d'arrondi font des comparaisons droites une mauvaise idée. Vous devriez toujours utiliser un epsilon, à savoir:

abs(a - b) < eps 

eps est quelque chose comme 1E-6.

Here you can find many more examples.

+0

Ok merci! La première fois que je traite de cette question dans 5 ans. Merci encore – Render

+0

@Render votre question sera fermée, sauf si vous développez sur ce point. Vous devriez fournir un exemple concret, puis accepter cette réponse. –