Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Vergleich bei Double (https://www.delphipraxis.net/61789-vergleich-bei-double.html)

Surrounder 26. Jan 2006 13:33


Vergleich bei Double
 
Hallo Forum,

hab gerade ein komisches Problem in Delphi 7, ich vergleich 2 Variablen auf größer als und obwohl die gleich sind behauptet Delphi dass die eine größer ist als die andere :?:


Delphi-Quellcode:
for k := 0 to 50 do begin
   if ( val < ug ) then begin
      INC( Index[ k ] );
      break;
   end
   else if ( ug > og ) then begin
      INC( Index[ k ] );
      reak;
   end
   else begin
      ug := ug + kb;
   end;
end;
Die Variable og hat einen festen Wert von 87.5 und ug nähert sich diesem in 0.01 Schritten von unten her. Wenn ug den Wert 87.4 hat geht es noch, wenn ich dann ug um 0.01 Inkrementiere dann haben ja eigentlich beide den Wert 87.5 und der Debugger springt mir dann in die else if ( ug > og ), nur wenn beide gleich groß sind ist das ja falsch, oder mach ich was falsch :wall:


Edit: kb ist bei mir in dem Fall 0.01 und ug beginnt bei 87 wenn ich in die Schleife gehe

Khabarakh 26. Jan 2006 13:40

Re: Vergleich bei Double
 
Das ist in jeder Programmiersprache so und hängt mit der Ungenauigkeit der Fließkommazahlen zusammen: Viele Dezimalzahlen lassen sie in Binärdarstellung (ohne periodische Zahlen) nur angenähert darstellen. Näheres dazu (und nicht zu knapp) findest du im Forum.

Surrounder 26. Jan 2006 13:48

Re: Vergleich bei Double
 
Ja gut das ist mir schon bewusst, aber wieso sollte eine Programmiersprache die Zahl 87.5 auf verschiedene weissen darstellen? Hängt das damit zusammen dass ich der einen Variablen den Wert 87.5 zuweise ( 1 Nachkommastelle ) und bei der anderen mit zwei Nachkommastellen arbeite ( immer plus 0.01 )?

Khabarakh 26. Jan 2006 13:58

Re: Vergleich bei Double
 
Zitat:

Zitat von Surrounder
Hängt das damit zusammen dass ich der einen Variablen den Wert 87.5 zuweise ( 1 Nachkommastelle ) und bei der anderen mit zwei Nachkommastellen arbeite ( immer plus 0.01 )?

Nein, die FPU rechnet immer mit der gesamten Nachkommastellenanzahl. Beim Addieren summieren sich allerdings die Rundungsfehler auf, das Endergebnis stimmt nicht mehr mit 87.5 überein.

Surrounder 26. Jan 2006 14:05

Re: Vergleich bei Double
 
Hmm ok das erscheint mir logisch. Lustig find ich nur dass mir der Debugger das nicht anzeigt, oder sind die Fehler weit hinter den Nachkommastellen der Variable?

Ich hab mir als mögliche Lösung folgendes überlegt, bitte sag mir doch was Du davon hältst oder ob es einfacher geht bzw. obd das überhaupt eine Lösung ist:

Meine kleiste Schrittweite ist 0.01 und um das Nachkommaproblem zu lösen könnte ich meine ganzen Werte mit 100 multipilieren, dann habe ich immer einen Integer und hoffentlich das Problem nicht mehr?!

Kroko1999 26. Jan 2006 14:10

Re: Vergleich bei Double
 
Delphi-Quellcode:
function VglDouble (const Zahl1,Zahl2: Double);
const
  Epsilon: = 1E-10;
begin
  Result := Abs (Zahl1-Zahl2)<Epsilon;
end;

Khabarakh 26. Jan 2006 14:17

Re: Vergleich bei Double
 
Zitat:

Zitat von Surrounder
Hmm ok das erscheint mir logisch. Lustig find ich nur dass mir der Debugger das nicht anzeigt, oder sind die Fehler weit hinter den Nachkommastellen der Variable?

Jupp, die Fehler sind (anfangs) wirklich nicht groß (ein Bit reicht). Außerdem muss die ungenaue Binärzahl ja wieder ins Dezimalsystem umgerechnet werden, was Ungenauigkeiten hervorruft. Und schlussendlich wird der Debugger nie alle 15 Nachkommastellen anzeigen.
Zitat:

Meine kleiste Schrittweite ist 0.01 und um das Nachkommaproblem zu lösen könnte ich meine ganzen Werte mit 100 multipilieren, dann habe ich immer einen Integer und hoffentlich das Problem nicht mehr?!
Wenn du nur noch mit Integern rechnest, muss es so funktionieren. Du kannst allerdings auch den Typ Currency benutzen, der macht intern fast das Gleiche (Int64 als Festkommatyp mit 4 Nachkommastellen).

[edit]Der rote Kasten glänzt mal wieder durch seine Abstinenz :stupid: .
@Kroko: Gut, so kann man das Problem kurzzeitig umgehen :wink: .
[/edit]

Surrounder 26. Jan 2006 14:46

Re: Vergleich bei Double
 
Ok, danke ihr habt mir sehr geholfen :cheers:

Kroko1999 26. Jan 2006 15:12

Re: Vergleich bei Double
 
Zitat:

Zitat von Khabarakh
...

[edit]Der rote Kasten glänzt mal wieder durch seine Abstinenz :stupid: .
@Kroko: Gut, so kann man das Problem kurzzeitig umgehen :wink: .
[/edit]

auch langfristig, dann darf man eben nicht um 0.1 erhöhen, sondern muß jedes Mal
Delphi-Quellcode:
Zahll := Zahl+Anzahl*0.1;
erhöhen

Khabarakh 26. Jan 2006 15:24

Re: Vergleich bei Double
 
Ich habe zwar keine Ahnung, was Surrounder vorhat, aber er scheint wohl genaue Vergleiche zu benötigen. Und da bieten sich Festkommatypen in jedem Fall mehr als Fließkommazahlen + näherungsweises Vergleichen an.


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