Ich weiß, dass Sie sich normalerweise nicht auf die Gleichheit zwischen Doppel- oder Dezimalwerten verlassen können, aber ich frage mich, ob 0 ein Sonderfall ist.
Während ich Ungenauigkeiten zwischen 0,00000000000001 und 0,00000000000002 verstehen kann, scheint 0 selbst ziemlich schwer zu vermasseln, da es einfach nichts ist. Wenn Sie auf nichts ungenau sind, ist es nichts mehr.
Aber ich weiß nicht viel über dieses Thema, deshalb kann ich es nicht sagen.
double x = 0.0;
return (x == 0.0) ? true : false;
Wird das immer wahr sein?
Antworten:
Es ist sicher zu erwarten , dass der Vergleich zurück ,
true
wenn und nur wenn die doppelte Variable einen Wert von genau hat0.0
(was in der ursprünglichen Codeausschnitt ist, natürlich, der Fall ist ). Dies steht im Einklang mit der Semantik des==
Operators.a == b
bedeutet "a
ist gleichb
".Es ist nicht sicher (weil es nicht korrekt ist ) zu erwarten, dass das Ergebnis einer Berechnung in doppelter (oder allgemeiner Gleitkomma) Arithmetik Null ist, wenn das Ergebnis derselben Berechnung in reiner Mathematik Null ist. Dies liegt daran, dass bei Berechnungen ein Gleitkomma-Präzisionsfehler auftritt - ein Konzept, das in der reellen Zahlenarithmetik in der Mathematik nicht existiert.
quelle
Wenn Sie viele "Gleichheits" -Vergleiche durchführen müssen, ist es möglicherweise eine gute Idee, eine kleine Hilfsfunktion oder Erweiterungsmethode in .NET 3.5 zu schreiben, um Folgendes zu vergleichen:
Dies könnte folgendermaßen verwendet werden:
quelle
Für Ihre einfache Probe ist dieser Test in Ordnung. Aber was ist damit:
Denken Sie daran, dass .1 eine sich wiederholende Dezimalzahl in Binärform ist und nicht genau dargestellt werden kann. Vergleichen Sie das dann mit diesem Code:
Ich überlasse es Ihnen, einen Test durchzuführen, um die tatsächlichen Ergebnisse zu sehen: Sie werden sich eher daran erinnern.
quelle
Aus dem MSDN-Eintrag für Double.Equals :
Siehe auch Double.Epsilon .
quelle
x.Equals(y)
dann(1/x).Equals(1/y)
, aber das ist nicht der Fall, wennx
ist0
undy
ist1/Double.NegativeInfinity
. Diese Werte werden als gleich deklariert, obwohl dies bei ihren Wechselwirkungen nicht der Fall ist.x = 0
und erneut ausführeny = 0
, und das würden Sie immer noch finden1/x != 1/y
.x
undy
als Typdouble
? Wie vergleichen Sie die Ergebnisse, um sie als ungleich zu melden? Beachten Sie, dass 1 / 0,0 nicht NaN ist.1.0/0.0
nicht NaN, wie es sein sollte, da die Grenze nicht eindeutig ist. Zweitens, dass Unendlichkeiten gleich sind, ohne auf Unendlichkeitsgrade zu achten)Das Problem tritt auf, wenn Sie verschiedene Arten der Implementierung von Gleitkommawerten vergleichen, z. B. den Vergleich von float mit double. Aber mit dem gleichen Typ sollte es kein Problem sein.
Das Problem ist, dass der Programmierer manchmal vergisst, dass für den Vergleich implizite Typumwandlungen (double to float) auftreten und dies zu einem Fehler führt.
quelle
Wenn die Nummer direkt dem Float oder Double zugewiesen wurde, ist es sicher, gegen Null oder eine ganze Zahl zu testen, die in 53 Bit für ein Double oder 24 Bit für ein Float dargestellt werden kann.
Oder anders ausgedrückt: Sie können einem Double immer einen ganzzahligen Wert zuweisen und dann das Double wieder mit derselben Integer vergleichen und sicherstellen, dass es gleich ist.
Sie können auch mit der Zuweisung einer ganzen Zahl beginnen und einfache Vergleiche durchführen, indem Sie sich an das Addieren, Subtrahieren oder Multiplizieren mit ganzen Zahlen halten (vorausgesetzt, das Ergebnis beträgt weniger als 24 Bit für einen Float und 53 Bit für ein Double). So können Sie Floats und Doubles unter bestimmten kontrollierten Bedingungen als Ganzzahlen behandeln.
quelle
Nein, das ist nicht in Ordnung. Sogenannte denormalisierte Werte (subnormal) würden bei einem Vergleich von 0,0 als falsch (ungleich Null) verglichen, bei Verwendung in einer Gleichung jedoch normalisiert (würden 0,0). Daher ist es nicht sicher, dies als Mechanismus zur Vermeidung einer Division durch Null zu verwenden. Fügen Sie stattdessen 1.0 hinzu und vergleichen Sie mit 1.0. Dadurch wird sichergestellt, dass alle Subnormen als Null behandelt werden.
quelle
Versuchen Sie dies, und Sie werden feststellen, dass == für double / float nicht zuverlässig ist.
double d = 0.1 + 0.2; bool b = d == 0.3;
Hier ist der Antwort von Quora.
quelle
Eigentlich denke ich, dass es besser ist, die folgenden Codes zu verwenden, um einen Doppelwert mit 0.0 zu vergleichen:
Gleiches gilt für float:
quelle