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:
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.