AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warum ist 1.1 nicht gleich 1.1

Ein Thema von kobel · begonnen am 28. Sep 2006 · letzter Beitrag vom 28. Sep 2006
Antwort Antwort
kobel

Registriert seit: 6. Dez 2004
Ort: Attendorn
42 Beiträge
 
Delphi 6 Professional
 
#1

Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 17:04
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 17:06
Suchen?

Hier im Forum suchenFließkommazahlen intern
Gleitkommazahlen
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#3

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 17:09
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.
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
kobel

Registriert seit: 6. Dez 2004
Ort: Attendorn
42 Beiträge
 
Delphi 6 Professional
 
#4

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 17:49
DANKE !
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 17:51
if abs(1.1 - tmp_double) < 0.000001 then Geht auch und ist übersichtlicher.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#6

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 18:15
Das meinte ich ja mit Absolutwert in meinem Nachtrag.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 19:55
...oder man nehme für solches auch diese 'CompareValue'-Funktion.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 19:59
Alternativ und auch mit sinnvollem Namen: die Funktion 'isequal'
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 21:56
Zitat von 3_of_8:
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#10

Re: Warum ist 1.1 nicht gleich 1.1

  Alt 28. Sep 2006, 22:21
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 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