Bedienungsanleitung für das GleitBitsFloatApplet

1. Was kann man mit dem GleitBitsFloatApplet machen?

Das GleitBitsFloatApplet soll einen dabei unterstützen, die merkwürdigen Eigenschaften von Werten des Java-Typs float zu erforschen und eine anschauliche Vorstellung von Gleitpunktzahlen zu entwickeln. Das Applet zeigt jeweils einen float-Wert auf verschiedene Weise an:
Der Benutzer kann die einzelnen Bits des float-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 float-Werte eingeben, die Werte betrachten und manipulieren. Außerdem kann er zu einer float-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 GleitBitsFloatApplet 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 32 kleine, quadratische Knöpfchen (nummeriert von 31 bis 0), die die 32 Bits eines float-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 float-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 float-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 Dezimalbruch ("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 float-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) float-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 float-Zahl), min (die kleinste float-Zahl, die größer als 0.0 ist), minn (die kleinste normalisierte float-Zahl, die größer als 0.0 ist. Was normalisierte und nicht-normalisierte float-Zahlen unterscheidet wird im Abschnitt 5. erläutert),  infinity (ein float-Wert, der alle "zur großen" Zahlen repräsentiert), nan (eine float-Unzahl), nann (eine andere float-Unzahl). Vor jedem dieser Namen können Sie auch ein Vorzeichen + oder - notieren. Der Name -max bezeichnet die kleinste float-Zahl und der float-Wert -inifinty repräsentiert alle "zu kleinen" Zahlen, also alle, die kleiner als -max sind.

4. Die Knöpfe Nächste float-Zahl und Vorige float-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 float-Zahlen gibt es aber eine nächstgrößere (und in die andere Richtung  eine nächstkleinere) float-Zahl. Diese nächste bzw. vorige float-Zahl kann man sich anzeigen lassen, indem man auf den Knopf Nächste float-Zahl bzw. Vorige float-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  4e6 (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 16e6 (sechzehn Millionen).
Vorschlag: Ebenso, aber mit der Zahl 16e9 (sechzehn Milliarden).
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 float-Wertes ist 8 Bits lang (Bits 23 bis 30). Diese 8 Bits sollte man zuersteinmal als eine (vorzeichenlose) 2-er-Zahl (Binärzahl) lesen, z.B. 00000000 als 0, 01111111 als 127, 10000000 als  128, 10000001 als 129,  11111111 als 255 etc.

Die Charakteristik 255 "charakterisiert" die beiden unendlichen float-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 254) stellen negative und positive Exponenten dar. Diesen Exponent erhält man, indem man von der Charakteristik 127 abzieht. Dadurch erhält man einen Exponenten zwischen -127 und +127. Dieser Exponent gilt zur Basis 2.

float-Werte mit einer Charakteristik 0 (d.h. mit einem Exponenten -127) bezeichnet man als nicht-normalisiert, float-Werte mit einer Charakteristik zwischen 1 und 254 (d.h. mit einem Exponent zwischen -126 und +127) als normalisiert

6. Die Mantisse

Die Mantisse eines float-Wertes ist 23 Bits lang (Bits 0 bis 22). 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 00000000) ein bisschen anders als die Mantisse eines normalisierten Wertes (mit einer Charakterisitk zwischen 00000001 und 11111110).

Bei einer normalisierten Zahl denkt man sich eine 1. und dahinter die 23 Bits der Mantisse.

Bei einer nicht-normalisierten Zahl denkt man sich den Punkt zwischen der ersten und zweiten Ziffer der Mantisse (zwischen Bit 22 und 21).

Vorschlag: Geben Sie (in das Textfeld Die Gleitpunktzahl) die Zahl 6 ein. Sie sehen dann: Die Charakteristik hat den Wert 10000001, dezimal also  129. Daraus ergibt sich ein Exponent von 129 - 127 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 float-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 float-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. einmal auf den Knopf Mal 0.1 und dann einmal 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 GleitBitsFloatApplet, Ulrich Grude.