Vergleichen von zwei floats
#include <stdbool.h>
bool Equality(double a, double b, double epsilon)
{
if (fabs(a-b) < epsilon) return true;
return false;
}
Ich habe versucht, diese Methode zum vergleichen von zwei Doppel, aber ich bekomme immer Probleme, da ich nicht weiß, wie zu wählen, die epsilon
, eigentlich will ich vergleichen, kleine zahlen (6 6 stellen nach dem Komma) wie 0.000001. Ich habe versucht, mit einigen zahlen, manchmal bekomme ich 0.000001 != 0.000001
und manchmal 0.000001 == 0.000002
Gibt es eine andere Methode anderes, als der Vergleich mit dem epsilon?
Meine Absicht ist es, zu vergleichen, zwei Doppelzimmer (die stellen die Zeit in meinem Fall). Die variable t stellt die Zeit in Millisekunden ist, eine doppelter. Es erhöht wird, durch eine andere Funktion 0.000001 dann 0.000002 etc. jede Zeit t ändert, ich will, um zu überprüfen, ob es gleich in eine andere variable vom Typ double tt bei tt == t, ich habe einige Anweisungen ausführen..
Vielen Dank für Ihre Hilfe
- "Epsilon", nicht epselon. en.wikipedia.org/wiki/Epsilon
- Weder 0.000001 noch 0.000002 haben eine genaue Vorstellung, wie floating-point, beide unendlich sind binäre Fraktionen mit periodischen Dezimalzahlen. Darüber hinaus fabs(a-b) ist anfällig für katastrophale Absage.
- Wenn Sie nicht wissen, was das alles ist, können Sie vermeiden, zumindest das erste problem durch die Verwendung einer epsilon, die können genau dargestellt werden, wie schweben, wie 0.00000095367431640625, das ist 2^-20 und in der Nähe der 10^-6, die Sie wollen
- Warum sind Sie mit
float
in den ersten Platz? Lieberdouble
ohne eine sehr stark für andere floating-point-Typen. Natürlich Ihr Problem bleibt immer noch, ob esfloat
s oderdouble
s. - Eigentlich war es ein Fehler. Ich bin mit Doppelzimmer. meine Absicht ist es, zu vergleichen, zwei Doppelzimmer (die stellen die Zeit in meinem Fall). Die variable t stellt die Zeit in Millisekunden ist, eine doppelter. Es erhöht wird, durch eine andere Funktion 0.000001 dann 0.000002 etc. jede Zeit t ändert, ich will, um zu überprüfen, ob es gleich in eine andere variable vom Typ double tt bei tt == t, ich habe einige Anweisungen ausführen..
- Wählen epsilon können Sie sehen: Knuth, Donald E. (1998). Die Kunst der Computer-Programmierung. Volume 2: Seminumerical Algorithmen. Dritte Auflage. Abschnitt 4.2.2, S. 233. Reading, MA: Addison-Wesley. ISBN 0-201-89684-2. Für eine C-Implementierung finden Sie unter fcmp.sourceforge.net und insbesondere die README-Datei.
- mögliche Duplikate von effektivste Weg für float-und double-Vergleich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schau mal hier: http://floating-point-gui.de/errors/comparison/
Und, natürlich, Was Jeder Computer Scientist Should Know About Floating-Point Arithmetic
Zuerst: es gibt keinen Punkt bei der Berechnung einer booleschen Wert (mit der
<
operator) und dann wickeln, dass in einem anderen boolean. Nur schreiben Sie es so:Zweitens, es ist möglich, dass Ihr epsilon selbst nicht gut vertreten als
float
, und damit nicht so aussieht, wie das, was Sie erwarten. Versuchen Sie es mit einer negativen Potenz von 2, wie 1/1048576 zum Beispiel.Alternativ können Sie auch vergleichen zwei Ganzzahlen statt. Multiplizieren Sie einfach Ihren zwei Schwimmern von der gewünschten Präzision und warf Sie zu zahlen.
Werden Sie sicher, dass round up/down korrekt. Hier ist, wie es aussieht:
Beachten Sie, dass, wenn
float a = +2^(254-127) * 1.___22 zeros___1
undfloat b = +2^(254-127) * 1.___23 zeros___
dann erwarten wirabs(a-b) < epsilon
sonderna - b = +2^(254-127-23) * 1.___23 zeros___ = 20282409603651670423947251286000
sehr viel größer ist als epsilon...Ich Schreibe und diesen code testen. Es scheint arbeiten.