AGB  ·  Datenschutz  ·  Impressum  







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

probleme mit double

Ein Thema von kandl · begonnen am 25. Jul 2006 · letzter Beitrag vom 26. Jul 2006
Antwort Antwort
Seite 1 von 3  1 23      
kandl

Registriert seit: 25. Jul 2006
4 Beiträge
 
#1

probleme mit double

  Alt 25. Jul 2006, 11:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: probleme mit double

  Alt 25. Jul 2006, 11:35
Ohne Code kann dir bestimmt keiner helfen.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#3

Re: probleme mit double

  Alt 25. Jul 2006, 11:37
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
Frederic Kerber
  Mit Zitat antworten Zitat
kandl

Registriert seit: 25. Jul 2006
4 Beiträge
 
#4

Re: probleme mit double

  Alt 25. Jul 2006, 11:41
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
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#5

Re: probleme mit double

  Alt 25. Jul 2006, 11:42
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#6

Re: probleme mit double

  Alt 25. Jul 2006, 11:45
Hi!

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
Frederic Kerber
  Mit Zitat antworten Zitat
kandl

Registriert seit: 25. Jul 2006
4 Beiträge
 
#7

Re: probleme mit double

  Alt 25. Jul 2006, 12:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

Re: probleme mit double

  Alt 25. Jul 2006, 15:34
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: probleme mit double

  Alt 25. Jul 2006, 17:36
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.
  Mit Zitat antworten Zitat
kandl

Registriert seit: 25. Jul 2006
4 Beiträge
 
#10

Re: probleme mit double

  Alt 26. Jul 2006, 07:25
hallo leute,

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

lg,kandl
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 07:48 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