![]() |
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? |
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:
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.
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. PS: double precision ist ![]() |
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 ... |
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. |
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. |
Re: Genaugkeit von Fließkommazahlen
In Wirklichkeit sind es 16 ^ e
|
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: |
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. |
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 ![]() Theoretisch müsste das doch auch mit Delphi möglich sein, ich weiß nur nicht, ob das Preis-/Leistungsverhältnis gut ist (wahrscheinlich nicht). |
Re: Genaugkeit von Fließkommazahlen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 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