Wann sollten C-Float-Vergleichsfunktionen verwendet werden?

Lesezeit: 3 Minuten

Benutzeravatar von BЈовић
BЈовић

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;
}

Benutzeravatar von Sebastian Mach
Sebastian Mach

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.

  • Dh wir still kein gültiges Prädikat für haben std::set<float> andere als die eher nutzlos isunordered. (Siehe stackoverflow.com/questions/4816156/… warum)

    – MSalter

    6. August 2012 um 12:46 Uhr

  • @MSalters: Ich liebe Makros auch, nein.

    – Sebastian Mach

    6. August 2012 um 15:03 Uhr

  • Es ist kein Makroproblem (es sind nicht einmal Makros in C++). Die Funktionen definieren keine strikte schwache Ordnung für NaN. Sie entfernen nur die Ausnahme, aber das macht das Ergebnis nicht nützlich genug.

    – MSalter

    6. August 2012 um 15:07 Uhr

  • Ja, ich habe den Teil über Funktionen in C++ verpasst 😛 Aber ich habe auch das Bestellproblem erkannt.

    – Sebastian Mach

    6. August 2012 um 15:14 Uhr


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.

1391130cookie-checkWann sollten C-Float-Vergleichsfunktionen verwendet werden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy