![]() |
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:
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:
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; Edit: kb ist bei mir in dem Fall 0.01 und ug beginnt bei 87 wenn ich in die Schleife gehe |
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.
|
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 )?
|
Re: Vergleich bei Double
Zitat:
|
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?! |
Re: Vergleich bei Double
Delphi-Quellcode:
function VglDouble (const Zahl1,Zahl2: Double);
const Epsilon: = 1E-10; begin Result := Abs (Zahl1-Zahl2)<Epsilon; end; |
Re: Vergleich bei Double
Zitat:
Zitat:
[edit]Der rote Kasten glänzt mal wieder durch seine Abstinenz :stupid: . @Kroko: Gut, so kann man das Problem kurzzeitig umgehen :wink: . [/edit] |
Re: Vergleich bei Double
Ok, danke ihr habt mir sehr geholfen :cheers:
|
Re: Vergleich bei Double
Zitat:
Delphi-Quellcode:
erhöhen
Zahll := Zahl+Anzahl*0.1;
|
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