73 votes

Ce n'1.#INF00, -1.#IND00 et -1.#IND veux dire?

Je suis de déconner avec le code C à l'aide de flotteurs et je suis de 1.#INF00, -1.#IND00 et -1.#IND lorsque j'essaie d'imprimer, de flotteurs sur l'écran. Ce n'ces valeurs? Je crois que 1.#INF00 signifie l'infini positif, mais qu'en est -1.#IND00 et -1.#IND? J'ai vu aussi parfois cette valeur: 1.$NaN ce qui n'est Pas un Nombre, mais quelles sont les causes de ces étranges valeurs et comment m'aider avec le débogage?

J'utilise MingW qui, je crois, utilise la norme IEEE 754 représentation pour float points.

Quelqu'un peut-il énumérer toutes ces valeurs non valides et ce qu'ils signifient?

73voto

mat Points 5365

De virgule flottante IEEE exceptions en C++ :

Cette page vous permettra de répondre aux questions suivantes.

  • Mon programme d'imprimés 1.#IND ou 1.#INF (sur Windows) ou nan ou inf (sur Linux). Ce qui s'est passé?
  • Comment puis-je savoir si un nombre est vraiment un nombre et pas une NaN ou une infinité?
  • Comment puis-je trouver plus de détails lors de l'exécution sur les types de NaNs et les infinis?
  • Avez-vous des exemples de code pour montrer comment cela fonctionne?
  • Où puis-je en savoir plus?

Ces questions ont à voir avec virgule flottante exceptions. Si vous obtenez quelque étrange non numériques de sortie où vous vous attendez à un certain nombre, vous avez dépassé les limites de l'arithmétique à virgule flottante, ou que vous avez demandé pour un résultat qui n'est pas défini. Pour garder les choses simples, je vais m'en tenir à travailler avec le double type à virgule flottante. Des observations semblables tenir pour les types float.

Débogage 1.#IND, 1.#INF, nan, et inf

Si votre opération permettrait de générer un plus grand nombre positif que peut être stocké dans une double, l'opération sera de retour 1.#INF sur Windows ou inf sur Linux. De même, votre code renvoie -1.#INF ou -inf si le résultat serait négatif d'un trop grand nombre de stocker dans un double. La division d'un nombre positif par zéro positive de l'infini et de la division d'un nombre négatif par zéro de l'infini négatif. Exemple de code à la fin de cette page fera la démonstration des opérations qui produisent des infinis.

Certaines opérations ne font pas sens mathématique, comme la prise de la racine carrée d'un nombre négatif. (Oui, cette opération n'a de sens que dans le contexte des nombres complexes, mais un double représente un nombre réel et il n'y a pas de double pour représenter le résultat.) Le même est vrai pour les logarithmes des nombres négatifs. Les deux sqrt(-1.0) et log(-1.0) serait de retour NaN, le terme générique pour "nombre" qui n'est "pas un nombre". Windows affiche un NaN -1.#IND ("IND" pour une "durée indéterminée"), alors que Linux affiche nan. D'autres opérations qui seraient de retour NaN inclure 0/0, 0*∞ et ∞/∞. Voir l'exemple de code ci-dessous pour des exemples.

En bref, si vous obtenez 1.#INF ou inf, regardez pour le débordement ou la division par zéro. Si vous obtenez 1.#IND ou nan, regarde pour des opérations illégales. Peut-être que vous avez simplement un bug. Si c'est de plus en plus subtiles et vous avez quelque chose qui est difficile à calculer, voir en Évitant de Dépassement de, dépassement de capacité, et la Perte de Précision. Cet article donne des astuces pour le calcul des résultats des étapes intermédiaires de dépassement de capacité si calculées directement.

3voto

Jeff Points 1873

Pour ceux d'entre vous dans un .Net de l'environnement les éléments suivants peuvent être un moyen pratique de filtre de non-numéros: (Cet exemple est en VB.Net mais c'est probablement l'équivalent en C#.)

If Double.IsNaN(MyVariableName) Then  
 MyVariableName = 0 'or whatever you want to do here to "correct" the situation  
End If  

Si vous essayez d'utiliser une variable qui a une valeur NaN, vous obtiendrez l'erreur suivante:
"La valeur est trop grande ou trop petite, pour une Virgule."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X