Aber abgesehen davon habe ich andere ungeordnete Vergleichsoperationen nicht gefunden. Gibt es GNU-Erweiterungen (oder andere Standardbibliotheksfunktionen), die ungeordnete Gleitkommavergleiche bieten?
Wie in @ @ user2357112 in Kommentaren beobachtet, sind "ungeordnete Fließkomma-Vergleiche" keine Sache. Der Begriff macht keinen Sinn. Was Sie zu bewerten scheinen, sind Prädikate der Form "x ist kleiner als y oder die beiden sind ungeordnet".
Conforming C-Implementierungen sind nicht in der Lage, Operatoren hinzuzufügen, auch nicht als Erweiterungen. Sie können im Prinzip zusätzliche Bedeutungen für bestehende Operatoren definieren, aber ich kenne keine Implementierung, die die spezifischen Operationen bereitstellt, nach denen Sie auf diese Weise suchen. Wie Sie bereits festgestellt haben, ist es einfach, die vorhandenen Operatoren von C zu diesem Zweck zu verwenden:
Bisher konnte ich sie nur implementieren, indem ich nach der entgegengesetzten Bedingung suchte. Zum Beispiel eines ungeordneten a >= b
Vergleich zu implementieren, ich stattdessen schrieb eine !(a < b)
bestellt
aktualisieren: Das Problem dabei ist, dass diese Vergleiche eine Floating-Point-Ausnahme ausgelöst werden, wenn einer der Operanden NaN (und FP-Ausnahmen sind nicht deaktiviert). Aber du hast Glück! Seit C99 gibt es standard macros implementing the comparisons you seek. Diese werden ihre Argumente garantiert nur einmal bewerten, und sie verursachen keine Gleitkommaausnahmen.
Und natürlich, wenn Sie in der Lage sein wollen, deutlicher in Ihrem Code zum Ausdruck bringen, dass Sie explizit NaNs sind zuvorkommend, dann können Sie immer Makros für sie schreiben:
#define GE_OR_UNORDERED(x, y) (!((x) < (y)))
// ...
if (GE_OR_UNORDERED(a, b)) // ...
Beachten Sie auch, dass alle Dies hängt stark von den Implementierungsdetails ab. Obwohl C die Möglichkeit wahrnimmt, dass reelle Typen Werte wie NaNs aufnehmen können, die keine Fließkommazahlen darstellen, müssen sie dies weder tun noch definiert sie das Verhalten von relationalen oder arithmetischen Operationen an solchen Werten . Obwohl die meisten Implementierungen heutzutage IEEE-754-Gleitkommaformate und -Operationen verwenden, müssen sie dies nicht tun, und in der Vergangenheit haben einige dies nicht getan.
[hm] (http://www.gnu.org/software/libc/manual/html_node/FP-Comparison-Functions.html)? –
Sie sind ein wenig über die Terminologie hier verwechselt. Es geht nicht um "geordnete" oder "ungeordnete" Versionen von Vergleichen. 'fcmp' Schlüsselwörter wie' uge' bedeuten "ungeordnet * oder * größer als oder gleich", kein "ungeordneter" Vergleich größer oder gleich.Eine "ungeordnete" Version von> = zu nennen, ist wie das Aufrufen von> = eine "gleiche" Version von>. – user2357112
C99 hat auch 'isunordered (x, y)' – ninjalj