Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Rechnen mit Extended Type


Schorsch99 - Fr 30.01.04 10:37
Titel: Rechnen mit Extended Type
Hi an Alle!

Folgendes Problem entsteht bei Rechenoperationen mit Variablen
vom Typ EXTENDED oder generell REAL, wenn diesen Variablen Bruchwerte zugeordnet werden: (Habe Delphi 6 Student Edition)

Kann mir irgendwer helfen? :roll:


Fall1:*************************************


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
a:extended;

begin
a:=-0.2;

if a=-0.2 then a:=1 else a:=2;
end;
end;


==> a=1 alles funktioniert richtig.


Fall2:*************************************


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
a:extended;

begin
a:=1-1.2;

if a=-0.2 then a:=1 else a:=2;
end;
end;


==> a=2 errechneter Wert a=1-1.2=-0.2 wird in der if-Bedingung nicht erkannt

Fall3:**************************************


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
a:extended;

begin
a:=1-1.2;

if a<-0.2 then a:=1 else a:=2;
end;
end;


===> a=1 errechneter Wert a=1-1.2=-0.2 erfüllt die if-Bedingung

*******************************************
Fazit: Beim Typ EXTENDED muss der errechnete Wert im Speicher kleiner sein als der im Quelltext angegebene
Frage: Wie kann man das beheben oder umgehen?

gruss, Georg

Moderiert von user profile iconKlabautermann: Verschoben & Delphi-Tags hinzugefügt.


Chatfix - Fr 30.01.04 10:52

ich würde meinen falsches Forum...


Delete - Fr 30.01.04 12:28

Fall 2 bzw. generell vergleicht man Fließkommazahlen nicht mit "=", da die Werte im Speicher gerundet vorliegen, da sie hardware technisch nie genau abgebildet werden können.


KidPaddle - Fr 30.01.04 14:26

Fall2:

Delphi-Quelltext
1:
if (abs(a - (-0.2)) < 0.00001then a:=1 else a:=2;                    


Wobei 0.00001 eine Konstante ist, ab der ein Wert als 0 angesehen wird und die Grenze hängt von der Genauigkeit ab, mit der Du rechnen willst.

Gruß
KidPaddle