![]() |
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 |
Re: probleme mit double
Ohne Code kann dir bestimmt keiner helfen.
|
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 |
Re: probleme mit double
wusste nicht inwieweit man code posten darf.
naja.
Delphi-Quellcode:
lg,kandl
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; |
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:
Epsilon gibt dabei die Genauigkeit an, auf die du die Gleichheit überprüfen möchtest.
function DoublesEqual(a, b: double): boolean;
const epsilon = 0.000001; begin result := abs(a - b) < epsilon; end; greetz Mike |
Re: probleme mit double
Hi!
Zitat:
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 |
Re: probleme mit double
hi,
Zitat:
dies sollte aber nicht sein. deshalb brauche ich die 2. bedingung auch noch. Zitat:
Delphi-Quellcode:
dann führt er den if teil nicht aus.(punkte[i,param]ist aber(0.40,-0.0036,0.34) und param=1
if((punkte[i,param] =minimum)and (position_min<3)and
(istBereitsVektor(i,position_min,e1richtungsvekt)=false))then demzufolge müsste er den wert -0.0036 nehmen und mit minimum(ist zu dem zeitpunkt auch -0.0036) vergleichen. |
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. |
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. |
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 17:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz