Bedienungsanleitung für das GleitBitsDoubleApplet
1. Was kann man mit dem GleitBitsDoubleApplet machen?
Das GleitBitsDoubleApplet soll einen dabei unterstützen, die merkwürdigen Eigenschaften von Werten des Java-Typs double zu erforschen und eine anschauliche Vorstellung von Gleitpunktzahlen zu entwickeln. Das Applet zeigt jeweils einen double-Wert auf verschiedene Weise an:
-
Wie üblich als Dezimalbruch, der den double-Wert aber meist nur näherungsweise wiedergibt.
-
Als Dezimalbruch, der den double-Wert exakt wiedergibt (falls nötig mit ziemlich vielen Dezimalziffern).
-
Als eine Folge von 64 Bits.
Der Benutzer kann die einzelnen Bits des double-Wertes manipulieren (auf 1 bzw. 0 setzen), ein beliebiges Gleitpunktliteral eingeben und sehen, welchen Wert es bezeichnet, oder Namen wie infinity, max, min, minn, nan, nann, -infinity, -max etc. für bestimmte double-Werte eingeben, die Werte betrachten und manipulieren. Außerdem kann er zu einer double-Zahl
die nächste bzw. vorige Zahl berechnen lassen und ein paar einfache
Rechenoperationen anwenden (mal 2.0, mal 0.1, durch 2.0 und durch 0.1).
Die
mit diesem Applet gewonnenen Erkenntnisse gelten nicht nur für Java,
sondern auch für alle anderen Sprachen und Plattformen, die sich (wie
Java) an den ziemlich weit verbreiteten Gleitpunktstandard
IEEE-754-1985 halten.
2. Komponenten und Struktur des Applets
Das GleitBitsDoubleApplet enthält mehrere Etiketten, Knöpfe und Textfelder (JLabel-Objekte, JToggelButton- und JButton-Objekte bzw. JTextField- und JTextArea-Objekte), die in drei horizontalen "Streifen" angeordnet sind.
Im
obersten, grau hinterlegten Streifen, befinden sich vor allem 64
kleine, quadratische Knöpfchen (nummeriert von 63 bis 0), die die 64
Bits eines double-Wertes repräsentieren. Indem man diese Knöpfchen mit der Maus anklickt, kann man das entsprechende Bit auf 0 bzw. 1 setzen. Ein weisses Quadrat stellt eine 0 dar, ein schwarzes Quadrat eine 1.
Vorschlag:
Klicken Sie das Knöpfchen Nr. 0 an, so dass es schwarz wird (und lassen
Sie alle anderen Knöpfchen weiss). Dadurch haben Sie das Bit Nr 0 des double-Wertes
auf 1 gesetzt (und alle anderen Bits auf 0 gelassen). Beobachten Sie,
was sich dadurch alles ändert. Klicken Sie das Knöpfchen dann erneut
an, so dass es wieder weiss wird.
Im mittleren Streifen befinden sich 6 Textfelder namens Vorzeichen, Exponent zur Basis 2, 2 hoch Exponent
etc. In die drei weissen Textfelder können Sie Daten eingeben, die
drei grauen Textfelder sind nicht editierbar, d.h. sie dienen nur zum
Anzeigen von Informationen (nicht zur Eingabe).
Rechts neben den Textfeldern befinden sich 2 mal 6 Knöpfe, namens Alle Bits an, Alle Bits aus, Charakteristik-Bits an etc., mit denen man den aktuellen double-Wert manipulieren kann.
Das wichtigste Textfeld zum Eingeben von Daten ist das unterste, vor dem der Name Die Gleitpunktzahl im Ganzen steht. Im Folgenden wird es einfach als das Textfeld Die Gleitpunktzahl bezeichnet.
Vorschlag: Geben Sie in das Textfeld Die Gleitpunktzahl ein Gleitpunktliteral wie z.B. 1.5 oder 0.1 oder 123.456
ein, drücken Sie dann auf Return und beobachten Sie, was sich dadurch
ändert. Sie brauchen immer nur die neue Zahl einzugeben, der alte
Inhalt des Textfeldes wird automatisch gelöscht, wenn Sie das erste
Zeichen der neuen Zahl eintippen. Falsche Eingaben werden automatisch
durch 0.0 ersetzt.
Im untersten Streifen befindet sich nur ein (größeres, graues, nicht editierbares) Textfeld namens Alle Ziffern der Gleitpunktzahl (Kurzname: Alle Ziffern).
In diesem Textfeld wird die Gleitpunktzahl immer exakt als Dezimalburch
("mit all ihren Ziffern") dargestellt. Dagegen werden im Textfeld Die Gleitpunktzahl die meisten Zahlen (wie in Java-Programmen üblich) nur näherungsweise dargestellt.
3. Eingaben für das Textfeld Die Gleitpunktzahl
In das Textfeld Die Gleitpunktzahl können Sie Gleitpunktliterale wie 1.5 oder 0.1 oder 123.456 oder 987654321.0123456789 etc. eingeben. Wenn Sie eine Zahl eingeben, die sich nicht als double-Wert darstellen läßt, wird sie automatisch durch eine ("ähnliche") darstellbare Zahl ersetzt.
Sie können auch Zahlen in Exponential-Notation (z.B. 12.3e5 oder 12.3e-5 oder -12.3e5 oder -12.3e-5 etc.) oder Ganzzahlen (z.B. 123 oder +9876543210 oder -100000 etc.) oder Ganzzahlen mit Exponent (z.B. 1e10 oder 12e-10 oder -12e10 oder -12e-10 etc.) eingeben.
Einige (besoders wichtige) double-Werte haben Namen und anstelle einer Zahl können Sie auch einen dieser Namen eingeben. Hier die Namen und ihre Bedeutung: max (die größte double-Zahl), min (die kleinste double-Zahl, die größer als 0.0 ist), minn (die kleinste normalisierte double-Zahl, die größer als 0.0 ist. Was normalisierte und nicht-normalisierte double-Zahlen unterscheidet wird im Abschnitt 5. erläutert), infinity (ein double-Wert, der alle "zur großen" Zahlen repräsentiert), nan (eine double-Unzahl), nann (eine andere double-Unzahl). Vor jedem dieser Namen können Sie auch ein Vorzeichen + oder - notieren. Der Name -max bezeichnet die kleinste double-Zahl und der double-Wert -inifinty repräsentiert alle "zu kleinen" Zahlen, also alle, die kleiner als -max sind.
4. Die Knöpfe Nächste double-Zahl und Vorige double-Zahl
Zu einer rationalen (oder reellen) Zahl x gibt es keine "nächstgrößere" Zahl z (weil es zu jeder Zahl z, die größer als x ist, auch die Zahl y = (x+z)/2 gibt, die näher bei x liegt als z). Zu den meisten double-Zahlen gibt es aber eine nächstgrößere (und in die andere Richtung eine nächstkleinere) double-Zahl. Diese nächste bzw. vorige double-Zahl kann man sich anzeigen lassen, indem man auf den Knopf Nächste double-Zahl bzw. Vorige double-Zahl klickt.
Dabei heisst nächste so viel wie "weiter weg von der 0.0" und vorige bedeutet "näher hin zur 0.0".
Vorschlag: Geben Sie die Zahl 2e15 (in das Textfeld Die Gleitpunktzahl)
ein und lassen Sie sich die nächst und die übernächste
Zahl anzeigen. Wie groß ist der jeweilige Unterschied?
Vorschlag: Ebenso, aber mit der Zahl 8e15 (acht Billiarden).
Vorschlag: Ebenso, aber mit der Zahl 8e18 (acht Trillionen).
Frage: Welches ist die nächste Zahl nach max?
Frage: Welches ist die nächste Zahl nach -max?
Frage: Welches ist die vorige Zahl vor infinity?
Frage: Welches ist die vorige Zahl vor -infinity?
5. Charakteristik und Exponent
Die Charakteristik eines double-Wertes
ist 11 Bits lang (Bits 52 bis 62). Diese 11 Bits sollte man zuersteinmal
als eine (vorzeichenlose) 2-er-Zahl (Binärzahl) lesen, z.B. 00000000000 als 0, 01111111111 als 1023, 10000000000 als 1024, 10000001 als 1025, 11111111111 als 2047 etc.
Die Charakteristik 2047 "charakterisiert" die beiden unendlichen double-Werte infinity und -infinity (bei denen alle Manitssen-Bits den Wert 0 haben) und alle Unzahlen (bei denen mindestens ein Mantissen-Bit den Wert 1 hat).
Die
übrigen Charakteristiken (0 bis 2046) stellen negative und positive
Exponenten dar. Diesen Exponent erhält man, indem man von der
Charakteristik 1023 abzieht. Dadurch erhält man einen Exponenten zwischen -1023 und +1023. Dieser Exponent gilt zur Basis 2.
double-Werte mit einer Charakteristik 0 (d.h. mit einem Exponenten -1023) bezeichnet man als nicht-normalisiert, double-Werte mit einer Charakteristik zwischen 1 und 2046 (d.h. mit einem Exponent zwischen -1022 und +1023) als normalisiert.
6. Die Mantisse
Die Mantisse eines double-Wertes
ist 52 Bits lang (Bits 0 bis 51). Man interpretiert sie immer als einen
2-er-Bruch (Binärbruch), d.h. als eine 2-er-Zahl mit einem Punkt darin.
Allerdings interpretiert man die Mantisse eines nicht-normalisierten
Wertes (eines Wertes mit der Charakteristik 00000000000) ein bisschen anders als die Mantisse eines normalisierten Wertes (mit einer Charakterisitk zwischen 00000000001 und 11111111110).
Bei einer normalisierten Zahl denkt man sich eine 1. und dahinter die 52 Bits der Mantisse.
Bei
einer nicht-normalisierten Zahl denkt man sich den Punkt zwischen der
ersten und zweiten Ziffer der Mantisse (zwischen Bit 51 und 50).
Vorschlag: Geben Sie (in das Textfeld Die Gleitpunktzahl) die Zahl 6 ein. Sie sehen dann: Die Charakteristik hat den Wert 10000000001, dezimal also 1025 Daraus ergibt sich ein Exponent von 1025 - 1023 gleich 2. 2 hoch 2 ist 4.0. In der Mantisse hat nur das erste Bit (Bit 22) den Wert 1. Davor denken wir uns eine 1. so dass sich insgesamt der 2-er-Bruch 1.1 ergibt. Dem entspricht der 10-er-Bruch (Dezimalbruch) 1.5. Insgesamt ergibt sich 4.0 mal 1.5 ist gleich 6.0.
Vorschlag: Geben Sie die Zahl 10 ein und analysieren Sie (wie beim vorigen Vorschlag) wie diese Zahl als double-Wert dargestellt wird.
Vorschlag: Ebenso mit der Zahl 0.75.
7. Die Mal- und Durch-Knöpfe
Mit den zwei Mal- und den zwei Durch-Knöpfen kann man die aktuelle double-Zahl mit 2.0 bzw. 0.1 multiplizieren oder durch 2.0 bzw. 0.1
dividieren. In den meisten Fällen heben sich (mehrere) Multiplikationen
mit 2.0 und (ebensoviele) Divisionen durch 2.0 exakt auf, das
Endergebnis ist genau so groß wie der Ausgangswert. Bei
Multiplikationen mit 0.1 und Divisionen durch 0.1 ist das häufig nicht der Fall.
Vorschlag: Geben Sie die Zahl 0.1 ein, drücken Sie z.B. fünfmal auf den Knopf Mal 2.0 und danach fünfmal auf den Knopf Durch 2.0. Das Endergebnis sollte wieder genau 0.1 sein. Drücken Sie dann z.B. zweimal auf den Knopf Mal 0.1 und dann zweimal auf den Knopf Durch 0.1. Diesmal ist das Endergebnis nicht gleich 0.1.
Vorschlag:
Finden Sie weitere Fälle, in denen sich mehrfache Multiplikationen und
Divisionen exakt aufheben und Fälle, in denen das nicht passiert.
8. Werte kopieren
Die Inhalte aller Textfelder (insbesondere der Textfelder namens Die Ganzahl und Alle Ziffern) können Sie mit der üblichen Tastenkombination Strg-c in die Ablage kopieren und von dort in andere Dokumente einfügen.
An Verbesserungsvorschlägen und Kritik (negativer und positiver) bin ich immer interessiert. Email: grudeATtfh-berlin.de (wobei AT natürlich für @ steht). Viel Spaß und Erfolg mit dem GleitBitsDoubleApplet, Ulrich Grude.