Im neuesten C++-Standard sind mir die folgenden Makros aufgefallen:
bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, float y);
bool islessequal(float x, float y);
bool islessgreater(float x, float y);
bool isunordered(float x, float y);
Diese Makros stammen aus C (7.12.14 und 7.12.14).
Warum sollte jemand diese Makros anstelle von Operatoren verwenden? Gibt es irgendetwas Besonderes, was diese Makros tun (wie das Prüfen auf inf
), oder sind sie die gleichen wie ihr entsprechender Operator?
C++-Beispiel:
#include <iostream>
#include <cmath>
int main()
{
float x=0.2;
float y=0.5;
std::cout << x << " < " << y << " : " << std::boolalpha << std::islessequal( x, y ) << std::endl;
std::cout << x << " < " << y << " : " << std::boolalpha << ( x <= y ) << std::endl;
}
Im Gegensatz zu den Vergleichsoperatoren geben diese Makros wirklich nur einen booleschen Wert zurück und lösen niemals eine Gleitkomma-Ausnahme aus.
Kurz gesagt: Sie müssen sich nur damit auseinandersetzen true
/false
und sonst nichts.
Verweise:
Die Offene Gruppe Beschreibungen (nicht der C- oder C++-Standard, aber in der Unix/Linux-Welt höchst relevant und den Standards fast immer ähnlich):
C++ Standard:
C-Bibliothek [c.math]:
Die Klassifizierungs-/Vergleichsfunktionen verhalten sich genauso wie die C-Makros mit den entsprechenden Namen, die in 7.12.3, Klassifizierungsmakros, und 7.12.14, Vergleichsmakros im C-Standard definiert sind. Jede Funktion wird für die drei Fließkommatypen wie folgt überladen […]
C Standard:
7.12.14 Vergleichsmakros
[…] Für jedes geordnete Paar numerischer Werte ist genau eine der Beziehungen – kleiner, größer und gleich – wahr. Relational Betreiber kann die Gleitkommaausnahme „ungültig“ auslösen, wenn Argumentwerte NaNs sind. Für eine NaN und einen numerischen Wert oder für zwei NaNs gilt nur die ungeordnete Beziehung. Die folgenden Unterabschnitte stellen Makros bereit, die stille Versionen der Vergleichsoperatoren sind (keine Gleitkommaausnahmen), und andere Vergleichsmakros, die dies erleichtern Effizienten Code schreiben, der NaNs berücksichtigt, ohne die „ungültige“ Gleitkommaausnahme zu erleiden. In den Synopsen in diesem Unterabschnitt zeigt Real-Floating an, dass das Argument ein Ausdruck des Real-Floating-Typs sein soll.
isgreater
et al. wurden von C99 in C++11 integriert. Sie sind so definiert, dass sie die ungültige Gleitkommaausnahme nicht auslösen, wenn x
und/oder y
signalisieren NaN
Werte.
Die angegebene Begründung lautet:
Dieses Makro ist eine stille (Nicht-Gleitkomma-Ausnahme auslösende) Version eines relationalen Operators. Es erleichtert das Schreiben von effizientem Code, der NaNs berücksichtigt, ohne dass die Ausnahme für ungültige Gleitkommazahlen auftritt.
Der numerische Wert des Makros on NaN
ist wie immer; NaN
Werte vergleichen false mit allen anderen Werten einschließlich NaN
Werte unter allen Vergleichsoperatoren und den neuen Makros.