Warum sollte ich das Zweierkomplement verwenden, um zwei Doubles zu vergleichen, anstatt ihre Unterschiede mit einem Epsilon-Wert zu vergleichen?

StackOverflow https://stackoverflow.com/questions/96233

  •  01-07-2019
  •  | 
  •  

Frage

Referenziert Hier Und Hier...Warum sollte ich das Zweierkomplement einer Epsilon-Methode vorziehen?Es scheint, dass die Epsilon-Methode für die meisten Fälle gut genug wäre.


Aktualisieren: Ich suche lediglich nach einem theoretischen Grund, warum Sie eines über das andere verwenden würden.Ich habe immer die Epsilon-Methode verwendet.

Hat jemand den Zweierkomplementvergleich erfolgreich angewendet?Warum?Warum nicht?

War es hilfreich?

Lösung

Der zweite Link, auf den Sie verweisen, erwähnt einen Artikel, der eine ziemlich lange Beschreibung des Problems enthält:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

Aber wenn Sie die Leistung nicht optimieren, würde ich bei Epsilon bleiben, damit die Leute Ihren Code debuggen können

Andere Tipps

Die Bits Methode könnte schneller sein. Ich könnte sagen, weil auf modernes (Multicore-, hoch Pipeline-) Prozessoren ist es oft unmöglich ist, zu erraten, was wirklich schneller ist. Code am einfachsten am offensichtlichsten korrekten Umsetzung, dann messen, dann optomise.

Kurz gesagt, beim Vergleich von zwei Schwimmern mit unbekannter Herkunft, ein Epsilon-Kommissionierung, die gültig ist, ist fast unmöglich.

Zum Beispiel:

Was ist ein gutes epsilon wenn in Meilen zwischen Atlanta GA, Dallas TX und einem Ort in Ohio?

Vergleichen Abstand

Was ist ein gutes epsilon wenn in Meilen zwischen meinem linken Fuß, rechtsem Fuß und dem Computer unter meinem Schreibtisch?

Vergleichen Abstand

EDIT:

Ok, ich bin immer eine ganze Reihe von Menschen nicht zu verstehen, warum Sie würden nicht wissen, was Ihr epsilon ist.

Zurück in den alten Tagen der Lore, schrieb ich zwei Programme, die mit Neverwinter Nights (ein Spiel gemacht von BioWare) gearbeitet. Eines der Programme nahm ein binäres Modell und konvertiert es in ASCII. Das andere Programm nahm ein ASCII-Modell und in binären zusammengestellt. Einer der Tests war ich schrieb alle BioWare binären Modelle zu nehmen, dekompilieren sie zu ASCII und dann zurück zu binär. Dann verglich ich meine binäre Version mit Original von BioWare. Eines der Probleme beim Vergleich mit einigen der geringfügigen Abweichungen zu tun hatte in Gleitkommazahlen. Anstatt also mit einer Reihe von verschiedenen Epsilons des kommenden für jede Art von Gleitkommazahl (Vertex, normal, etc), wollte ich etwas zu vergleichen, wie dieses Zweier-Kompliment verwenden. So ist das ganze multiple EPSILON Problem zu vermeiden.

Die gleiche Art von Problem kann auf jede Art von Software anzuwenden, die 3rd-Party-Daten verarbeitet, und dann muss ihre Ergebnisse mit dem Original validieren. In diesen Fällen können Sie nicht einmal wissen könnte, was die Fließkommawerte darstellen, müssen Sie nur noch um sie zu vergleichen. Wir liefen in dieser Frage mit unserer Automatisierungssoftware.

EDIT:

LOL, dies wurde von verschiedenen Personen stimmt nach oben und unten.

Ich werde das Problem lässt sich auf diese, da zwei beliebigen Gleitkommazahlen, wie Sie entscheiden, welche epsilon zu benutzen? Sie können nicht.

Wie kann man vergleichen 1e23 und 1.0001e23 mit einem Epsilon und noch vergleichen 1e23 und 5.2e-23 das gleiche Epsilon verwendet? Sicher, können Sie einige dynamisches epsilon Tricks, aber das ist der springende Punkt bei der ganzen Zahl vergleichen (was nicht die ganzen Zahlen genau sein erfordert).

Die Integer-Vergleich ist in der Lage zwei Schwimmern zu vergleichen mit einem Epsilon in Bezug auf die Größe der Zahlen.

Bearbeiten

Steve, sehen wir uns an, was gesagt, Sie in den Kommentaren:

„Aber Sie wissen, was Gleichheit bedeutet für dich ... Daher sollten Sie in der Lage sein, eine geeignete epsilon zu finden“.

Aktivieren Sie diese Aussage um zu sagen:

„Wenn Sie wissen, was Gleichheit bedeutet für Sie, dann sollten Sie in der Lage sein, eine geeignete epsilon zu finden.“

Der springende Punkt zu dem, was ich bin versucht zu sagen ist, dass es Anwendungen, bei denen wir nicht wissen, was im absoluten Sinne Gleichheit bedeutet, so müssen wir vergleichen, um zu einem relativen greifen das ist, was die ganze Zahl Version versucht, tun.

Wenn es um Geschwindigkeit geht, diese Regeln befolgen:

  1. Wenn Sie nicht ein sehr erfahrenen Entwickler sind, nicht optimieren.
  2. Wenn Sie ein erfahrener Entwickler sind, optimieren noch nicht.

Sie die einfachste Methode.

Alex

Oskar hat Recht. Nicht mit dieser Schraube, wenn Sie wirklich, wirklich, dass die Leistung benötigen.

Und Sie dies nicht tun. Wenn Sie in der Lage sind, das täte, würde man nicht bedurft, um die Frage zu stellen - Sie würden bereits wissen. Wenn Sie denken, Sie tun, dann tun Sie nicht. Ihre Leistungsprobleme liegen woanders. Verwenden Sie einfach die lesbare Version.

mit einem beliebigen Methode, die bitweise vergleicht wird in Schwierigkeiten führen, wenn Fraktionen durch Approximationen dargestellt sind. Alle Gleitkommazahlen mit Fraktionen, die nicht in Zweierpotenzen lauten (1/2, 1/4, 1/8, 1/65536, & c) sind angenähert. Also, natürlich, sind alle irrationalen Zahlen.

float dritten = 1/3; schweben zwei = 2,0; float another_two = dritte * 6.0; if (zwei! = another_two)    print ( "Approximation! \ n");

Das einzige Mal, vergleicht bitweise funktionieren würde, ist, wenn Sie die Gleitkommazahlen genau die gleiche Art und Weise ableiten oder sie sind genaue Darstellungen (ganze Zahlen, Bruchzweierpotenzen). Selbst dann kann es mehrere Darstellungen von einigen Zahlen, obwohl ich nie in einem Arbeitssystem gesehen habe.

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