Laden...

Ähnlichkeit von double werten

Erstellt von T-Man vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.297 Views
T
T-Man Themenstarter:in
210 Beiträge seit 2006
vor 12 Jahren
Ähnlichkeit von double werten

Moin zusammen,

ich habe mir eine Extension-Method geschrieben, die vergleichen soll, ob zwei double Werte näherungsweise (bis auf die letzten beiden Stellen) gleich sind.

Nun hätte ich gerne Eure Meinung, ob die so funktioniert, ob es wohl Fälle geben kann, in denen sie nicht funktioniert...

Hier die Methode:


        public static bool ApproximatelyEquals(this double value, double other)
        {
            if (value == other) return true;
            if (value >= .0)
                if (other > value) return value * 1.0000000000001 >= other;
                else if (other >= .0) return other * 1.0000000000001 >= value;
                else return value < 0.0000000000001 && other > -0.0000000000001;
            if (other < .0)
                if (other > value) return other * 1.0000000000001 <= value;
                else return value * 1.0000000000001 <= other;
            return other < 0.0000000000001 && value > -0.0000000000001;
        }

Gruß
T-Man

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ich hätt eher sowas gemacht

return (Math.Abs(value - other) < 0.00000001);

Wieviele Nachkommastellen du da nimmst, bleibt dir überlassen. Ich würds auch nicht in Abhängigkeit der tatsächlichen Anzahl der Nachkommastellen machen.

T
T-Man Themenstarter:in
210 Beiträge seit 2006
vor 12 Jahren

Wenn Du mit Deiner Methode zwei sehr kleine Zahlen vergleichst sind die dann immer gleich und sehr große Zahlen sind es nie...
Das epsilon muss schon relativ zu den Zahlen sein.
Man muss es also berechnen. Math.Abs muss man auch verwenden...
Von der Performance her dürfte dass nicht gerade besser sein, oder?

6.911 Beiträge seit 2009
vor 12 Jahren

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

C
1.214 Beiträge seit 2006
vor 12 Jahren

Wenn Du mit Deiner Methode zwei sehr kleine Zahlen vergleichst sind die dann immer gleich und sehr große Zahlen sind es nie...

Warum? Ich berechne ja die Differenz. Die Differenz sehr großer Zahlen kann auch 0 sein, ich seh da kein Problem.

Man muss es also berechnen. Math.Abs muss man auch verwenden...
Von der Performance her dürfte dass nicht gerade besser sein, oder?

Ich denke, Math.Abs ist auf jeden Fall wesentlich performanter, als deine bedingten Sprünge und Multiplikationen 😉 Sofern das hier überhaupt eine Rolle spielt.

Ansonten sollte der Beitrag von gfoidl das Thema eigentlich erschöpfend erläutert haben.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Coder007,

Ansonten sollte der Beitrag von gfoidl das Thema eigentlich erschöpfend erläutert haben.

tut er auch, nur steht deine eigene Aussage im Widerspruch dazu, deshalb will ich einen letzten Satz zu folgendem sagen:

Ich berechne ja die Differenz. Die Differenz sehr großer Zahlen kann auch 0 sein, ich seh da kein Problem.

Du berechnest also den absoluten Fehler, aber wie gfoidl gezeigt hat, kommt es üblicherweise auf den relativen Fehler an; insofern ist der Einwand von T-Man gegen deinen Vorschlag berechtigt ... und wird in gfoidls Vorschlag berücksichtigt.

herbivore