Quelle est la solution de contournement recommandée si numeric_limits < double > :: has_infinity est false?
Question
Je dois vérifier une valeur double pour l'infini dans une application C ++ sous Linux. Sur la plupart des plates-formes, cela fonctionne en comparant avec std :: numeric_limits < double > :: infinity ()
. Cependant, sur certaines anciennes plates-formes (RedHat 9 par exemple, avec gcc 3.2.2), cela n’est pas disponible et std :: numeric_limits < double > :: has_infinity
est faux à cet endroit.
Quelle solution de contournement recommanderiez-vous pour ces plates-formes?
La solution 3
Ok, je viens maintenant d’utiliser les macros INFINITY
et NAN
sur cette machine particulière - semble fonctionner correctement. Ils viennent de math.h
.
Autres conseils
Si vous utilisez l'arithmétique IEEE 754, comme vous le savez presque certainement, les infinis sont des valeurs bien définies et ont des résultats définis pour toutes les opérations arithmétiques. En particulier,
infinity - infinity = NaN
Les valeurs Infini positif et négatif et NaN
sont les seules valeurs pour lesquelles cela est vrai. Les NaN sont des expressions spéciales "pas un nombre". les valeurs utilisées pour indiquer les erreurs de domaine des fonctions, par ex. sqrt (-1)
. Aussi:
NaN != NaN
NaN
s sont les seules valeurs pour lesquelles cela est vrai.
Par conséquent:
bool is_infinite(double x) {
double y = x - x;
return x == x && y != y;
}
retournera true si et seulement si x
est un infini positif ou négatif. Ajouter un test pour x > 0
si vous voulez seulement vérifier l'infini positif.
Dans la plupart des cas, std :: numeric_limits :: max () peut remplacer correctement std :: numeric_limits :: infinity ().
Cependant, vous devrez faire plus attention à l’utiliser. Avec les débordements, je pense que vous devrez détecter manuellement le débordement et définir le résultat au maximum explicitement si un débordement est détecté.