| Diese Seite demonstriert, wie man das Verhalten von Programmen gegenüber Gleitkomma-Zahlen (oder Zahlen allgemein) analysieren kann. | Aus dem Verhalten der Programme kann ziemlich genau auf den Typ der verwendeten Gleitkomma-Variablen geschlossen werden. Das wird am Live-Beispiel ihres Browsers demonstriert. |
IEEE-754
|
Das Standardformat für Gleitkomma-Zahlen |
| Zahlenbereich | Analyse der größten darstellbaren Zahl |
| Kalkulation | Test des Zahlen-Bereichs mit einem Standard Kalkulations-Programm |
| Genauigkeit | Welche Differenz wird gerade noch erkannt ? |
| Kalkulation | Test der Genauigkeit mit einem Standard Kalkulations-Programm |
| Grundlagen | Darstellung von Gleitkomma-Zahlern mit Mantisse und Exponent |
Zahlenbereich - Die größte darstellbare Zahl |
|||
|
z(max) = 0
(ermittelt in 0 ms für 0 Schritte) |
||
|
Aus der Größe der maximal darstellbaren Zahl kann die
Speicherbreite des binären Exponenten ermittelt werden.
Vergleichen sie das Live-Ergebnis mit gängigen
Darstellungsformaten. Unten die Formel für die Speicherbreite des Exponenten. |
Ergebnis:Breite(Exponent) = 0 Bit
|
||
|
Algorithmus:
►
Vergrößern sie eine Zahl zmax=1 so lange,
wie das ohne Fehler möglich ist. In Javascript wird eine Variable
=Infinity gesetzt, noch bevor ein Fehler auftritt - Das wird daher zusätzlich
überprüft.)► Nach erfolgreichen Schritten wird das Ergebnis vorgemerkt, d.h. die Variable zmax wird auf den neuen größeren Wert gesetzt. ► Nach erfolglosen Schritten wird die Schrittweite f jeweils halbiert. ► Das Ziel ist erreicht, wenn die Schrittweite f=0 wird, oder wenn ein Sicherheitszähler (gegen Endlos-Schleifen, hier limit ) abläuft. Dieser Algorithmus wird in Javascript vorgestellt, funktioniert jedoch in jedem einschlägigen Programm, z.B. in → Kalkulations-Programmen, in VBA, C++, Java, usw. • Das Javascript-Programm ist im Quelltext dieser Webseite enthalten und wird von ihrem Browser Live ausgeführt. |
function try_zmax() {
var zmax=1;
var limit=10000; var test=0; var f=1; var run=true; var i=0; while((i<limit) && run) {
i++;
}
test=try_next_max(zmax,(1+f)); if(test>zmax) {zmax=test;} else {f=f/2;} if(f<=0) {run=false;} // Hier Ausgabe von zmax und i
}function try_next_max(t,f) {
try { t=t*f; }
}
catch (e) { t=0; } if(t=="Infinity") {t=0;} return t |
||
|
Berechnung der Anzahl von Bits für den Exponenten aus der größten
darstellbaren Zahl:
exp_bits = ln(2 * ( ln(zmax) / ln(2) ) ) / ln(2)
|
|||
| Wenn sie diejenige Zahl mit dem größten Betrag, jedoch mit negativem Vorzeichen ermitteln wollen, können sie dazu den gleiche Algorithmus mit einer kleinen Modifikation verwenden. | Das bringt allerdings keine neuen Erkenntnisse, denn der Zahlenbereich ist fast symmetrisch. | ||
Zahlenbereich - Test mit Kalkulations-Programmen |
|||||||||||||||||
|
Mit jedem Standard Kalkulations-Programm
(LibreOffice,
OpenOffice,
MS-Excel, ...)
kann man die Grenze des verwendbaren Zahleb-Bereichs leicht selbst demonstrieren. • In Spalte A werden Test-Zahlen n berechnet, die in jeder Zeile größer werden (hier um den Faktor 10). Sie brauchen die Formel nur 1mal einzugeben und können dann die Zelle A3 nach unten bis Zeile 320 ausfüllen. |
Demonstration des maximalen Werte-Bereichs:
|
||||||||||||||||
Ergebnis● Die Berechnung funktioniert bis Zeile 310● Der von gängigen Kalkulations-Programmen verwendete → Typ double bietet einem binären 10 Bit Exponenten. Damit ist der Wert der größten darstellbaren Zahl mit ca. 1E+308.3 festgelegt. |
Sie können die Grenze optional auch genauer berechnen: Beginnen sie z.B. bereits in Zelle A2 mit einer großen Zahl und vergrößern sie diese in den folgenden Zeilen um einen kleineren Faktor, z.B. =A2*2 |
||||||||||||||||
Genauigkeit - Welche Differenz ist gerade noch unterscheidbar ? |
|||
|
dif(min) = 0
(ermittelt in 0 ms für 0 Schritte) |
||
|
Berechnung der Anzahl von Bits für die Mantisse aus der Auflösung (minimalen
relativen Differenz zwischen 2 Zahlen):
mant_bits = -ln(dif_min) / ln(2)
Mit einem Trick (→
Hidden Bit) kann man in der PC-Praxis 1 Bit der Mantisse ohne Verlust der
Genauigkeit einsparen.
|
Ergebnis:Breite(Mantisse) = 0 Bit
|
||
|
Algorithmus:
►
Die Variable g wird auf die anfängliche
Schrittweite g=0.5 gesetzt.► Die anfängliche Differenz wird auf f=1 gesetzt. ► In einer Schleife wird die Differenz dif zwischen den beiden 'ähnlichen' Zahlen z1=1 und z2=1+f untersucht. ► Wenn dif>0, dann wird f mit der Schrittweite g verkleinert, und die 'erfolgreiche' Differenz wird in zdif gespeichert. ► Wenn dif<=0, dann wird f wieder vergrößert, jedoch nur bis maximal zur letzten 'erfolgreichen' Differenz zdif ► Wenn nach diesen Regeln keine Änderung von f mehr möglich ist, wird die Schleife abgebrochen. • Das Javascript-Programm ist im Quelltext dieser Webseite enthalten und wird von ihrem Browser Live ausgeführt. |
function try_zdif() {
var zdif=1;
var limit=500; var i=0; var f=1; var g=0.5; var z2=1; var dif=0; var run=true; while((i<limit) && run) {
i++;
}
z2=1+f; dif=z2-1; if(dif>0) {
zdif=dif;
}f=f*g; else {
g=g+0.01;
}
if(g>=1) {run=false;} f=zdif*g; // Hier Ausgabe von zdif und i
}
|
||
Genauigkeit - Test mit Kalkulations-Programmen |
|||||||||||||||||||||||||||||
|
Mit jedem Standard Kalkulations-Programm
(LibreOffice,
OpenOffice,
MS-Excel, ...)
kann man die Grenze der erreichbaren Genauigkeit leicht selbst demonstrieren. • In Spalte A werden Test-Zahlen n berechnet, die in jeder Zeile größer werden (hier um den Faktor 10). • In Spalte B wird die Zahl +1 zur Test-Zahl n addiert. • In Spalte C wird die Differenz der beiden Zahlen berechnet. Sie brauchen jede Formel nur 1mal einzugeben und können dann die Zellen A3 bzw. B2 und C2 nach unten bis Zeile 22 ausfüllen. |
Demonstration der maximalen Genauigkeit:
|
||||||||||||||||||||||||||||
Ergebnis● Das in Spalte C berechnete Ergebnis ist - wie erwartet - die Zahl 1● Wenn jedoch die Test-Zahlen groß genug werden, dann ist die Unterscheidung zwischen n und n+1 nicht mehr möglich: Von Zeile 18 abwärts ist das Ergebnis die Zahl 0 Das ist kein Fehler des Kalkulations-Programms sondern die Grenze der mit einer Mantisse von 52+1 Bit (→ Typ double) erreichbaren Genauigkeit. |
Sie können die Grenze optional auch genauer berechnen: Wenn sie den Faktor *10 in Spalte A durch *2 ersetzen, dann wird die Grenze in Zeile 51 erreicht. |
||||||||||||||||||||||||||||
|