Discussion:
Sicheres Vergleichen von "Double"-Werten
(zu alt für eine Antwort)
Heinz Reiter
vor 20 Jahren
Permalink
Hallo,
ich muß 2 Double-Werte in bis zur 2.Nachkommastelle vergleichen.
Die Werte wurden Summiert, und x-mal mit den 4 Grundrechenarten
behandelt.

Ich könnte mir natürlich irgenwas basteln, ... zerlegen ... in
Strings umformen ...
Wenn sie angezeigt werden nehme ich einfach die .Text-Properties, das
geht.


1,699945 = 1.700345 usw.
Gibt es eine elegantere Lösung dafür?

Heinz Reiter
Simon Schäberle
vor 20 Jahren
Permalink
Post by Heinz Reiter
Hallo,
ich muß 2 Double-Werte in bis zur 2.Nachkommastelle vergleichen.
Die Werte wurden Summiert, und x-mal mit den 4 Grundrechenarten
behandelt.
Ich könnte mir natürlich irgenwas basteln, ... zerlegen ... in
Strings umformen ...
Wenn sie angezeigt werden nehme ich einfach die .Text-Properties, das
geht.
1,699945 = 1.700345 usw.
Gibt es eine elegantere Lösung dafür?
Realzahle (double, real, single,...) sollte man nicht per gleich sonder
nur per ungleich, größer, kleiner Vergleichen.

Mit Realzahlen kann man nicht alle Zahlen abbilden, da die Codierung
dies nicht zulässt. Also wird geschaut, welche Zahl am besten die
gesuchte Zahl abbildet.
Für nähere Details schau mal unter http://de.wikipedia.org/wiki/IEEE_754

Gruß
Simon Schäberle
Thomas G. Liesner
vor 20 Jahren
Permalink
Post by Heinz Reiter
1,699945 = 1.700345 usw.
Gibt es eine elegantere Lösung dafür?
Round(a*100)=Rond(b*100)

So long,
Thomas G. Liesner
--
Da zur Zeit meine Kündigung aus betriebsbedingten Gründen läuft, bin ich an Job-
Angeboten als Softwareentwickler - im Optimalfall teilweise bis hauptsächlich in
Heimarbeit - sehr interessiert. Wohnort: Greven bei Münster in Westfalen.
Hans Danckwerts
vor 20 Jahren
Permalink
Post by Thomas G. Liesner
Post by Heinz Reiter
ich muß 2 Double-Werte in bis zur 2.Nachkommastelle vergleichen.
1,699945 = 1.700345 usw.
Gibt es eine elegantere Lösung dafür?
Round(a*100)=Rond(b*100)
Klitzeklitzekleine Verbesserung:
Wenn es dem OP wirklich um den Vergleich bis zur 2.NK geht,
dürfte Trunc(a*100)=Trunc(b*100) besser funzen ;-)
--
Gruß Hans

Auftretende Rechtschreibfehler entstanden sicher durch die elektronische Datenübertragung
und *nicht* durch den Autor
Thomas G. Liesner
vor 20 Jahren
Permalink
Post by Hans Danckwerts
Post by Thomas G. Liesner
Post by Heinz Reiter
ich muß 2 Double-Werte in bis zur 2.Nachkommastelle vergleichen.
1,699945 = 1.700345 usw.
Gibt es eine elegantere Lösung dafür?
Round(a*100)=Rond(b*100)
Wenn es dem OP wirklich um den Vergleich bis zur 2.NK geht,
dürfte Trunc(a*100)=Trunc(b*100) besser funzen ;-)
Wenn er ansonsten formatierte Ausgaben als Vergleich nimmt, dürfte Round
dem eher entsprechen, aber deine Interpretation kann natürlich richtig
sein.

So long,
Thomas G. Liesner
--
Da zur Zeit meine Kündigung aus betriebsbedingten Gründen läuft, bin ich an Job-
Angeboten als Softwareentwickler - im Optimalfall teilweise bis hauptsächlich in
Heimarbeit - sehr interessiert. Wohnort: Greven bei Münster in Westfalen.
Joachim Mohr
vor 20 Jahren
Permalink
Post by Hans Danckwerts
Wenn es dem OP wirklich um den Vergleich bis zur 2.NK geht,
dürfte Trunc(a*100)=Trunc(b*100) besser funzen ;-)
Nein!
Wie das schiefgehen kann, habe ich in
http://delphi.zsg-rottenburg.de/dezbin.html#nebenbei
geschildert.

Seither beachte ich folgenden Literaturtipp:
Literatur: Zu dieser Problematik ist folgender Aufsatz zu empfehlen:
"What every computer scientist should know about floating-point
arithmetic". Siehe http://www.validlab.com

