![]() |
if (x>y) funktionier nicht richtig?
Hi!
Ich habe ein Programm geschrieben das nicht genau das gemacht hat was ich wollte. Nach längerem Fehler suchen bin ich auf folgendes gestoßen:
Delphi-Quellcode:
Wenn das Programm zum zweiten mal zu der Zeile y:=y+1E-3; stößt,
var x,y:Real;
begin x:=0; y:=1E-3; while (x<1) do begin if (x>y) then begin y:=y+1E-3; end; x:=x+2E-4; end; ist x=0,002 und y=0,002 also x=y. Warum passiert das? Wenn x=y dann gilt doch nicht x>y. Und was ich noch seltsamer finde: Wenn das Programm zum ersten mal zu dieser Zeile gelangt ist scheint ja alles zu funktionieren! Warum ist das so? |
Re: if (x>y) funktionier nicht richtig?
Hallo,
ich vermute sehr stark, dass es mit der internen Verarbeitung von real-Typen zu tun hat, nämlich mit der Genauigkeit von Zahlen und Berechnungen. In dieser Richtung solltest Du suchen. Gruß Jürgen |
Re: if (x>y) funktionier nicht richtig?
Weil real Werte nicht exakt genau sind, da si nicht mit Zehnerpotenzen arbeiten, sondern mit 2er Potenzen.
Deshalb kann es sein dass deine beien 0.002-er Werte im Speicher etwas anders dargestellt werden, und dann der eine etwas größer ist, als der andere ... Man soll ja auch Gleitkommazahlen nicht mit = vergleichen ;) |
Re: if (x>y) funktionier nicht richtig?
Wie umgeht man dann diesen Fehler?
|
Re: if (x>y) funktionier nicht richtig?
du machst folgendes:
Delphi-Quellcode:
if a - b < MinDifferenz then
begin ... end; |
Re: if (x>y) funktionier nicht richtig?
Oder Runden der beiden Werte vor dem Vergleich.
|
Re: if (x>y) funktionier nicht richtig?
Zitat:
Schau mal in der Unit 'Math', da gibt es eine Funktion 'IsZero', die prüft, ob ein Wert 'hinreichend' nah an der 0 ist. |
Re: if (x>y) funktionier nicht richtig?
oder auch 'isequal'. Liest sich vielleicht später etwas einfacher, als das iszero, bei dem man noch denken muss, was es eigentlich amcht.
|
Re: if (x>y) funktionier nicht richtig?
Zitat:
|
Re: if (x>y) funktionier nicht richtig?
Ich würde übrigens vorher noch ein abs() drüberjagen. Ansonsten funktioniert das nicht, wenn b-a>MinDifferenz. ;)
Bsp: MinDifferenz=0,001 a=42 b=47 a-b=-5 -5<0,001 -5<MinDifferenz EDIT: Hoppala, das stand da schon. Ich sollte lieber ganz schnell schlafen gehen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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