Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - EXTENDED-Zähler in Loops


Schorsch99 - Fr 30.01.04 21:43
Titel: EXTENDED-Zähler in Loops
Hi an Alle!

Wer kann mich über folgendes Mysterium aufklären? :shock:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject); 

var
a: integer;
b:extended;

begin
b:=-1;
for a:=1 to 50 do
   begin
   b:=b+0.2;
   end;
end;


Problem: Nach der 5. Iteration der a-Schleife hat b nicht den Wert 0 sondern
je nach Initialwert von b eine wirre Zahl (bei Startwert b:=-1 z.B. -2,71050543121376E-20), läuft aber ab der 6.
Wiederholung der a-Schleife wieder normal mit 0.2, 0.4, 0.6, ... weiter.
Wie kann das sein???

Wäre um eine Lösung Dankbar!

Gruss, Schorsch99.

Moderiert von user profile iconPeter Lustig: Delphi-Tags hinzugefügt


Christian S. - Fr 30.01.04 21:55

Hallo!

Dies liegt an der endlichen Genauigkeit der Zahlendarstellung im Rechner. So kann die Zahl 0,2 nicht exakt dargestellt werden. Wenn Du zu -1 fünf Mal nur ungefähr 0,2 addierst, kommst Du ungefährt zur Null. Aber eben nicht ganz.

Das diese Ungenauigkeit nur bei der Zahl nahe der Null zum Vorscheinen kommt, kann daran liegen, dass für sehr kleine Zahlen eine subnormale Darstellung verwendet wird, welche eine größere Genauigkeit zulässt. Das ist allerdings nur eine Vermutung!

MfG
Peter