Was ist die empfohlene Problemumgehung wenn numeric_limits :: has_infinity falsch ist?
Frage
Ich brauche einen doppelten Wert für die Unendlichkeit in einem C ++ App auf Linux zu überprüfen. Auf den meisten Plattformen funktioniert dies mit std::numeric_limits<double>::infinity()
durch den Vergleich. Jedoch auf einigen alten Plattformen (RedHat 9 zum Beispiel mit gcc 3.2.2) ist dies nicht verfügbar ist, und std::numeric_limits<double>::has_infinity
ist es falsch.
Welche Abhilfe würden Sie empfehlen für diese Plattformen?
Lösung 3
Ok, ich habe jetzt zurückgegriffen mit dem INFINITY
und NAN
Makros auf dieser speziellen Maschine - scheint gut zu funktionieren. Sie kommen aus math.h
.
Andere Tipps
Wenn Sie IEEE 754-Arithmetik verwenden, wie Sie fast sicher sind, sind Unendlichkeiten gut Werte definiert und Ergebnisse definiert für alle arithmetischen Operationen. Insbesondere
infinity - infinity = NaN
Positive und negative Unendlichkeit und NaN
Werte sind die einzigen Werte, für die dies zutrifft. NaNs sind spezielle „not-a-number“ Werte verwendet, um Domain-Fehler von Funktionen anzuzeigen, zum Beispiel sqrt(-1)
. Auch:
NaN != NaN
NaN
s sind die einzigen Werte, für die dies zutrifft.
Deshalb:
bool is_infinite(double x) {
double y = x - x;
return x == x && y != y;
}
gibt true zurück, wenn und nur wenn x
ist entweder positiv oder negativ unendlich. Fügen Sie einen Test für x > 0
, wenn Sie nur für positive Unendlichkeit überprüfen möchten.
Für die meisten Fälle std :: numeric_limits :: max () kann ein gültiger Ersatz für std :: numeric_limits sein :: unendlich ().
Sie müßten mehr vorsichtig sein, es zu benutzen, aber. Mit Überlauf glaube ich, würden Sie müssen manuell den Überlauf erkennen und das Ergebnis an der max explizit gesetzt, wenn ein Überlauf erkannt wird.