AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Real, Single, Double = ungenau!?

Ein Thema von Patrick · begonnen am 7. Apr 2005 · letzter Beitrag vom 7. Apr 2005
Antwort Antwort
Seite 1 von 2  1 2      
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 10:10
Hallo,

So was komisches ist mir noch nicht untergekommen.
Führt man den folgenden Quellcode mit i = Real, Single oder Double aus rechnet er schlicht und einfach falsch.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i : single;
begin
i:=0;
repeat
  i:=i+0.1;
  ListBox1.Items.Add(FloattoStr(i));
until i>100;
end;
Mit Extendend hingegen funktioniert es. Wahrscheinlich "noch", wenn ich weiter rechnen würde, habe ich bestimmt den gleichen fehler.

Also was ist das, kann ich diesen Fehler irgendwie verhindern?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
PRehders

Registriert seit: 31. Okt 2003
Ort: Hamburg
42 Beiträge
 
#2

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 10:28
Hallo,
den Fehler kannst du letztendlich nicht verhindern; 0.1 sieht für uns (Dezimalrechner) zwar recht hübsch simpel aus, ist aber für einen (normalen) Computer (binär) eine kleine Katastrophe und lässt sich nur näherungsweise darstellen. Daher addierst du in der Schleife die Ungenauigkeit in der Darstellung immer weiter auf, bis es dann richtig sichtbar wird.
Auch die Verwendung von Extended bringt dir nur zeitweise Erleichterung.
Das ist auch der Grund für die Regel, niemals(!) solche Werte auf Gleichheit abzufragen, sondern immer mit Schranken zu arbeiten, also z.B.
if RealWert >= -0.1 AND RealWert <= +0.1 ... statt
if RealWert = 0.0 ... Bis dann

Peter
Peter Rehders
Man sollte niemanden ernst nehmen, der sich ernst nimmt.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 10:35
Man bedenke das die reellen Zahlen ueberabzaehlbar unendlich sind. Alle Datentypen koennen aber nur einen endlichen Ausschnitt davon abbilden. Es gibt also immense Verluste bei der Erfassung aller Zahlen.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#4

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 10:42
ich dachte immer, real, double, usw. sind imprinzipo nichts anderes als int-werte, nur dass die kommastelkle gespeichert ist (bei Fließkommavariablen) oder das komma an einer festen stelle ist (bei festkommavariablen).
Wenn dies so wäre, würde der Test aber funzen. Kann mir jemand erklären, wie das läuft?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
PRehders

Registriert seit: 31. Okt 2003
Ort: Hamburg
42 Beiträge
 
#5

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 10:54
Hallo,

solche Zahlen haben nichts mit Integern zu tun, die interne Darstellung ist vollkommen anders. Aber du kannst es dir (sehr simpel) so vorstellen:
Im Dezimalsystem steht direkt hinter dem Komma die Zehntelstelle, danach kommt die Hundertstel usw. also 10 hoch -1, 10 hoch -2 ...
Im Binärsystem ist es eigentlich genauso: Hinter dem Komma (wo immer das auch steht bzw. sich gedacht wird) steht die Halbstelle (2 hoch -1), danach folgt die Vietelstelle (2 hoch -2) usw.
Jetzt kannst du auch schon sehen, warum ein Computer solche Probleme mit 0.1 (dezimal!) hat: Versuche mal, diesen Wert durch die Summe binärer Bruchzahlen darzustellen. Das artet aus! Und es gelingt dir nie! Du kannst dich nur dem Wert nähern. Und das ist die Ursache für das Problem hier.
Wenn man einen Datentyp mit sehr vielen Binärstellen nimmt, kann man noch einigermaßen annähern, aber irgendwann kommt der Darstellungsfehler durch.
Auf Computern werden solche Bruchzahlen so dargestellt, dass man einige Bits für die Dimension benutzt (also 2 hoch x) und den Rest für die eigentliche Zahl, wobei man definiert, dass diese immer als 0.yyyyy dargestellt wird. Das "0." kann man dann also weglassen.
Einige Bits werden auch benutzt, um besondere Zahlen zu kennzeichnen, wie "Unendlich" oder "NotANumber" (heisst wirklich so!), oder Sonderbedingungen in der dargestellten Zahl.

Bis dann

Peter
Peter Rehders
Man sollte niemanden ernst nehmen, der sich ernst nimmt.
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#6

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 11:00
@yankee
Schau dir mal diesen Thread an -> http://www.delphipraxis.net/internal...light=mantisse

Da siehst du, wie Gleitkommazahlen gespeichert werden.

grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#7

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 11:12
Hallo!

Ich lese grad den Thread hier. Und da entsteht bei mir die Frage, mit welchen Verfahren in der Wissenschaft solche Fehler eliminiert werden. Wie hoch ist die maximal erreichbare Rechengenauigkeit? Aus der Elektronik weiß ich, das es Verfahren der Fehlerrechnung gibt. Zum Beispiel ist der Meßfehler eines A/D Wandlers bekannt und wird in einer Korrekturrechnung eliminiert. Auf den PC übertragen hiße das ja, das generell überall mit Extended gerechnet wird, oder mit Double...., Wichtig ist, das der Fehler immer gleich groß ist, damit er rausgerechnet werden kann.

es grüßt schöni
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 11:27
Fehlerrechnung ist eine Wissenschaft fuer sich.
Die gaengigste Berechnung ist Fast Fourier Transformation.
Das ist eine Matrixbrerechnung und es gibt nicht allzuviele Spezialisten
(und ich bin definitiv keiner) die wissen wie man genaue Ergebnisse bekommt.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

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

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 11:45
Zitat von Sanchez:
@yankee
Schau dir mal diesen Thread an -> http://www.delphipraxis.net/internal...light=mantisse

Da siehst du, wie Gleitkommazahlen gespeichert werden.
Und hier in ganz ausführlich
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
PRehders

Registriert seit: 31. Okt 2003
Ort: Hamburg
42 Beiträge
 
#10

Re: Real, Single, Double = ungenau!?

  Alt 7. Apr 2005, 12:36
Zitat von schöni:
Hallo!

Aus der Elektronik weiß ich, das es Verfahren der Fehlerrechnung gibt. Zum Beispiel ist der Meßfehler eines A/D Wandlers bekannt und wird in einer Korrekturrechnung eliminiert. Auf den PC übertragen hiße das ja, das generell überall mit Extended gerechnet wird, oder mit Double...., Wichtig ist, das der Fehler immer gleich groß ist, damit er rausgerechnet werden kann.
Hallo,

das hat leider mit der Darstellungsgenauigkeit nicht unbedingt etwas zu tun. Das Thema ist hier, dass bestimmte Dezimalzahlen nicht binär dargestellt werden können. Es tritt ein Darstellungsfehler auf, der sich auch nicht eliminieren lässt, da er nicht bekannt ist. In der Messtechnik geht man in einigen Bereichen davon aus, dass sich ein immer gleich gearteter Messfehler ergibt, der dan durch Differenzbildung verschwindet; das ist hier aber nicht der Fall. Manche Zahlen lassen sich exakt darstellen, manche nicht. Der tatsächliche Inhalt einer Real-Variable, egal welche Grösse (= Genauigkeit) sagt ja nichts darüber aus, welcher Wert "eigentlich gemeint" war.
Die Ungenauigkeit ist vorhanden, sie geht auch nicht weg, wenn man es aber weiss, kann man damit umgehen.

Bis dann

Peter
Peter Rehders
Man sollte niemanden ernst nehmen, der sich ernst nimmt.
  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 15:35 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