AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi 0 + 0.1 = ? Probleme mit dem Datentyp Single?
Thema durchsuchen
Ansicht
Themen-Optionen

0 + 0.1 = ? Probleme mit dem Datentyp Single?

Ein Thema von 2kstealth · begonnen am 11. Okt 2004 · letzter Beitrag vom 12. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
2kstealth
(Gast)

n/a Beiträge
 
#1

0 + 0.1 = ? Probleme mit dem Datentyp Single?

  Alt 11. Okt 2004, 22:34
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:

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???

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

Mit freundlichen Grüßen

StEaLtH
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#2

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

  Alt 11. Okt 2004, 22:40
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!
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
2kstealth
(Gast)

n/a Beiträge
 
#3

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

  Alt 11. Okt 2004, 22:43
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!
  Mit Zitat antworten Zitat
Wheelie

Registriert seit: 21. Okt 2003
Ort: Dresden
177 Beiträge
 
#4

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

  Alt 11. Okt 2004, 22:57
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;"
...
  Mit Zitat antworten Zitat
Schwabix

Registriert seit: 11. Okt 2004
Ort: Aachen
9 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 11. Okt 2004, 23:14
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
Markus
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#6

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

  Alt 11. Okt 2004, 23:14
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!
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#7

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

  Alt 11. Okt 2004, 23:18
Hi Nailor,

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 x := (10*x+1)/10 funktionieren.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#8

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

  Alt 11. Okt 2004, 23:34
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.155 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 12. Okt 2004, 01:42
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

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

  Alt 12. Okt 2004, 01:45
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!
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:20 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