Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi if (x>y) funktionier nicht richtig? (https://www.delphipraxis.net/77178-if-x-y-funktionier-nicht-richtig.html)

bixi400 15. Sep 2006 17:00


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:
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;
Wenn das Programm zum zweiten mal zu der Zeile y:=y+1E-3; stößt,
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?

Jürgen Thomas 15. Sep 2006 17:07

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

jfheins 15. Sep 2006 17:08

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 ;)

bixi400 15. Sep 2006 17:11

Re: if (x>y) funktionier nicht richtig?
 
Wie umgeht man dann diesen Fehler?

RavenIV 15. Sep 2006 17:15

Re: if (x>y) funktionier nicht richtig?
 
du machst folgendes:
Delphi-Quellcode:
if a - b < MinDifferenz then
begin
...
end;

mkinzler 15. Sep 2006 17:28

Re: if (x>y) funktionier nicht richtig?
 
Oder Runden der beiden Werte vor dem Vergleich.

alzaimar 15. Sep 2006 18:13

Re: if (x>y) funktionier nicht richtig?
 
Zitat:

Zitat von RavenIV
du machst folgendes:
Delphi-Quellcode:
if a - b < MinDifferenz then
begin
...
end;

Nee, lieber nicht, wenn nämlich a<<b (also z.B.: a=1, b=10) klappt das nämlich.

Schau mal in der Unit 'Math', da gibt es eine Funktion 'IsZero', die prüft, ob ein Wert 'hinreichend' nah an der 0 ist.

Nikolas 15. Sep 2006 18:18

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.

alzaimar 15. Sep 2006 22:55

Re: if (x>y) funktionier nicht richtig?
 
Zitat:

Zitat von Nikolas
oder auch 'isequal'.

:wall: Aber ich hab ja auch 'ne Brille :zwinker:

3_of_8 15. Sep 2006 23:04

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