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.