![]() |
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 |
Re: probleme mit double
Hi!
Im Sinne derer, die später ein ähnliches Problem haben, wäre es prima, wenn du uns sagst, wie du es lösen konntest! Ciao Frederic |
Re: probleme mit double
Zitat:
![]() (Das PDF lesen) |
Re: probleme mit double
Zitat:
Delphi-Quellcode:
oder ob man
if not MyBool then
...
Delphi-Quellcode:
macht ist egal und führt zum gleichen Ergebnis:
if MyBool = false then
... ![]() Ist zwar eine umständliche Boolsche Auswertung aber immer noch eine korrekte und PASCAL konforme Auswertung die immer richtig umgesetzt wird. Es ist egal ob man dabei den Typen Booelan, WordBool, Bool, ByteBool oder LongBool benutzt. [edit] :mrgreen: Sollte natürlich nicht heißen: "Macht ist egal und führt zum gleichen Ergebnis"[/edit] |
Re: probleme mit double
Hi
:oops: , ok an dieser Stelle stimmt es tatsächlich. Ich hatte im Hinterkopf, dass man es für True und False nicht machen sollte, bei False geht es allerdings doch. Sinnvollerweise sollte man sich aber die andere Methode angewöhnen, dann macht man es bei True auch nicht falsch! Ciao, Frederic |
Re: probleme mit double
Wenn man für sich schreibt, kann man sowieso machen, was man will.
Aber wenn man später mal im Team arbeitet und Code auch von anderen gelesen und verstanden werden muss, dann ist so ein =false kein guter Stil. Das nur als Anmerkung. |
Re: probleme mit double
Und ich habe eh andere Erfahrungen gemacht, was die auswertung mit =true und =false angeht.
Hatte mal das Problem, das der Vergleich mit =True eben nicht zum selben Ergebnis führte (beim =False ist das aber tatsächlich vollkommen egal, ob man's mit, oder ohne diesem schreibt) |
Re: probleme mit double
Hi!
Der Vergleich mit True kann auch zu fehlerhaften Ergebnissen führen, das steht fest: Damit wir jetzt hier nicht vom Thema abkommen, verweise ich auf: ![]() Ciao, Frederic |
Re: probleme mit double
Zitat:
Delphi-Quellcode:
[edit]Sorry, habe mich hinreissen lassen[/edit]
if not (BoolVar = True) then
begin Result := False; end else begin Result := True; end; |
Re: probleme mit double
Zitat:
|
Re: probleme mit double
:lol:
Zitat:
Delphi-Quellcode:
oder
if BoolVar = False then
begin Result := False; end else begin Result := True; end;
Delphi-Quellcode:
Result := not (BoolVar = False);
Result := BoolVar <> False; |
Re: probleme mit double
Hi!
Ich bitte nochmals darum, beim Thema zu bleiben! :warn: :wink: Ciao Frederic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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