Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fließkommazahlen auf Gleichheit prüfen (https://www.delphipraxis.net/80640-fliesskommazahlen-auf-gleichheit-pruefen.html)

Luckie 12. Nov 2006 22:23


Fließkommazahlen auf Gleichheit prüfen
 
Jeder weiß, oder sollte wissen, dass man dies nicht tun sollte. Warum, das werde ich noch zeigen. Allerdings bräuchte ich mal ein kleines Delphi-Beispiel, um dies zu zeigen.

Folgendes geht leider:
Delphi-Quellcode:
var
  a: Double;
  b: Double;

begin
  a := 19.3;
  b := 2 * 9.65;

  if a = b then
    Writeln('gleich')
  else
    Writeln('ungleich');
  Readln;
Ich bräuchte aber ein entsprechende Beispiel, beim dem die Abfrage auf Gleichheit nicht funktioniert.

fwsp 12. Nov 2006 22:39

Re: Fließkommazahlen auf Gleichheit prüfen
 
bei mir ist folgendes ungleich:
Delphi-Quellcode:
var
  a, b: Real;

begin
  a := 12345789.987654321;
  b := 24691357.9975308642 / 2;

  if a = b then
    Writeln('gleich')
  else
    Writeln('ungleich');
  Readln;
end.
Edit1:
Nach der Delphi 7 PE Hilfe ist Double = Real.

Luckie 12. Nov 2006 22:47

Re: Fließkommazahlen auf Gleichheit prüfen
 
Das Beispiel macht aber nur Sinn, wenn man durch zwei anstatt durch fünf teilt. ;)

Danke.

Dan habe ich einfach zu wenige Stellen genommen beim Testen.

fwsp 12. Nov 2006 22:53

Re: Fließkommazahlen auf Gleichheit prüfen
 
Zitat:

Zitat von Luckie
Das Beispiel macht aber nur Sinn, wenn man durch zwei anstatt durch fünf teilt. ;)

ich kann mich nicht erinnern irgendwo was anderes geschrieben zu haben...
daniel muss wohl gemeiner weise meine post nach
Code:
/ 2
parsen lassen und es durch
Code:
/ 5
ersetzen lassen.

Dax 12. Nov 2006 23:16

Re: Fließkommazahlen auf Gleichheit prüfen
 
10.0/3.0 und 10*(1.0/3.0) tun genau das selbe bei weniger Schreibaufwand :)

Luckie 12. Nov 2006 23:52

Re: Fließkommazahlen auf Gleichheit prüfen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von fwsp
bei mir ist folgendes ungleich:
Delphi-Quellcode:
var
  a, b: Real;

begin
  a := 12345789.987654321;
  b := 24691357.9975308642 / 2;

  if a = b then
    Writeln('gleich')
  else
    Writeln('ungleich');
  Readln;
end.

Bei mir aber nicht:
Delphi-Quellcode:
var
  a, b: Double;

begin
  a := 12345789.987654321;
  b := 24691579.975308642 / 2;

  Writeln('a: ', a);
  Writeln('b: ', b);
  if a = b then
    Writeln('gleich')
  else
    Writeln('ungleich');
  Readln;
Ausgabe:
Code:
a: 1.23457899876543E+0007
b: 1.23457899876543E+0007
gleich
Du hast dich vertan. Zwei mal 12345789.987654321 ist nicht 24691357.9975308642 sondern 24691579.975308642.

@Dax auch dein Beispiel ergibt 'gleich'.

EDIT: Übrigens das Beispiel von dieser Seite: http://www.mpdvc.de/artikel/FloatingPoint.htm funktioniert in Delphi auch nicht, aber in C. Wo liegt der Unterschied bei der Zahlenbehandlung von Delphi und C?

Im Anhang mal mein Artikel als PDF zu der Prolematik.

Luckie 13. Nov 2006 12:31

Re: Fließkommazahlen auf Gleichheit prüfen
 
OK, es liegt der Schluss nahe, dass die Delphi Datentypen für dieses Beispiel von Haus aus schon zu genau sind. ;)

Cöster 13. Nov 2006 12:40

Re: Fließkommazahlen auf Gleichheit prüfen
 
wenn man nicht a (=3/10) und b (=3/10) vergleicht, sondern a (=3/10) und 3/10, ist es ungleich, vorrausgesetzt, dass a Double ist. Wenn man Extended wählt, muss man a und 10*(1/3) vergleichen, damit es ungleich ist.

Luckie 13. Nov 2006 12:48

Re: Fließkommazahlen auf Gleichheit prüfen
 
Ist der Artikel denn so verständlich und sachlich richtig oder gibt es noch Ergänzungen / Korrekturen?

fwsp 13. Nov 2006 12:50

Re: Fließkommazahlen auf Gleichheit prüfen
 
Zitat:

Zitat von Luckie
Ist der Artikel denn so verständlich und sachlich richtig oder gibt es noch Ergänzungen / Korrekturen?

sollte eigentlich soweit richtig sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 Uhr.
Seite 1 von 3  1 23      

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