Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum ist 1.1 nicht gleich 1.1 (https://www.delphipraxis.net/78073-warum-ist-1-1-nicht-gleich-1-1-a.html)

kobel 28. Sep 2006 16:04


Warum ist 1.1 nicht gleich 1.1
 
Hallo,

ich frage eine Variable vom Typ double wie folgt ab:

Delphi-Quellcode:
tmp_double:=1.1;
if (tmp_double = 1.1) then
showmessage('hallo');
WARUM ist der Ausdruck FALSE ???

DANKE
kobel

Dax 28. Sep 2006 16:06

Re: Warum ist 1.1 nicht gleich 1.1
 
Suchen? :gruebel:

[dp]Fließkommazahlen intern[/dp]
Gleitkommazahlen

Phoenix 28. Sep 2006 16:09

Re: Warum ist 1.1 nicht gleich 1.1
 
Doubles sind Fliesskommazahlen.

Eine Zuweisung von 1.1 kann u.u. einen Wert von 1.100000000000000000000000000000001 oder ähnliches im Double erzeugen (je nach aktueller Genauigkeit). Aber 1.100000000000000000000000000000001 ist nunmal nicht 1.1. Ergo false, da hat Delphi vollkommen recht ;-)

Du musst hier auf eine ausreichende Genauigkeit runden bevor Du vergleichst bzw. du Subtrahierst die voneinander und vergleichst dann auf einen maximalen Differenzwert.

z.B.
Delphi-Quellcode:
if (((1.1 - tmp_double) < 0.000001) AND ((1.1 - tmp_double) > -0.000001)) then
Edit Nachtrag: Wenn Du die Different als Absolutwert nimmst brauchst Du nur auf < zu vergleichen.

kobel 28. Sep 2006 16:49

Re: Warum ist 1.1 nicht gleich 1.1
 
DANKE !

3_of_8 28. Sep 2006 16:51

Re: Warum ist 1.1 nicht gleich 1.1
 
Delphi-Quellcode:
if abs(1.1 - tmp_double) < 0.000001 then
Geht auch und ist übersichtlicher. ;)

Phoenix 28. Sep 2006 17:15

Re: Warum ist 1.1 nicht gleich 1.1
 
Das meinte ich ja mit Absolutwert in meinem Nachtrag. ;-)

TStringlist 28. Sep 2006 18:55

Re: Warum ist 1.1 nicht gleich 1.1
 
...oder man nehme für solches auch diese 'CompareValue'-Funktion.

Nikolas 28. Sep 2006 18:59

Re: Warum ist 1.1 nicht gleich 1.1
 
Alternativ und auch mit sinnvollem Namen: die Funktion 'isequal'

Cöster 28. Sep 2006 20:56

Re: Warum ist 1.1 nicht gleich 1.1
 
Zitat:

Zitat von 3_of_8
Delphi-Quellcode:
if abs(1.1 - tmp_double) < 0.000001 then
Geht auch und ist übersichtlicher. ;)

und ein bisschen schneller. Aber wenn man bei Phoenix' Methode die 6 unnötigen Klammern wegließe, wär sie auch nicht unübersichtlicher.

Khabarakh 28. Sep 2006 21:21

Re: Warum ist 1.1 nicht gleich 1.1
 
Zitat:

Zitat von Phoenix
Eine Zuweisung von 1.1 kann u.u. einen Wert von 1.100000000000000000000000000000001 oder ähnliches im Double erzeugen (je nach aktueller Genauigkeit). Aber 1.100000000000000000000000000000001 ist nunmal nicht 1.1. Ergo false, da hat Delphi vollkommen recht ;-)

Hm. Ich werfe Delphi 1.1 = 1.1 vor die Füße und es macht mir daraus 1.1 + 10^-15 = 1.1 + 10^-15. Wird die Aussage dadurch unwahr ;) ?
Imo ist die Frage durchaus berechtigt, wenn man es noch nicht weiß und mit Asm nichts anfangen kann, und die genaue Antwort fehlt bisher: Das Float-Literal wird als Extended gespeichert, womit dessen Genauigkeit größer als die der Double-Variable ist. Man müsste also entweder beide Argumente zuerst in Double-Variablen speichern (bei anderen Sprachen könnte man stattdessen auch einen Postfix benutzen, der das Literal als Double-Wert identifiziert) oder eben gleich SameValue benutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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