Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Double Werte vergleichen (https://www.delphipraxis.net/200794-double-werte-vergleichen.html)

DieDolly 25. Mai 2019 22:55

Double Werte vergleichen
 
Wie vergleicht man Double-Werte?
Ich habe A := 1.0 und B := 10.0.

Wenn ich nun if A >= B vergleiche erhalte ich komischerweise True.

Luckie 25. Mai 2019 23:21

AW: Double Werte vergleichen
 
Zeig mal deinen Code. Man sollte zudem bei Double-Werten, daran denken, dass die interne Darstellung von der angezeiget abweichen kann. Bei Rechnungen kann zum Beispiel 10.0000000000001 rauskommen, was als 10 ausgegeben wird. Aber ein Vergleich auf x = 10 schlägt dann fehl, wenn x = 10 ist. Deswegen berücksichtigt man dieses Verhalten, indem man ein Epsilon-Wert einführt, in dem man angibt wie ungenau es sein darf.

Uwe Raabe 26. Mai 2019 00:15

AW: Double Werte vergleichen
 
Ein Vergleich von 1.0 und 10.0 auf größer-gleich scheitert sicher nicht an der Genauigkeit.

Luckie 26. Mai 2019 01:17

AW: Double Werte vergleichen
 
Wer weiß? :lol:

Deswegen habe ich ja nach Code gefragt. Das mit der Genauigkeit war nur eine Zusatzinfo.

Andreas13 26. Mai 2019 21:08

AW: Double Werte vergleichen
 
Bei recht nahe beienander liegenden Werten sollte man einen unscharfen Vergleich verwenden:

Delphi-Quellcode:
System.Math.SameValue(const a, b: Double; Epsilon: Double): Boolean; overload;
Das vermeidet automatisch auftretende Rundungsfehler, falls eine Dezimal-Zahl binär nicht exakt abgebildet werden kann.

Gruß
Andreas

Luckie 26. Mai 2019 21:09

AW: Double Werte vergleichen
 
Genau das meine ich.

Amateurprofi 27. Mai 2019 02:15

AW: Double Werte vergleichen
 
Ihr Lieben,
die Hinweise auf die Vergleichstoleranz mögen ja ganz nett sein, aber wenn man 1.0 mit 10.0 vergleicht, dann braucht man keine Vergleichstoleranz.
Vielleich zeigt Dolly uns mal etwas Code.

Luckie 27. Mai 2019 07:17

AW: Double Werte vergleichen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1433180)
Ihr Lieben,
die Hinweise auf die Vergleichstoleranz mögen ja ganz nett sein, aber wenn man 1.0 mit 10.0 vergleicht, dann braucht man keine Vergleichstoleranz.
Vielleich zeigt Dolly uns mal etwas Code.

Wie ich schon sagte, es war nur eine Zusatzinfo passend zum Thema. :roll:

Rollo62 27. Mai 2019 08:16

AW: Double Werte vergleichen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1433180)
Ihr Lieben,
die Hinweise auf die Vergleichstoleranz mögen ja ganz nett sein, aber wenn man 1.0 mit 10.0 vergleicht, dann braucht man keine Vergleichstoleranz.
Vielleich zeigt Dolly uns mal etwas Code.

Wer sagt denn das eine Vergleichstoleranz nicht 10.0 oder 100.0 oder 1000.0 sein kann ?
Meiner Meinung nach gibt es immer eine, je nach Aufgabenstellung.

mkinzler 27. Mai 2019 08:20

AW: Double Werte vergleichen
 
Zitat:

Wer sagt denn das eine Vergleichstoleranz nicht 10.0 oder 100.0 oder 1000.0 sein kann ?
Meiner Meinung nach gibt es immer eine, je nach Aufgabenstellung.
Es geht um Rundungsfehler bei der Prüfung auf Gleichheit (angezeigtes 1.0 muss nicht gleich 1.0 sein).

Rollo62 27. Mai 2019 08:34

AW: Double Werte vergleichen
 
Delphi-Quellcode:
   if System.Math.SameValue(1.0, 10.0, 100.0) then ...
