AGB  ·  Datenschutz  ·  Impressum  







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

if (x>y) funktionier nicht richtig?

Ein Thema von bixi400 · begonnen am 15. Sep 2006 · letzter Beitrag vom 15. Sep 2006
Antwort Antwort
Benutzerbild von bixi400
bixi400

Registriert seit: 19. Mai 2003
179 Beiträge
 
Turbo Delphi für Win32
 
#1

if (x>y) funktionier nicht richtig?

  Alt 15. Sep 2006, 17:00
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?
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

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

  Alt 15. Sep 2006, 17:07
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

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

  Alt 15. Sep 2006, 17:08
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
  Mit Zitat antworten Zitat
Benutzerbild von bixi400
bixi400

Registriert seit: 19. Mai 2003
179 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 15. Sep 2006, 17:11
Wie umgeht man dann diesen Fehler?
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 15. Sep 2006, 17:15
du machst folgendes:
Delphi-Quellcode:
if a - b < MinDifferenz then
begin
...
end;
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 15. Sep 2006, 17:28
Oder Runden der beiden Werte vor dem Vergleich.
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

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

  Alt 15. Sep 2006, 18:13
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#8

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

  Alt 15. Sep 2006, 18:18
oder auch 'isequal'. Liest sich vielleicht später etwas einfacher, als das iszero, bei dem man noch denken muss, was es eigentlich amcht.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

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

  Alt 15. Sep 2006, 22:55
Zitat von Nikolas:
oder auch 'isequal'.
Aber ich hab ja auch 'ne Brille
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 15. Sep 2006, 23:04
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...
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  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 20:59 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