MFG Joachim
--
Dr. Joachim Mohr. Richtige e-mail-Adresse auf:
http://www.joachimmohr.de Dort auch Programmen und Lektionen zu
Delphi, Mathematik und Musik (rein, mitteltönig).
Nicolas Bronke
vor 20 Jahren
Permalink
Post by Joachim Mohr
Post by Hans Danckwerts
Wenn es dem OP wirklich um den Vergleich bis zur 2.NK geht,
dürfte Trunc(a*100)=Trunc(b*100) besser funzen ;-)
Nein!
Wie das schiefgehen kann, habe ich in
http://delphi.zsg-rottenburg.de/dezbin.html#nebenbei
geschildert.
Herlich an diesem Thema ist, das man bereits jahrzehnte darüber diskutiert
und noch keine perfekte Lösung da ist.
Allerdings kenne ich di Probleme ur mit Programmiersprachen. Mit Lotus 123
oder Oracle bin ich diesbzgl. noch nie in Probleme gekommen.
Was mahen die besser als Delphi?
Grüsse
Nicolas
Ralf Mimoun
vor 20 Jahren
Permalink
Moin!

Nicolas Bronke wrote:
...
Post by Nicolas Bronke
Herlich an diesem Thema ist, das man bereits jahrzehnte darüber
diskutiert und noch keine perfekte Lösung da ist.
Nix "noch". Es gibt keine. Unterschiedliche Zahlensysteme sind seit Urzeiten
bekannt, ebenso die entsprechenden Probleme.
Post by Nicolas Bronke
Allerdings kenne ich di Probleme ur mit Programmiersprachen. Mit
Lotus 123 oder Oracle bin ich diesbzgl. noch nie in Probleme gekommen.
Was mahen die besser als Delphi?
Gar nix - wenn man in Delphi entsprechende Systeme nutzt. Zum Beispiel
Currency oder TBCD. Ist eben nur etwas mehr Arbeit, besonders wenn man z.B.
mehr als 4 Stellen hinter dem Komma braucht und deshalb Currency nicht in
Frage kommt. Ach ja, und wenn man ein DB-System hat, das auch "richtige"
Floats unterstützt (also intern nicht auf BCD umsetzt), kämpft man auch
wieder mit den gleichen Problemen. IOW: Programmieren ist Arbeit.

Bye, Ralf
Marian Aldenhövel
vor 20 Jahren
Permalink
Hallo,
Post by Nicolas Bronke
Herlich an diesem Thema ist, das man bereits jahrzehnte
darüber diskutiert und noch keine perfekte Lösung da ist.
Das ist so als sich darüber zu wundern, daß es seit Jahrtausenden
noch keine Lösung dazu gibt wie man mit Zirkel und Lineal die
Wurzel aus zwei konstruiert.

Es _gibt_ keine perfekte Lösung und es kann keine geben.

Es gibt wunderbare praxisorientierte Lösungen die das Problem
vollständig lösen.
Post by Nicolas Bronke
Mit Lotus 123 oder Oracle bin ich diesbzgl. noch nie in
Probleme gekommen.
Was machen die besser als Delphi?
Nichts. Du verwendest entweder andere Datentypen (Festkommawerte)
oder machst andere Operationen. Beides kannst Du auch in Delphi
tun und bekommst dann auch nicht _diese_ Probleme.

Beschreibe mal etwas, was Du in einer Oracle-Abfrage tust zusammen
mit vergleichbarem Code in Delphi...

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"It's easy to make a small fortune in aviation,
provided you start with a big one"
Joachim Mohr
vor 20 Jahren
Permalink
Post by Marian Aldenhövel
Das ist so als sich darüber zu wundern, daß es seit Jahrtausenden
noch keine Lösung dazu gibt wie man mit Zirkel und Lineal die
Wurzel aus zwei konstruiert.
^^^^^^
Du meinst sicher die _dritte_ Wurzel

MFG Joachim
--
Dr. Joachim Mohr. Richtige e-mail-Adresse auf:
http://www.joachimmohr.de Dort auch Programmen und Lektionen zu
Delphi, Mathematik und Musik (rein, mitteltönig).
Marian Aldenhövel
vor 20 Jahren
Permalink
Hallo,
Post by Joachim Mohr
Du meinst sicher die _dritte_ Wurzel
Klar.

So schlimmes Durcheinander habe ich schon lange nicht mehr formuliert.

Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn. +49 228 624013.
http://www.marian-aldenhoevel.de
"It's easy to make a small fortune in aviation,
provided you start with a big one"
Andreas Koch
vor 20 Jahren
Permalink
Post by Heinz Reiter
1,699945 = 1.700345 usw.
Gibt es eine elegantere Lösung dafür?
abs(1.699945 - 1.700345)<0.0001
Lesen Sie weiter auf narkive:
Loading...