Wäre das deiner Meinung nach unzulässig ?
Wenn ja, warum.

Daniel 27. Mai 2019 09:03

AW: Double Werte vergleichen
 
Mit Blick auf die Ausgangsfrage, die die Nutzung des ">="-Operatus suggeriert, scheint das schlicht ein anderer Ansatz zu sein.
Zudem haben wir - trotz der dürftigen Informationslage - keinen Hinweis darauf, dass entsprechend große Toleranzen hier gewünscht sind.

mkinzler 27. Mai 2019 09:08

AW: Double Werte vergleichen
 
Zitat:

Delphi-Quellcode:
   if System.Math.SameValue(1.0, 10.0, 100.0) then ... Wäre das deiner Meinung nach unzulässig ?
Wenn ja, warum.
Nein. In diesem Beispiel würde auch eine Toleranz von 10 schon zur Gleichheit führen.
Der TE möchte aber nicht auf die Gleichheit zweier Werte Prüfen sondern auf >= und da wäre das Äquivalent mit konfigurierbarer Toleranz ja eher System.Math.CompareValue.

Die Vergleiche feuern bei mir beide nicht (wie ich es auch erwarten würde).
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b: Double;
begin
  a := 1.0;
  b := 10.0;
  if a>=b then Button1.Caption := 'Ups';
  if System.Math.CompareValue(a,b, 10) = 1 then Button1.Caption := 'OOh';

end;

bernau 27. Mai 2019 10:49

AW: Double Werte vergleichen
 
Alles Spekulation. Ohne einen Schnipsel Beispielcode bringt keine Diskussion etwas.

hoika 27. Mai 2019 11:52

AW: Double Werte vergleichen
 
Hallo,
Zitat:

Ich habe A := 1.0 und B := 10.0.
Das ist doch Code.

Ich denke aber, nicht der richtige ... ;)

DieDolly 27. Mai 2019 11:53

AW: Double Werte vergleichen
 
Ich kann Entwarnung geben. Ich konnte erst jetzt wieder auf den Code gucken. Ich habe in der Testausgabe dummerweise zwei Variablen vertauscht. :pale:

Luckie 27. Mai 2019 12:17

AW: Double Werte vergleichen
 
Hier der passende Smiley für dich: :wall:

:mrgreen:

DieDolly 27. Mai 2019 12:34

AW: Double Werte vergleichen
 
3 davon würden besser passen. Augen auf beim ... testen.

p80286 27. Mai 2019 13:19

AW: Double Werte vergleichen
 
:shock:
Wer hätte das gedacht.:wink:

Ist aber wohl den meisten schon passiert.

Gruß
K-H

Amateurprofi 27. Mai 2019 16:41

AW: Double Werte vergleichen
 
Zitat:

Zitat von Rollo62 (Beitrag 1433184)
Zitat:

Zitat von Amateurprofi (Beitrag 1433180)
Ihr Lieben,
die Hinweise auf die Vergleichstoleranz mögen ja ganz nett sein, aber wenn man 1.0 mit 10.0 vergleicht, dann braucht man keine Vergleichstoleranz.
Vielleich zeigt Dolly uns mal etwas Code.

Wer sagt denn das eine Vergleichstoleranz nicht 10.0 oder 100.0 oder 1000.0 sein kann ?
Meiner Meinung nach gibt es immer eine, je nach Aufgabenstellung.

Wo soll denn da eine Vergleichstoleranz 10.0 oder 100.0 oder 1000.0 herkommen?
Lies doch mal #1.
DieDolly schrieb
Zitat:

Ich habe A := 1.0 und B := 10.0.
Wenn ich nun if A >= B vergleiche erhalte ich komischerweise True.
Bei A >= B ist keine Vergleichstoleranz im Spiel, denn es werden 2 ganze Zahlen verglichen, bei denen keinerlei Differenzen auftreten können, die dadurch entstehen, dass gebrochene Zahlen binär nicht präzise dargestellt werden können.

mkinzler 27. Mai 2019 16:50

AW: Double Werte vergleichen
 
