Wie nennt man beim Vergleich von Floats die Differenzschwelle?


10

Ich vergleiche gerade Floats in Java und die einfachste Formel lautet:

Math.abs(a - b) < THRESHOLD

Wenn Sie Ihre Variable nach der Differenzschwelle benennen, sollten Sie sie Delta oder Epsilon nennen ? Welcher der beiden Begriffe ist der richtige für den kleinsten Wert, den eine Gleitkommazahl darstellen kann?

Ist der Begriff Programmiersprache spezifisch oder ist er sprachübergreifend universell?


1
Alternative Begriffe: "Präzision", "Auflösung". Ich mag diese genau;) weil sie nicht übermäßig technisch klingen.
Stakx

1
Off-Topic: The Floating-Point - Leitfaden empfiehlt gegen diese Art von nahezu Gleichheitsvergleich verwendet.
Stakx

1
@stakx - Die von Ihnen vorgeschlagenen Begriffe sind falsch und haben andere Bedeutungen als die, nach denen das OP fragt. Die Frage ist detailliert, ja, aber es ist verantwortlich , basierend auf externen Referenz und es tut Relevanz für die Programmierung haben , wenn sie mit Gleitkommazahlen handelt. Es ist konstruktiv und thematisch.

1
@ GlenH7: Ich habe nie gesagt, dass die Frage nicht gut oder nicht beantwortbar ist. Tatsächlich war ich derjenige, der es positiv bewertet hat. Und da Sie behaupten, dass die von mir vorgeschlagenen (zugegebenermaßen weniger genauen) Begriffe falsch sind, würde mich interessieren, warum das so ist.
Stakx

@stakx - Entschuldigung, dass Sie für den Abschluss gestimmt haben. Ich reagierte im Moment mehr auf die vier engen Abstimmungen zu dieser Frage.

Antworten:


18

Epsilon in Mathematik und Ingenieurwesen

In Mathematik und Ingenieurwissenschaften im Allgemeinen:

  • Delta wird im Allgemeinen verwendet, um sich auf einen Unterschied zu beziehen, der beliebig groß sein kann.
  • Epsilon wird im Allgemeinen verwendet, um sich auf eine vernachlässigbare Menge zu beziehen.

und epsilon scheint in Ihrem Fall angemessener zu sein.


Epsilon in der Informatik

Insbesondere in der Informatik bezieht sich der Begriff Epsilon auch auf Maschinen-Espilon, das den Unterschied zwischen 1.0fund dem kleinsten Schwimmer misst, der streng größer als ist 1.0f. Diese letztere Zahl gilt 1.00000011920928955078125ffür Floats in Java und kann berechnet werden mit:

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

Die Definition von Maschinen-Epsilon stimmt mit der oben beschriebenen allgemeinen Verwendung von Epsilon überein.


Floats vergleichen

Beachten Sie jedoch, dass Sie vor dem Vergleich von Floats auf "Nähe" eine Vorstellung von deren Größe haben müssen. Zwei sehr große und angeblich sehr unterschiedliche Schwimmer können gleich sein:

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

Und umgekehrt kann es viele mögliche Float-Werte (und mehrere Größenordnungen) zwischen zwei kleinen Floats geben, die sich "nur" durch das Maschinen-Epsilon unterscheiden. Im folgenden Beispiel sind 10.000.000 Float-Werte zwischen smallund verfügbar f, aber ihr Unterschied liegt immer noch deutlich unter dem Maschinen-Epsilon:

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

Der in der Antwort von GlenH7 verlinkte Artikel untersucht den Float-Vergleich weiter und schlägt verschiedene Lösungen vor, um diese Probleme zu lösen.


2
-1: In wissenschaftlicher Computersoftware bezieht sich Epsilon entweder auf Machine Epsilon oder Relative Epsilon (siehe denselben Artikel). Typischerweise ist dies nicht die gleiche Größe, die zum Akzeptieren der ungefähren Gleichheit verwendet wird, da Rundungsfehler ein Vielfaches von Maschinen-Epsilons oder relativen Epsilons sind und typischerweise einige Größenordnungen größer als diese.
Rwong

1
@rwong Das ist eine Spezialisierung des Begriffs Epsilon , und es gibt viele andere. Im Engineering bezieht sich epsilon im Allgemeinen auf eine kleine Menge oder einen Fehler, und Machine epsilon ist mit dieser Idee kompatibel.
Assylias

@assylias, der einen Namen mit einer Standarddefinition verwendet, in einem Kontext, in dem die Standarddefinition sinnvoll ist, aber für etwas, das nicht der Standarddefinition entspricht, eine Quittung für Probleme ist.
AProgrammer

@AProgrammer Ich bin nicht der Meinung, dass die allgemeine Definition von epsilon nicht auf Computer anwendbar ist.
Assylias

1
@assylias: danke für die klärung. Ich habe meine -1 entfernt.
Rwong

16

In der Mathematik wird Delta verwendet, um einen Unterschied zu einem Wert darzustellen, epsilon wird verwendet, um einen beliebigen Fehlerwert darzustellen. In diesem Fall wäre epsilon der herkömmliche Name.


8

Um Ihre Frage direkt zu beantworten, möchten Sie den Begriff verwenden epsilon. Genauer gesagt, es ist machine epsilonaber die allgemeine Verwendung lässt "Maschine" fallen und verwendet nur epsilon.

Wenn ich in meine lokale Kopie von schaue, float.hsehe ich:

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

