Ich bin auf eine Situation in meinem Code gestoßen, wo eine Funktion ein Double zurückgibt, und es möglich ist, dass dieses Double eine Null, eine negative Null oder ein ganz anderer Wert ist. Ich muss zwischen Null und negativem Null unterscheiden, aber der Standarddoppelvergleich tut nicht. Aufgrund des Doppelformats erlaubt C ++ keinen Vergleich von Doppelpunkten mit bitweisen Operatoren, so dass ich nicht weiß, wie ich vorgehen soll. Wie kann ich zwischen den beiden unterscheiden?
Rufen Sie std::signbit()
auf, um den Status des Vorzeichenbits zu bestimmen.
Aufgrund des Doppelformats erlaubt C ++ keinen Vergleich von Doppelpunkten mit bitweisen Operatoren, so dass ich nicht weiß, wie ich vorgehen soll.
Zunächst gibt C ++ keinen Standard für float
/ double
-Typen vor.
Angenommen, Sie sprechen über die Formate binary32 und binary64 der IEEE 754, so sind sie speziell darauf ausgelegt, ihre Reihenfolge beizubehalten, wenn ihre Bit Patterns werden als Integer interpretiert , damit sie von einer Nicht-FPU sortiert werden können; das ist der Grund, warum sie einen voreingenommenen Exponenten haben.
Es gibt viele SO-Posts , die solche Vergleiche diskutieren. Hier ist der relevanteste . Eine einfache Überprüfung wäre
%Vor% Dies funktioniert seit 0.0f == -0.0f
, obwohl es Orte gibt, an denen das Zeichen einen Unterschied macht wie atan2
oder wenn die Division durch -0 im Gegensatz zu +0 zu den jeweiligen Unendlichkeiten führt.
Um explizit für a == -0 in C zu testen, machen Sie folgendes:
%Vor%Tags und Links c++ comparison floating-point negative-number zero