Bisher habe ich viele Beiträge gesehen, die sich mit der Gleichheit von Fließkommazahlen beschäftigen. Die Standardantwort auf eine Frage wie "Wie sollten wir entscheiden, ob x und y gleich sind?"Sollten wir Gleitkommazahlen für Gleichheit mit einem * relativen * Fehler vergleichen?
istabs(x - y) < epsilon
wobei Epsilon ist ein fixiert, kleine Konstante. Dies liegt daran, dass die "Operanden" x und y oft die Ergebnisse einiger Berechnungen sind, bei denen ein Rundungsfehler vorliegt, daher ist der Standard-Gleichheitsoperator == nicht was wir meinen, und was wir wirklich fragen sollten ist, ob x und y sind schließen, nicht gleich.
Nun, ich denke, wenn x „fast gleich“ y ist, dann ist auch x * 10^20 sollte * 10^20, in dem Sinne, y „fast gleich“ sein, dass die relativ Fehler sein sollten das gleiche (aber "relativ" zu was?). Aber mit diesen großen Zahlen würde der obige Test fehlschlagen, d. H. Diese Lösung "skaliert" nicht.
Wie würden Sie mit diesem Problem umgehen? Sollten wir die Zahlen neu skalieren oder Epsilon neu skalieren? Wie? (Oder ist meine Intuition falsch?)
ist hier ein related question, aber ich weiß nicht seine akzeptierte Antwort mag, für die reinterpret_cast Sache ein bisschen schwierig zu mir scheint, ich verstehe nicht, was los ist. Bitte versuchen Sie es mit einem einfachen Test.
Vielen Dank. Das Papier erklärt auch die Motivationen hinter der unhöflichen Besetzung zu int (obwohl ich im normalen Code würde ich für Verständlichkeit entscheiden und eine der All-Float-Lösungen verwenden :) –
Aktualisierte Version des obigen Links ist [Vergleichen von Gleitkommazahlen, Ausgabe 2012] (http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/) – sfstewman