AGB  ·  Datenschutz  ·  Impressum  







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

Vergleich bei Double

Ein Thema von Surrounder · begonnen am 26. Jan 2006 · letzter Beitrag vom 26. Jan 2006
Antwort Antwort
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#1

Vergleich bei Double

  Alt 26. Jan 2006, 13:33
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


Edit: kb ist bei mir in dem Fall 0.01 und ug beginnt bei 87 wenn ich in die Schleife gehe
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Vergleich bei Double

  Alt 26. Jan 2006, 13:40
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Vergleich bei Double

  Alt 26. Jan 2006, 13:48
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 )?
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: Vergleich bei Double

  Alt 26. Jan 2006, 13:58
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Vergleich bei Double

  Alt 26. Jan 2006, 14:05
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?!
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Vergleich bei Double

  Alt 26. Jan 2006, 14:10
Delphi-Quellcode:
function VglDouble (const Zahl1,Zahl2: Double);
const
  Epsilon: = 1E-10;
begin
  Result := Abs (Zahl1-Zahl2)<Epsilon;
end;
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Vergleich bei Double

  Alt 26. Jan 2006, 14:17
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 .
@Kroko: Gut, so kann man das Problem kurzzeitig umgehen .
[/edit]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Vergleich bei Double

  Alt 26. Jan 2006, 14:46
Ok, danke ihr habt mir sehr geholfen
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Vergleich bei Double

  Alt 26. Jan 2006, 15:12
Zitat von Khabarakh:
...

[edit]Der rote Kasten glänzt mal wieder durch seine Abstinenz .
@Kroko: Gut, so kann man das Problem kurzzeitig umgehen .
[/edit]
auch langfristig, dann darf man eben nicht um 0.1 erhöhen, sondern muß jedes Mal Zahll := Zahl+Anzahl*0.1; erhöhen
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#10

Re: Vergleich bei Double

  Alt 26. Jan 2006, 15:24
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:56 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