Frage

Oder gibt es eine Chance, dass die Operation fehlschlagen?

Danke.

wählte ich den falschen Begriff und was ich wirklich gemeint war, auf 0 Runden, nicht Abschneiden.

Der Punkt ist, ich brauche den ganzzahligen Teil von zwei Doppelzimmer zu vergleichen, und ich bin Casting sie nur auf int und dann == verwenden, aber, wie jemand in einem meiner früheren Fragen wies darauf hin, könnte dies einen Überlauf werfen Ausnahme, wenn die Doppel nicht in die ganze Zahl passen.

Die Frage wäre ‚Ist es richtig, den Operator == zu verwenden, zwei Doppelzimmer zu vergleichen, die zuvor auf 0 abgerundet worden waren, oder soll ich zum Casting-Stick-Methode auf int und eine mögliche Ausnahme zu fangen?

War es hilfreich?

Lösung

Hier ist die aktualisierte Website die diskutiert die Vor- und Nachteile der verschiedenen Methoden der Gleitkommazahlen zu vergleichen. (Sie können immer noch die alte Seite hier ).

Die Methode, die ich gehen würde mit der „relativen Fehler“ -Methode. Den Unterschied zwischen den beiden Zahlen, konvertiert, dass auf einen bestimmten Prozentsatz der Zahlen, und wenn dieser Prozentsatz ausreichend klein ist, dann haben Sie, Gleichheit.

Andere Tipps

Noch schlimmer ist, dass manchmal, auch für die exakt gleiche Zahl, wird es scheitern. Dies liegt daran, dass einige Compiler oder Prozessoren werden mehr Bits an Genauigkeit in einem CPU-Register verwenden als im Speicher (MSVC hat 3 verschiedene Gleitpunkt-Verhaltensoptionen, zum Beispiel). Somit ist ein kürzlich berechneter Wert kann dieses Bits nicht abgeschnitten und wird ungleich zu sein scheint. NIEMALS == auf Schwimmern verwenden.

Es kann immer noch aufgrund der normalen Probleme nicht mit Gleitkommadarstellung. Anstatt sie Kürzen, verwenden Sie ein Delta, das die äquivalente Genauigkeit darstellen würde.

Es kann in Fällen fehlschlagen, wo Sie zwei Schwimmer haben, die Sie normalerweise das gleiche betrachten,

  
    

10.19999999

         

10.20000001

  

aber wenn man sie gestutzt sie geben unterschiedliche Ergebnisse.

  
    

10,19

         

10,20

  

Während, wenn ich ein Delta von 0,001 verwendet hatte, um den Unterschied zu vergleichen, würde ich habe gesehen, dass diese beiden Werte effektiv gleich ist.

Es ist nie richtig == mit Gleitkommazahlen zu verwenden.

Was bedeutet „gestutzt“ bedeutet in einem Float-Punkt-Kontext? Welche spezifische Bibliotheksfunktion rufen Sie an? Was ist das Ergebnis? Was macht Sie glauben, dass „abgeschnittene“ Werte sind nicht mehr vergleichbar, als nicht-abgeschnittene Werte?

Gleitpunkt ist eine Annäherung von Dezimalzahlen. Floating-Point kann nur repräsentieren Zweierpotenzen genau. Alle anderen Werte sind bis zu einem gewissen Fehler behaftet, egal welche Gleitkommaoperationen Sie tun.

Wenn Sie jedoch konvertieren in Integer, können Sie == verwenden.

Wenn Sie Ihr absoluter Wert kleiner als 2 ^ 23 für Einzel- oder 2 ^ 52 für verdoppeln Sie verwenden Runde können () und führen Sie dann zu vergleichen. Größere Werte können nicht precisly gespeichert werden, und dies eröffnet für Situationen, in denen N == N + 1.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top