Zitat:

denn es werden 2 ganze Zahlen verglichen
Es handelt sich aber um 2 Double-Werte.

Luckie 27. Mai 2019 17:18

AW: Double Werte vergleichen
 
Zitat:

Zitat von mkinzler (Beitrag 1433206)
Zitat:

denn es werden 2 ganze Zahlen verglichen
Es handelt sich aber um 2 Double-Werte.

Zum einem das. Und wir wissen nicht, wo sie herkommen.

Amateurprofi 27. Mai 2019 23:38

AW: Double Werte vergleichen
 
Zitat:

Zitat von mkinzler (Beitrag 1433206)
Zitat:

denn es werden 2 ganze Zahlen verglichen
Es handelt sich aber um 2 Double-Werte.

Na und?
Wenn du in einem Double eine Zahl ohne Nachkommastellen (oder alle Nachkommastellen 0 sind) und die Zahl +/- 2^52 nicht übersteigt, dann ist das eine Integerzahl.
Bei Vergleichen min anderen Zahlen, die ebenfalls keine Nachkommastellen haben, treten die Probleme mit Vergleichstoleranzen nicht auf.
Bei dem Problem, um das es hier ging, und mittlerweise wissen wird ja, dass das Problem keines war, ging es um zwei Zahlen, nämlich 1.0 und 10.0, eben Zahlen ohne Nachkommazahlen.
Schau dir doch mal im Debugger an, wie solche Zahlen in der FPU gezeigt werden. Als Zahlen ohne Nachkommastellen.

Amateurprofi 27. Mai 2019 23:41

AW: Double Werte vergleichen
 
Zitat:

Zitat von Luckie (Beitrag 1433208)
Zitat:

Zitat von mkinzler (Beitrag 1433206)
Zitat:

denn es werden 2 ganze Zahlen verglichen
Es handelt sich aber um 2 Double-Werte.

Zum einem das. Und wir wissen nicht, wo sie herkommen.

Doch, wir wissen sehr genau wo sie herkommen.
Wie schrieb DieDolly
Zitat:

Ich habe A := 1.0 und B := 10.0.

Luckie 28. Mai 2019 01:00

AW: Double Werte vergleichen
 
Das hat sie hier geschrieben. Aber ich gehe mal davon aus, dass es keine Konstanten sind, sondern Ergebnisse voran gegangener Rechnungen. Und da ist es durchaus interessant, was vorher passiert ist. Wurde gerundet? Wurde gecastet? Wie sehen die Ursprungswerte der Rechnung aus? Mit welchen Datentypen wurde gerechnet? Das kann alles eine Rolle spielen.

Sherlock 28. Mai 2019 07:40

AW: Double Werte vergleichen
 
*Räusper*
Die Diskussion basiert auf einem Fehler...das ist allen klar?

Sherlock

p80286 28. Mai 2019 08:19

AW: Double Werte vergleichen
 
Psst stör sie nicht. Die Anfänger sitzen andächtig vor dem Monitor und staunen.

Gruß
K-H

Luckie 28. Mai 2019 08:22

AW: Double Werte vergleichen
 
Zitat:

Zitat von p80286 (Beitrag 1433232)
Psst stör sie nicht. Die Anfänger sitzen andächtig vor dem Monitor und staunen.

oder ein Anfänger hat das gleiche Problem und stößt hier über die Info, wie man Fleißkommazahlen richtig vergleicht. ;-)

p80286 28. Mai 2019 09:25

AW: Double Werte vergleichen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1390442)
Die Unit System.Math bietet dafür die Funktion
Delphi-Quellcode:
SameValue
.

aus
https://www.delphipraxis.net/194796-...-typ-real.html

Und gut is

Gruß
K-H

mkinzler 28. Mai 2019 11:29

AW: Double Werte vergleichen
 
Wie baue ich eine Schleife in einen Thread: Immer wieder die selben Vorschläge bringen ...

p80286 28. Mai 2019 13:36

AW: Double Werte vergleichen
 
Ich hab Andreas Beitrag übersehen:oops:

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz