Comparer les nombres à virgule flottante en C
J'ai un double
qui imprime comme 0.000000
et je suis en train de le comparer à 0.0f
sans succès. Pourquoi est-il une différence? Quel est le moyen le plus fiable pour déterminer si votre double est égal à zéro?
source d'informationauteur nick_name | 2011-08-10
Vous devez vous connecter pour publier un commentaire.
Afin de déterminer si elle est assez proche de zéro, que il aura l'impression que
0.000000
à six décimales, quelque chose comme:Affaire à de petites inexactitudes dans les calculs à virgule flottante peut être assez compliqué en général, cependant.
Si vous voulez avoir une meilleure idée de ce que la valeur que vous avez, essayez d'imprimer avec
%g
au lieu de%f
.Vous pouvez faire une série. Comme -0.00001 <= x <= 0.00001
C'est un problème fondamental avec l'arithmétique à virgule flottante sur les ordinateurs modernes. Ils sont par nature imprécises, et ne peut pas être fiable comparé. Par exemple, le langage ML interdit explicitement l'égalité de comparaison sur de vrais types, car il était considéré comme trop dangereux. Voir aussi l'excellent (même si un peu long et mathématiquement) papier par David Goldberg sur ce sujet.
Edit: tl;dr: vous pourriez être faire de mal.
Aussi, on a souvent négligé les caractéristiques de nombre à virgule flottante sont les nombres dénormalisés.
C'est les nombres qui ont le minimum de l'exposant, mais ne rentrent pas dans le 0.5-1.
Ces chiffres sont inférieur que FLT_MIN pour flotter, et DBL_MIN pour le double.
Une erreur commune avec l'aide d'un seuil est de comparer deux valeurs, ou de l'utilisation FLT_MIN/DBL_MIN comme limite.
Par exemple, cela conduirait unlogical résultat (si vous ne savez pas à propos de denormals):
Denormals aussi implique généralement une perte de performances de calcul.
Pourtant, vous ne pouvez pas les désactiver, sinon un tel code pourrait encore produire une division PAR ZÉRO exception de virgule flottante (si activé):