Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi probleme mit double (https://www.delphipraxis.net/73892-probleme-mit-double.html)

kandl 25. Jul 2006 10:31


probleme mit double
 
hallo, ich habe ein problem mit dem erhöhen von double werten.

zuerst ist

testvar=-0.0038;

schleife
if abfrage ob ein element aus meiner matrix -0.0038 ist

wenn ja
wird dies ausgeführt

dann wird testvar um 0.0001 erhöht ( also -0.0037)

wenn jetzt ein wert meiner matrix -0.0037 ist funktioniert auch alles perfekt
aber wenn ich die variable nochmal um 0.0001 erhöhe

und dann in die if abfrage reinkomme funktioniert diese nicht mehr.

hat irgendjemand eine idee woran das liegen könnte.

mfg,
kandl

Martin K 25. Jul 2006 10:35

Re: probleme mit double
 
Ohne Code kann dir bestimmt keiner helfen.

fkerber 25. Jul 2006 10:37

Re: probleme mit double
 
Hi!

Und herzlich willkommen in der DP!

Könntest du uns deinen Code zeigen? Das macht es einfach, das Ganze nachzuvollziehen!
Außerdem könntest du "funktioniert dieses nicht mehr" nher umschreiben!


Ciao Frederic

kandl 25. Jul 2006 10:41

Re: probleme mit double
 
wusste nicht inwieweit man code posten darf.
naja.

Delphi-Quellcode:
while(position_max<3)do
begin
   for i:=0 to punkteMemo.Lines.Count-1 do
   begin
      if((punkte[i,param]=maximum) and (position_max<3)and (istBereitsVektor(i,position_max,e2richtungsvekt)=false))then
       begin
       for j:= 0 to ANZ_COORD do
          begin
             e2richtungsvekt[position_max,j]:=punkte[i,j];
          end;
          inc(position_max);
       end;
   end;
   maximum:=maximum-0.0001;
end;
lg,kandl

JasonDX 25. Jul 2006 10:42

Re: probleme mit double
 
Zwei Gleitkommazahlwerte zu auf Gleichheit zu überprüfen ist sinnlos. Durch die interne Darstellungs- und Berechungsweise kann es immer zu kleinen Abweichungen kommen, wie in deinem Fall. Deshalb kann es auch vorkommen, dass dir als Zahl bspw. nicht 0.0038 sondern 0.0037999999999 angezeigt wird.
Ablöse dürfte ein Vergleich mit einem gegebenen Abweichungsfaktor bringen:
Delphi-Quellcode:
function DoublesEqual(a, b: double): boolean;
const
  epsilon = 0.000001;
begin
  result := abs(a - b) < epsilon;
end;
Epsilon gibt dabei die Genauigkeit an, auf die du die Gleichheit überprüfen möchtest.

greetz
Mike

fkerber 25. Jul 2006 10:45

Re: probleme mit double
 
Hi!

Zitat:

Zitat von kandl
wusste nicht inwieweit man code posten darf.

Das ist in Ordnung so!

Es gibt sogar spezielle BB-Tags, damit man es besser formatieren kann. Für deinen Fall wäre es dann [.delphi] bzw. [./delphi]
(ohne die Punkte)

Zum editieren deines obigen Beitrags gibt recht des Edit-Knopf!

Edit: Ok, hast du ja gefunden ;)

EDIT 2:

Du solltest deine If-Bedingung nochmal überdenken:
Man sollte nicht auf "= false"! Dazu findest du auch einige Threads hier und soweit ich das sehe, brauchst du die zweite Bedingung nicht, da das durch die While-Schleife abgedeckt ist!


Ciao, Frederic

kandl 25. Jul 2006 11:23

Re: probleme mit double
 
hi,

Zitat:

