Warum würde ich das Zweierkomplement verwenden, um zwei Doppel zu vergleichen, anstatt ihre Differenzen mit einem Epsilon-Wert zu vergleichen?

Referenzierte hier und hier ... Warum sollte ich Zweierkomplement über eine Epsilon-Methode verwenden? Es scheint, als wäre die Epsilon-Methode für die meisten Fälle gut genug.


Update: I'm purely looking for a theoretical reason why you'd use one over the other. I've always used the epsilon method.

Hat jemand den Zweierkomplement-Vergleich erfolgreich verwendet? Warum? Warum nicht?

0
hinzugefügt bearbeitet
Ansichten: 2

6 Antworten

Oskar hat Recht. Schrauben Sie sich nicht damit, es sei denn, Sie benötigen diese Leistung wirklich, wirklich.

Und du nicht. Wenn du in der Situation wärst, die du getan hast, hättest du die Frage nicht stellen müssen - du würdest es schon wissen. Wenn du denkst, dass du es tust, dann tust du es nicht. Ihre Leistungsprobleme liegen woanders. Benutze einfach die lesbare Version.

0
hinzugefügt

Die Bit-Methode ist möglicherweise schneller. Ich sage vielleicht, weil es auf modernen (Multicore-, hochverpeilten) Prozessoren oft unmöglich ist zu erraten, was wirklich schneller ist. Code die einfachste offensichtlich korrekte Implementierung, dann messen, dann optomisieren.

0
hinzugefügt

Befolgen Sie die folgenden Regeln, wenn es um Geschwindigkeit geht:

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

Mach die einfachste Methode.

Alex

0
hinzugefügt
Was hat das mit dem zu tun, was ich frage? Ich möchte wissen, warum Sie einen Ansatz gegenüber einem anderen verwenden, nicht, ob Sie etwas optimieren möchten.
hinzugefügt der Autor Steve Duitsman, Quelle

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 nicht die Leistung optimieren, würde ich bei epsilon bleiben, damit die Leute Ihren Code debuggen können

0
hinzugefügt
So kurze Antwort ... Leistung ist besser im Vergleich zu Epsilon?
hinzugefügt der Autor Steve Duitsman, Quelle
Ich stimme dir zu. Wenn nichts anderes, Lesbarkeit sollte mein erstes Anliegen sein.
hinzugefügt der Autor Steve Duitsman, Quelle
Beachten Sie, dass die Leistung unter Verwendung der Ganzzahl-Bit-Twiddling-Methode schlechter sein kann, da das Verschieben von Bitfolgen zwischen Gleitkomma- und Ganzzahlregistern keine schnelle Operation ist (abhängig vom verwendeten Chip und Befehlssatz). Ich würde es vermeiden, wenn Sie nicht absolut sicher sind, dass Sie die zusätzliche Leistung benötigen, und Sie können es nicht (zum Beispiel) erhalten, indem Sie einfach ein absolutes Epsilon intelligent wählen.
hinzugefügt der Autor Eamon Nerbonne, Quelle
Ich weiß es nicht. Ich würde nichts so komplex für einen Vergleich verwenden, wenn der Vergleich der Zahlen nicht der Hauptteil meiner App ist. Stellen Sie sich vor, die Zeit spreche ein einfaches Tippfehler ...
hinzugefügt der Autor Oskar, Quelle

Kurz gesagt, wenn man zwei Floats mit unbekanntem Ursprung vergleicht, ist die Auswahl eines gültigen Epsilons fast unmöglich.

Beispielsweise:

Was ist ein guter Epsilon beim Vergleich der Entfernungen in Meilen zwischen Atlanta GA, Dallas TX und einigen Orten in Ohio?

Was ist ein gutes Epsilon beim Vergleich der Entfernung in Meilen zwischen meinem linken Fuß, meinem rechten Fuß und dem Computer unter meinem Schreibtisch?

BEARBEITEN:

Ok, ich bekomme eine ganze Reihe von Leuten, die nicht verstehen, warum du nicht wüsstest, was dein Epsilon ist.

