Undefinierte Zahlen mit normalen Zahlen vergleichen
-
Hallo Community,
Ich habe mich zu einem schnellen Hack verleiten lassen und jetzt hab ich mal ne Frage:
float undef = 1.0f/0.0f; // Div durch 0 float x = [Beliebige definierte Zahl]; bool a = x < undef; bool b = x == undef; bool c = x > undef;Ist es sicher, dass für jedes definierte (also eine normale Zahl wie 1.5f, -5.0f, etc.) x a,b und c false sind? Oder ist das Plattform/Compilerabhängig?
Danke schonmal im voraus :xmas1:
-
vielleicht hilft dir das weiter:
http://www.c-plusplus.net/forum/p1595452#1595452
dann kannste zumindest gezielt auf ungültige Werte testen ... Forumsuche ist doch was wunderbares
-
Wie ich auf ungültige Werte testen kann, weiss ich. Ich weise der Zahl ja selbst den ungültigen Wert zu. Es geht mir ja um die geposteten Vergleiche.
-
Murkser schrieb:
Ist es sicher, dass für jedes definierte (also eine normale Zahl wie 1.5f, -5.0f, etc.) x a,b und c false sind?
Nein. Wenn sich dein Compiler an IEEE 754 hält (was er nicht muss, soweit ich weiß), ist a true, und b und c sind false, denn dein undef bekommt den "Wert" +unendlich. Wolltest du vielleich ein NaN erzeugen?
-
Ja, ich wollte einfach einen NaN erzeugen.
Sind bei anderen NaNs ausser +/- unendlich alle bools false?
acosf(1.1f) wäre dann ein solcher NaN, oder?
-
Bei NaNs sind alle Vergleiche false.
Und 0/0 sollte so ein NaN geben.
-
Murkser schrieb:
Sind bei anderen NaNs ausser +/- unendlich alle bools false?
Üblicherweise ja, sicher ist es nicht. Ein Compiler muss sich nicht an IEEE 754 halten, und selbst IEEE 754 sagt nur, dass solche Vergleiche "unordered" sind.
-
Murkser schrieb:
Ja, ich wollte einfach einen NaN erzeugen.
Schau dir die folgenden Funktionen an:
float std::numeric_limits<float>::signaling_NaN(); float std::numeric_limits<float>::quiet_NaN();Zu finden im Header
<limits>, siehe auch Dokumentation.