Und die damit verbundenen Kommentare machen deutlich, dass epsilon der Begriff ist, auf den Sie sich beziehen.

Wir können uns aber auch auf andere externe Referenzen verlassen, um zu überprüfen, ob dies epsilonder richtige Begriff ist. Sehen Sie hier , hier , hier und schließlich diese Kombination von SO-Abfrage-Tags . Ich konnte keinen direkten Verweis auf den IEEE 754-Standard finden, um ihn zu zitieren.


Sie haben nicht gefragt, aber ich fand diese Referenz sehr relevant für das Beispiel, das Sie zur Klärung Ihrer Frage angegeben haben.

Schauen Sie sich diesen Blog-Artikel von Bruce Dawson von Valve zum Vergleich von Gleitkommawerten an, um zu erfahren, warum Sie den von Ihnen vorgeschlagenen Vergleich nicht verwenden möchten.

In diesem Artikel sind einige Informationen enthalten, aber dies ist der relevanteste Ausschnitt von dort:

Wenn der Vergleich von Floats auf Gleichheit eine schlechte Idee ist, können Sie dann überprüfen, ob ihre Differenz innerhalb einiger Fehlergrenzen oder des Epsilon-Werts liegt, wie folgt:

bool isEqual = fabs(f1 – f2) <= epsilon;

Mit dieser Berechnung können wir das Konzept ausdrücken, dass zwei Floats nahe genug sind, um sie als gleich zu betrachten. Aber welchen Wert sollten wir für epsilon verwenden?
Angesichts unserer obigen Experimente könnten wir versucht sein, den Fehler in unserer Summe zu verwenden, der ungefähr 1,19e-7f betrug. Tatsächlich gibt es in float.h sogar eine Definition mit genau diesem Wert, die FLT_EPSILON heißt.
Klar ist es das. Die Header-Datei Götter haben gesprochen und FLT_EPSILON ist das einzig wahre Epsilon!
Nur dass das Müll ist. Für Zahlen zwischen 1,0 und 2,0 repräsentiert FLT_EPSILON den Unterschied zwischen benachbarten Floats. Für Zahlen kleiner als 1,0 wird ein Epsilon von FLT_EPSILON schnell zu groß, und bei ausreichend kleinen Zahlen kann FLT_EPSILON größer sein als die Zahlen, die Sie vergleichen!

Dawson geht auf einige andere Überlegungen zu den Feinheiten ein, die beim Vergleich von Floats und beim Umgang mit sehr kleinen Werten wie diesen auftreten. Ich möchte Sie daher ermutigen, den Rest seines Beitrags zu lesen.


Vielleicht möchten Sie den ersten Teil Ihrer Antwort klarstellen: Der Artikel von Bruce erklärt bereits, warum man kein konstantes Epsilon (wie das in einer Header-Datei definierte) für den Toleranzvergleich verwenden sollte. In vielen Fällen ist ein Fehler von einigen Millionen ULPs kein Grund zur Sorge, da wir uns in den meisten Anwendungen mehr um die signifikanten Ziffern als um die Fehler in den niedrigstwertigen Ziffern kümmern, da die doppelte Genauigkeit bereits ergibt viel mehr Ziffern als uns wichtig sind.
Rwong

@rwong - Während ich es las, war die Frage, den richtigen Begriff für den Namen einer Konstante zu identifizieren. Deshalb habe ich zusammen mit einigen anderen die float.h-Referenz bereitgestellt, um epsilon zu bearbeiten. Der Artikel von Dawson habe ich bei der Suche nach der IEEE 754-Referenz gefunden und dachte, er sei für die OPs simplest formulazum Vergleich relevant . Viele verwenden diesen Ansatz als ersten Versuch, und ich habe Dawsons Artikel aufgenommen, weil er wirklich in die Nuancen geht, wie schwierig der Vergleich ist. Also habe ich versucht, die Frage direkt zu beantworten und dann darauf hinzuweisen, warum ich sie nicht so verwenden soll.

5

Dies ist eine Fehlerfunktion. absoluter Fehler wird in der Regel genannt ε (Epsilon) oder Δ x für einige Menge x:

ε = | erwartet - tatsächlich |

Δ x = | x 0 - x  |

Relativer Fehler wird manchmal als η (eta) bezeichnet:

η = | 1 - tatsächlich / erwartet |

Für Programmierzwecke absoluteErrorund relativeError(oder einige Abkürzungen davon) sind beschreibender. Wenn Sie behaupten möchten, dass der Fehler kleiner als ein bestimmter Wert ist, wird dieser Wert einfach als Schwellenwert oder Toleranz bezeichnet .

Sehen:


3

Ich würde es "Toleranz" nennen.

Vielleicht ist das nicht der mathematisch korrekte Begriff, aber die bloße Tatsache, dass Sie die Frage stellen, impliziert für mich, dass weder "Delta" noch "Epsilon" ein guter Variablenname wäre.

Nach meiner Erfahrung ist es besser, Bezeichnernamen zu verwenden, die für diejenigen sinnvoll sind, die den Code tatsächlich lesen. Was nützt ein vollkommen korrekter Name, wenn der Leser ihn bei Wikipedia nachschlagen muss, um zu verstehen, was er bedeutet?


+1. Ich hoffe immer, dass die Leute ihre Mitarbeiter nach diesen Namensfragen fragen und hier posten.
MarkJ

6
-1, Konventionen besser lernen als vermeiden.
Djechlin

+1, weil dies genau der gleiche Grund ist, warum ich diese Frage gestellt habe.
NobleUplift
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.