Zurück in den alten Tagen der Überlieferung, schrieb ich zwei Programme, die mit Neverwinter Nights (einem Spiel von BioWare) arbeiteten. Eines der Programme nahm ein binäres Modell und konvertierte es in ASCII. Das andere Programm nahm ein ASCII-Modell und kompilierte es in Binärdateien. Einer der Tests, den ich schrieb, war, alle binären Modelle von BioWare zu nehmen, sie in ASCII und dann wieder in Binärdateien zu dekompilieren. Dann habe ich meine Binärversion mit der von BioWare verglichen. Eines der Probleme während des Vergleichs bestand darin, sich mit einigen der leichten Varianzen der Gleitkommawerte zu befassen. Anstatt also für jede Art von Fließkommazahl (Scheitelpunkt, Normal usw.) eine Menge verschiedener EPSILONS zu verwenden, wollte ich etwas wie diesen Komplement-Vergleich verwenden. So vermeiden Sie das gesamte mehrfache EPSILON-Problem.

Dieselbe Art von Problem kann für jede Art von Software gelten, die Daten von Drittanbietern verarbeitet und dann ihre Ergebnisse mit dem Original validieren muss. In diesen Fällen wissen Sie vielleicht nicht einmal, was die Fließkommawerte darstellen, Sie müssen sie nur vergleichen. Wir haben dieses Problem mit unserer Software für die industrielle Automatisierung angegangen.

BEARBEITEN:

LOL, das wurde von verschiedenen Leuten auf und ab abgestimmt.

Ich werde das Problem auf den Punkt bringen, wenn Sie zwei beliebige Fließkommazahlen verwenden, wie entscheiden Sie, welches epsilon verwendet werden soll? Du kannst nicht.

Wie kann man 1e23 und 1.0001e23 mit einem Epsilon vergleichen und trotzdem 1e-23 und 5.2e-23 mit dem gleichen Epsilon vergleichen? Sicher, Sie können einige dynamische epsilon Tricks machen, aber das ist der ganze Punkt zum Ganzzahlvergleich (der NICHT erfordert, dass die ganzen Zahlen genau sind).

Der Ganzzahlvergleich ist in der Lage, zwei Gleitkommazahlen zu vergleichen, wobei ein Epsilon relativ zur Größe der Zahlen verwendet wird.

BEARBEITEN

Steve, lass uns sehen, was du in den Kommentaren gesagt hast:

"Aber du weißt, was Gleichheit für dich bedeutet ... Daher solltest du in der Lage sein, ein passendes Epsilon zu finden".

Drehen Sie diese Aussage um und sagen Sie:

"Wenn du weißt, was Gleichheit für dich bedeutet, solltest du in der Lage sein, ein passendes Epsilon zu finden."

Der springende Punkt bei dem, was ich zu sagen versuche, ist, dass es Anwendungen gibt, bei denen wir nicht wissen, was Gleichheit im absoluten Sinn bedeutet, also müssen wir auf einen relativen Vergleich zurückgreifen, was die Integer-Version versucht.

0
hinzugefügt
Aber du weißt, was Gleichheit für dich bedeutet ... und dein Code ist derjenige, der sie vergleicht. Daher sollten Sie in der Lage sein, ein geeignetes Epsilon zu finden.
hinzugefügt der Autor Steve Duitsman, Quelle
Epsilon arbeitet in der Problemdomäne, wenn Sie ein Navigationsgerät schreiben, um Sie von Dalls-Atlanta zu bekommen, ist das Epsilon die Unsicherheit in Ihrem GPS
hinzugefügt der Autor Martin Beckett, Quelle
Das ist wahr, aber mein Punkt ist, dass, wenn Sie keinen Bezug auf die Ursprünge der Schwimmer haben, die Auswahl eines Epsilons sehr schwierig wäre.
hinzugefügt der Autor Torlack, Quelle

Using any method that compares bitwise will result in trouble when fractions are represented by approximations. All floating point numbers with fractions that are not denominated in powers of two (1/2, 1/4, 1/8, 1/65536, &c) are approximated. So, of course, are all irrational numbers.

float drittes = 1/3; float zwei = 2,0; float another_two = drittes * 6,0; if (zwei! = another_zwei)    drucken ("Approximation! \ n");

Das einzige Mal, das bitweise vergleichen würde, wäre, wenn Sie die Gleitkommazahlen genau auf die gleiche Art und Weise ableiten, oder sie sind exakte Darstellungen (ganze Zahlen, Teilpotenzen von zwei). Selbst dann kann es mehrere Darstellungen einiger Zahlen geben, obwohl ich dies noch nie in einem funktionierenden System gesehen habe.

0
hinzugefügt
Ich auch nicht, weshalb ich neugierig bin.
hinzugefügt der Autor Steve Duitsman, Quelle