Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 0 + 0.1 = ? Probleme mit dem Datentyp Single? (https://www.delphipraxis.net/31624-0-0-1-%3D-probleme-mit-dem-datentyp-single.html)

2kstealth 11. Okt 2004 22:34


0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Also ich habe ein kleines Proggy, und es tut nicht was ich will!

Das Problem ist folgendes:

Ich will eine Parabel errechnen lassen und da auf dieser Erde Schwerkraft herrscht,
muss ich diese mit einbeziehen.
Die Formel ist Wunderbar, einfach zu verstehen und überhauptnicht kompliziert!


Jetzt aber zum wirklichen Problem: :wall:

Ich habe eine Variable als single deklariert und werde diese nun Versuchen immer
um 0.1 zu erhöhen.
Die Parabel die ich einzeichnen will soll nun genau 8 Sekunden der Fluglaufbahn beschreiben.
Die Variable hat den Wert 0 zugewiesen bekommen.
Das Programm geht in eine Schleife die 80 mal durchlaufen wird, und bei jedem Durchlauf
soll die Variable nun um 0.1 erhöht werden.

Das ganze sieht nun SO aus:
------------------------------------
time := 0;
for i <= 80 do
begin
time := time + 0.1;
end;
------------------------------------
Hier sieht die Ausgabe von time nach dem ersten mal der Schleife schon so aus:

0,099999914546


Ich dachte mir, jeder macht mal Fehler, und habe es hiermit Probiert:
------------------------------------
time := 0;
for i <= 80 do
begin
time := StrToFloat(FloatToStrF((time + 0.1),ffGeneral,10,1);
end;
------------------------------------
Aber wie zu erwarten, kommt hierbei zwar alle fünf Durchläufe eine x,5 oder x,0 heraus, aber nie wirklich etwas
wie dieses gebilde hier:

0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
1.1

Kann mir BITTE einer sagen was ich hier falsch mache??? :wall: :cyclops: :gruebel: :?: :duck:

Ich danke euch im Vorraus und wünsche noch einen schönen Abend

Mit freundlichen Grüßen

StEaLtH

nailor 11. Okt 2004 22:40

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
man kann nicht jede zahl in einen double / float reinpacken. das ist ein realtive kompliziertes verfahren, wie das gespeichert wird. und wenn was nicht genau geht, wird der nächstbeste wert genommen.

und dann sag mir mal den genauen unterschied zwischen:

0,099999914546

und 0,1 ! der ist im prinzip nicht da!

2kstealth 11. Okt 2004 22:43

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Also erstmal danke das Sie so schnell geantwortethaben,

aber diese Antwort löst leider nit mein Problem...!

Tut mir leid... :?

Mfg

StEaLtH

P.S.: Ich brauche nunmal diese Werte, und kapiere nicht wieso das nicht funktioniert!

Wheelie 11. Okt 2004 22:57

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
du könntest doch einen integer immer um eins inkrementieren. wenn du auf dann den wert zugreifen musst, teilst du ihn durch 10.

Delphi-Quellcode:
...
var num: Integer;
begin
  Inc(num); // entspricht "num := num + 1;"
...

Schwabix 11. Okt 2004 23:14

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Hallo,

So sehr das schockieren mag, single ist nicht genauer!

Mit Extended ist der Fehler deutlich kleiner, aber trotzdem vorhanden. Das ist auch der Grund, warum Ausdrücke wie
if (mySingle = 0.0) then ...
riskant sind.
Man sollte statt dessen immer
if (mySingle - 0.0 < single_epsilon) then ...
schreiben und single_epsilon als Konstante als den kleinsten tolerierbaren Fehler definieren.

Zurück zum Problem: Ganzzahlarithmetik, falls möglich; oder Extended, falls der (geringe!) Fehler einer Single-Variablen zu groß ist.

Schwabix

nailor 11. Okt 2004 23:14

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Sag mir einen Grund, warum die 0,999999999999999999999999X schlimm ist!

Ob du jetzt von Anfang an in 0,5er Schritten rechnest, oder den Integer durch 10 teilst, ist gehüpft wie gesprungen. Und dass dabei beim Aufsummieren auf Dauer was verloren geht / was duzukommt, mag vielleicht schlimm sein, wenn man 1 Mrd Stellen von PI will, aber nicht wenn es um sowas unpräzises wie die Schwerkraft geht!

alcaeus 11. Okt 2004 23:18

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Hi Nailor,

Zitat:

Zitat von nailor
Sag mir einen Grund, warum die 0,999999999999999999999999X schlimm ist!

weil 0,9999999 für einen Menschen wohl gleich 1 ist, aber bei diesem Code:
Delphi-Quellcode:
var x: Single;
begin
  x := 0.999999999999999999999999999;
  if x = 1 then
    ShowMessage('Gleich');
end;
trotzdem keine MessageBox angezeigt wird. AFAIK ist der Weg über Ganzzahlaritmetik wohl der einzig mögliche. Dabei dürfte aber auch
Delphi-Quellcode:
x := (10*x+1)/10
funktionieren.

Greetz
alcaeus

dizzy 11. Okt 2004 23:34

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Hier mal den 26. Beitrag von oben 8).

Du wirst dein Problem wenn überhaupt nur mit Festpunktarithmetik lösen können, wenn es in jedem Fall 100%ig exakt sein muss. Wobei zugegebenermaßer mir auch schleierhaft ist, weshalb es so super-exakt sein muss ;).

Gruss,
Fabian

himitsu 12. Okt 2004 01:42

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Wenn dir 4 Stellen nach dem Komma reichen, dann kannst du auch Currency (siehe Delphi-Referenz durchsuchenReelle Typen) nehmen - das ist ein fertig skalierter Integer,
oder du skalierst selber 'nen Integertypen, wenn du 'ne andere Anzahl an Nachkommastellen brauchst.
Delphi-Quellcode:
var time: Currency;
time := 0;
for i = 0 to 79 do begin
  ...{time}...
  time := time + 0.1;
end;
oder
Delphi-Quellcode:
var time: Integer;
time := 0;
for i = 0 to 79 do begin
  ...{time/10}...
  time := time + 1;
end;


Oder du addierste einfach nicht mehr die Rundungsfehler:
statt
Delphi-Quellcode:
var time: Real;
time := 0;
for i = 0 to 79 do begin
  ...{time}...
  time := time + 0.1;
end;
nimmst du halt
Delphi-Quellcode:
var time: Real;
for i = 0 to 79 do begin
  time := i * 0.1;
  ...{time}...
end;


Du könntest dir aber einfach mal Extended ansehen, der hat nicht ganz so große Rechenprobleme ;)

Luckie 12. Okt 2004 01:45

Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
 
Zitat:

Zitat von alcaeus
weil 0,9999999 für einen Menschen wohl gleich 1 ist, aber bei diesem Code:
Delphi-Quellcode:
var x: Single;
begin
  x := 0.999999999999999999999999999;
  if x = 1 then
    ShowMessage('Gleich');
end;

Fließkommazahlen prüft man prinzipiell nicht auf Gleichheit!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr.
Seite 1 von 2  1 2      

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