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?

War es hilfreich?

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top