![]() |
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 |
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! |
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! |
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;" ... |
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 |
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! |
Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
Hi Nailor,
Zitat:
Delphi-Quellcode:
trotzdem keine MessageBox angezeigt wird. AFAIK ist der Weg über Ganzzahlaritmetik wohl der einzig mögliche. Dabei dürfte aber auch
var x: Single;
begin x := 0.999999999999999999999999999; if x = 1 then ShowMessage('Gleich'); end;
Delphi-Quellcode:
funktionieren.
x := (10*x+1)/10
Greetz alcaeus |
Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
![]() 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 |
Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
Wenn dir 4 Stellen nach dem Komma reichen, dann kannst du auch Currency (siehe
![]() oder du skalierst selber 'nen Integertypen, wenn du 'ne andere Anzahl an Nachkommastellen brauchst.
Delphi-Quellcode:
oder
var time: Currency;
time := 0; for i = 0 to 79 do begin ...{time}... time := time + 0.1; end;
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:
nimmst du halt
var time: Real;
time := 0; for i = 0 to 79 do begin ...{time}... time := time + 0.1; end;
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 ;) |
Re: 0 + 0.1 = ? Probleme mit dem Datentyp Single?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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