Man sollte nicht auf "= false"! Dazu findest du auch einige Threads hier und soweit ich das sehe, brauchst du die zweite Bedingung nicht, da das durch die While-Schleife abgedeckt ist!
ich muss auch im if teil zusätzlich noch überprüfen, weil ich ja in der for schleife alle punkte durchlaufe und wenn die koordinate übereinstimmt füge ich diesen punkt zu e1richtungvekt hinzu. dieser darf aber nur 3 vektoren enthalten. wenn ich die 2. bedingung weglassen würde wäre es möglich, dass er innerhalb der for-schleife 4 punkte findet die mit dem wert übereinstimmen und würde somit den 3. durch den 4. vektor ersetzen.
dies sollte aber nicht sein. deshalb brauche ich die 2. bedingung auch noch.




Zitat:

Durch die interne Darstellungs- und Berechungsweise kann es immer zu kleinen Abweichungen kommen, wie in deinem Fall. Deshalb kann es auch vorkommen, dass dir als Zahl bspw. nicht 0.0038 sondern 0.0037999999999 angezeigt wird
ich habe die werte in ein memofeld eingegeben und habe alle werte mit 4 kommastellen eingegeben. in meinem array steht an der richtigen stelle auch -0.0036 drinnen aber wenn ich es vergleiche

Delphi-Quellcode:
if((punkte[i,param] =minimum)and (position_min<3)and
         (istBereitsVektor(i,position_min,e1richtungsvekt)=false))then
dann führt er den if teil nicht aus.(punkte[i,param]ist aber(0.40,-0.0036,0.34) und param=1
demzufolge müsste er den wert -0.0036 nehmen und mit minimum(ist zu dem zeitpunkt auch -0.0036) vergleichen.

himitsu 25. Jul 2006 14:34

Re: probleme mit double
 
dann versuch dir mal den wert mit der maximalen genauigkeit anzuzeigen ... die normalen "konvertierungsfunktionen zeigen ja nur einen Teil der möglichen stellen an, aber selbst dann kann immernoch gerundet werden, so das du eh nie genau sehen wirst, was wirklich in der Variable drinsteckt.


0.0037999999999 wurd nunmal als 0.0038 angezeigt, oder auch
0.0037999999998
0.0037999999997
0.00380000000001
... halt alles was für die Anzeige enstsprechend gerundet wird.

Die einzige Lösung (für deine Datentypen) wurde bereits gesagt.
nicht direkt vergleichen, sondern nur püfen, ob es nah an deinem gewünschten Wert liegt.

Du könntest natürlich auch auf Datentypen umsteigen, welche nicht (oder zumindestens in deinem Wertebereich) zu wertverfälschungen neiden, z.B. Aufgrund von Rundung.

Oder du skalierst die dine Werte in einen Integer, oder einen anderen Nicht-Fließkommatyp.
Als beispiel wäre da Currency zu nennen, welcher rein zufällig genau/makimal vier Nachkommastellen zur Verfügung hat.

Wenn mehr benötigt werden, muß du halt selber entsprechende skalieren.

Robert Marquardt 25. Jul 2006 16:36

Re: probleme mit double
 
Beginnen wir mal mit der Mathematik. Die Menge der Realzahlen ist ueberabzaehlbar unendlich. Es gibt also nicht nur unendlich viele, sondern auch noch mehr als man zaehlen kann.
Ein Double hat 64 Bit. Es kann also nur endlich viele (2^64 verschiedene) Bitmuster speichern. Damit hat die Darstellung der Realzahlen gigantische Luecken.
Bs werden also jeweils ein zusammenhaengender Bereich von unendlich vielen Realzahlen auf ein Bitmuster abgebildet und besonders bei grossen Zahlen kann man diese Bereiche kaum mehr klein nennen.
Als zusaetzliche Gemeinheit ist die Binaerdarstellung in Doubles auch nicht sonderlich umwandlungsfreundlich wenn man Dezimalzahlen verwendet.

kandl 26. Jul 2006 06:25

Re: probleme mit double
 
hallo leute,

danke an alle, habe das problem jetzt lösen können.

lg,kandl


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