Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Genaugkeit von Fließkommazahlen (https://www.delphipraxis.net/151757-genaugkeit-von-fliesskommazahlen.html)

sarte 31. Mai 2010 15:17


Genaugkeit von Fließkommazahlen
 
Hallo,

ich habe eine kurze Frage. Extended (double precision) hat eine Genauigkeit von 19 Stellen und ist doch das genauste was es an Datentypen gibt. Was macht denn dann der Windows-Taschenrechner anders, wenn er bei Fließkommazahlen 33 Ziffern ausgibt?

himitsu 31. Mai 2010 15:27

Re: Genaugkeit von Fließkommazahlen
 
Wie/Was der rechnet weiß ich nicht,
aber die Genauigkeit stimmt schon.

Nach der 20-sten Stelle schleichen sich Fehler ein:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  e: Extended;
  i: Integer;

begin
  e := 1;
  e := e / 3;
  for i := 0 to 49 do
  begin
    if i mod 10 = 0 then Write(' ');
    Write(Trunc(e) mod 10);
    e := Frac(e) * 10;
  end;
  WriteLn;
  ReadLn;
end.
Wenn du mehr willst, dann wirst du wohl eine MathLib / Mathe-Bibliothek verwenden müssen, welche mit größeren Zahlen arbeiten kann, da sie keinen dieser kleinen Datentypen direkt verwendet.

PS: double precision ist Delphi-Referenz durchsuchenDouble ... Extended ist etwas mehr, aber soweit ich das gehört habe, will man zukünftig Extended für die Programmierer sperren (für diese gibt es dann nur noch Single und Double, wobei Extended nur noch als Systeminternes Rechenformat diehnen soll.

sarte 31. Mai 2010 15:43

Re: Genaugkeit von Fließkommazahlen
 
Hi,

danke für die schnelle Antwort.

Aber wie kommt es zu den falschen Ziffern. Ich hätte erwartet, dass nach der 20. Stelle nur noch 0en kommen. Wenn wir vorne was abschneiden, wie kommt er dann darauf hinten eine 4 anzufügen?
Ab der 73. Stelle folgen dann - warum auch immer - nur noch 0en ...

himitsu 31. Mai 2010 15:52

Re: Genaugkeit von Fließkommazahlen
 
In Extended werden nur die Werte so gespeichert, daß für die höchsten x Stellen eine genaue Darstelltung gewährleistet wird
und dahinter sind keine Inhalte definiert, so daß es sich ab da "quasi" um zufällige Werte handelt, welche z.B. aufgrund von Rundungsfehlern entstehen.

Neutral General 31. Mai 2010 15:53

Re: Genaugkeit von Fließkommazahlen
 
Das versteht man, wenn man den internen Aufbau von diesen Fließkommazahlen kennt.

Die sind nämlich generell so aufgebaut:

+/- m * 10^e

1 <= m < 2 (Je nach größe des Datentyps gibts mehr oder weniger Nachkommastellen)

Durch diese interne Darstellung können Zahlen halt ab einer gewissen Nachkommastelle nicht mehr genau dargestellt werden.

mkinzler 31. Mai 2010 15:58

Re: Genaugkeit von Fließkommazahlen
 
In Wirklichkeit sind es 16 ^ e

himitsu 31. Mai 2010 16:03

Re: Genaugkeit von Fließkommazahlen
 
Und dazu wird intern auch noch alles in 2-er-Potenzen verwaltet.

e als 2-Potenz
und m als 1 + 1 / 2-Potenz

1/3 läßt sich aber in diesem Format garnichtdarstellen, so daß die letzen 1-2 Bits schon einen falschen/gerundeten Wert darstellen.

Beim umwandeln in einen String wurden diese letzen Bits aber mit verrechnet, welches dann eine "nette" Zahlenreihe ergibt.

Wenn du einen Wert hast, welcher genau in dieses interne Format reinpaßt, dann bekommst du deine Unmassen an 0-en natürlich dort raus. :angel2:

sirius 31. Mai 2010 16:10

Re: Genaugkeit von Fließkommazahlen
 
Die Darstellung ist ein wenig "umständlicher" als hier dargestellt. Ich will aber jetzt nicht darauf eingehen, sondern eher aufs Prinzip.
Egal wie der Exponent aussieht, die Mantisse kann bspw folgendes Format haben:
1,0010110
Wenn man also sagt, die Mantisse hat eine maximale Länge von 8bit (und wir die führende 1 mitrechnen)
Dann errechnet sich obige Zahl zu
1*2^0 + 0*2^-1 + 0*2^-2 + 1*2^-3 + 0*2^-4 + 1*2^-5 + 1*2^-6 + 0*2^-7
=1,17188

Die nachfolgende mögliche Zahl ist
1,0010111
=1*2^0 + 0*2^-1 + 0*2^-2 + 1*2^-3 + 0*2^-4 + 1*2^-5 + 1*2^-6 + 1*2^-7
=1,17969

Wieviele Stellen Genauigkeit würdest du jetzt also im Dezimalen Bereich angeben bei einer Schrittweite von
0,0078125 = 1/128 = 2^-7

--> 2 Stellen Genauigkeit: Aber wie du siehst, ist bei den Zahlen 1,17188 und 1,17969 nicht nach zwei Stellen Schluss.

Mysterio08 31. Mai 2010 16:39

Re: Genaugkeit von Fließkommazahlen
 
Interessant dazu ist auch ein "Experiment" des französischen Mathematikers Fabrice Bellard: Er hat mit einem relativ durchschnittlichen Rechner Pi auf sage und schreibe 2,7 Billionen stellen angegeben.
"Hardware
Technische Daten des für die Berechnung benutzten PCs:
* Core-i7-Prozessor mit 2,93 GHz
* 6 GB* RAM
* 7,5 TB auf fünf Festplatten mit jeweils 1,5 TB (Seagate Barracuda 7200.11)"
Er hat die Zahl mithilfe der Binärdarstellung ermittelt und dann umgewandelt, näheres hier.

Theoretisch müsste das doch auch mit Delphi möglich sein, ich weiß nur nicht, ob das Preis-/Leistungsverhältnis gut ist (wahrscheinlich nicht).

himitsu 31. Mai 2010 16:45

Re: Genaugkeit von Fließkommazahlen
 
Zitat:

Zitat von Mysterio08
Theoretisch müsste das doch auch mit Delphi möglich sein, ich weiß nur nicht, ob das Preis-/Leistungsverhältnis gut ist (wahrscheinlich nicht).

Mit'm DEC kann man sich auch massenhaft Stellen von PI berechnen lassen ... die ersten paar Millionen Stellen wurden (soweit ich mich erinnere) innerhalb weniger Millisekunden errechnet, damals auf meinem alten 1,8 GHz-Athlon.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 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