Quelle est la solution de contournement recommandée si numeric_limits < double > :: has_infinity est false?

StackOverflow https://stackoverflow.com/questions/447520

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?

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top