Das FP - Datenformat zur Speicherung von Zahlen
Die Speicherung von Zahlen geschieht beim Casio CFX in einem 80 Bit Floating Point Datenformat (FP). EIGENTLICH kennt die CPU des Casio CFX dieses Format ja überhaupt nicht, denn die CPU ist ein 8 Bit Prozessor ohne FPU, der nur logische und arithmetische Operationen mit ganzzahligen Werten ausführen kann, und eine Floating Point - Arithmetik wird erst durch das Casio CFX Betriebssystem emuliert (d.h., die Addition zweier FP Werte beispielsweise erfolgt eben nicht als ein CPU Befehl, sondern muss als Codesequenz mit mehreren CPU - Befehlen realisiert werden; siehe Hardware des Casio CFX).
Dennoch sind im RAM alle Variablen sowie alle Listen - und Matrizeneinträge in diesem Format gespeichert (selbst dann, wenn sie eigentlich ganze Zahlen repräsentieren), so dass der Benutzer bzw. Casio Basic Programme Rechenoperationen AUSSCHLIESSLICH auf Floating Point - Basis durchführen können (das gilt sogar dann noch, wenn der Rechner in den Binär -, Dezimal -, Oktal - oder Hexadezimalmodus geschalten wird).
Die Eigenschaften des Datenformats sind folgende:
- Größe: 80 Bit = 10 Bytes
- Zahlen werden mit Fließkomma und genau einer Vorkommastelle gehandelt, und haben die Form Basis * 10^Exponent (d.h., auch wenn der Rechner zwar 123 oder -0.591 ausgibt, wird der Wert intern als 1.23 *10^2 oder -5.91 *10^-1 dargestellt)
- Dabei wird die Basis auf 15 - und der Exponent auf 2 dezimale Stellen genau gespeichert (Anmerkung: Bei Ein - und Ausgabe wird die Basis zwar jeweils auf 10 Stellen gerundet, intern aber trotzdem mit 15 Stellen gerechnet; das wird deutlich, wenn man beispielsweise zwei Zahlen mit jeweils 10 Ziffern <> 0 in Variablen speichert, diese miteinander multipliziert, das Ergebnis in einer weiteren Variablen speichert und diese dann mit dem Hex - Editor ausliest)
- Sowohl Basis als auch Exponent können positiv oder negativ sein (insgesamt 4 Möglichkeiten).
- Ziffern werden nicht binär, sondern im BCD (= Binary Coded Decimal) Format gespeichert.
Während in der binären Form eine Zahl als Folge BINÄRER Ziffern dargestellt wird (z.B. 10010011 = 2^7+2^4+2^1+2^0 = 147), repräsentieren im BCD Format jeweils 4 Bit eine DEZIMALE Ziffer 0..9 mit 0=0000 und 9=1001, und die restlichen 6 Möglichkeiten 1010..1111 bleiben ungenutzt. Im Beispiel wäre 10010011 = 93.
Die Struktur eines FP - Wertes im RAM sieht wie folgt aus:
Byte # | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Inhalt | E1:E0 | BS:ES | B13:B14 | B11:B12 | B9:B10 | B7:B8 | B5:B6 | B3:B4 | B1:B2 | ?:B0 |
Erklärung:
-
Alle Felder B0..B9, ?, BS, ES, E0 und E1 sind 4 Bit Felder, pro Byte sind jeweils zwei Felder gespeichert. Die Angabe E1:E0 für Byte #0 bedeutet, dass das Feld E1 die Bits 4..7, und E0 die Bits 0..3 des Bytes belegt.
- ? gibt an, dass das Feld nicht verwendet und standardmäßig vom Casio CFX immer 0 gesetzt wird. Dieses Feld zu verändern hat keinerlei Auswirkungen: der Wert einer Variablen wird vom Rechner dann trotzdem noch korrekt dargestellt und verarbeitet.
- Die Felder B0 bis B14 sind die Ziffern der Basis im BCD - Format (s.o.) mit B0 = Vorkommaziffer, B1 = 1. Nachkommastelle, B2 = 2. Nachkommastelle usw.
- BS ist das Vorzeichen der Basis. Gilt BS = 0, ist diese positiv, für BS = 5 negativ. Andere Werte für BS sind ungültig.
- ES ist das Vorzeichen des Exponenten. Ist ES = 1, ist er positiv, für ES = 0 negativ. Andere Werte für ES sind ungültig.
- E0 ist die Einer - und E1 die Zehnerziffer von E'. Ist der Exponent positiv, gilt: E' = Exponent, ansonsten E' = 100-Exponent
Im Übrigen ist das FP Format vom Format der Dateneingabe zu unterscheiden: alle Variablen, Listen und Matrizen sind im RAM zwar im FP Format gespeichert, aber wenn bei Programmdaten (z.B. in einem Casio Basic Programm, in f1..f6, in den Funktionsvariablen Y1..20 usw.) Direktwerte angegeben werden (z.B. 3 -> A oder If D = 13*Q+2), dann sind diese nicht als Zahlwert, sondern als Quelltextargument gespeichert, d.h., 3 ist im Speicher des Programms tatsächlich auch als Zeichen "3" sichtbar. Erst nachdem der Casio Basic Interpreter dieses Argument aufgenommen hat, wandelt er es ins FP Format um, und legt es für die Dauer der Operation, an der das Argument beteiligt ist, im Stack ab.
Beispiele
Als Beispiel wollen wir ein 10 Byte Image erstellen, dass den Wert -3157 im FP Format des Taschenrechners repräsentiert, und eins, dass den Wert 0.078 darstellt.
Im ersten Fall gilt: -3157 = -3.157 * 10^3, wobei -3.157 die Basis (genaugenommen eigentlich der KOEFFIZIENT vor der Basis, aber was soll´s ...), und 3 der Exponent ist. Außerdem ist die Basis negativ und der Exponent positiv, dass BS Feld muss also den Wert 5, und dass ES Feld den Wert 1 haben. Da der Exponent positiv ist, gilt: E' = Exponent = 3, das E0 Feld muss also 3, und das E1 Feld 0 lauten. Für die Bn - Felder gilt: B0 = 3, B1 = 1, B2 = 5, B3 = 7 und B4 bis B14 = 0. Das Image muss also wie folgt lauten:
Byte # | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Inhalt | 03 | 51 | 00 | 00 | 00 | 00 | 00 | 70 | 15 | 03 |
Im zweiten Beispiel gilt: 0.078 = 7.8 * 10^-2 mit Basis = 7.8 und Exponent = -2. Da die Basis positiv und der Exponent negativ ist, muss BS = 0 und ES = 0 lauten. Es gilt daher: E' = 100-Exponent = 98, und E0 = 8, E1 = 9. Weiterhin sind B0 = 7, B1 = 8 und B2 bis B14 = 0 zu setzen. Das entsprechende 80 Bit Image lautet daher:
Byte # | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Inhalt | 98 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 80 | 07 |
Das kannst du selbst auch ausprobieren: Resette deinen GTR, lege die Variablen A mit -3157 und B mit 0.078 fest und lade das entsprechende RAM Image in den Hex - Editor. Ist nur für die Variablen A und B, ansonsten aber kein Speicher reserviert (deshalb der Reset), findest zu die Variableninhalte von A und B an den Adressen 0832 und 083C im RAM Image. Vergleiche die Werte mit den oben angegebenen, und die wirst sehen, dass sie übereinstimmen!
Zusatzinfo
Warum verwendet der Casio CFX eigentlich BCD codierte Zahlen? Er tut das, gerade WEIL die CPU Floating Point Operationen nicht unterstützt, denn Floating Point Arithmetik ist mit BCD Ziffern softwaretechnisch viel leichter zu implementieren als mit Binärwerten. Da das aber bei der hardwaremäßigen Umsetzung egal ist und das binäre Format den Speicher sehr viel besser nutzt, verwenden alle CPUs mit FPU statt dessen richtige Binärwerte.
Die Softwareemulation gebrochenzahliger Werte durch 4Bit BCD Ziffern bei 4 - oder 8 Bit CPUs hat übrigens eine lange Tradition: schon die weltweit erste 4Bit CPU, der Intel 4004, hat 1971 in Tischrechnern mit gebrochenen Werten im BCD Format gerechnet! Selbst in heutigen PC CPUs existieren noch immer Maschinenbefehle zum Umgang mit BCD codierten Werten.
Copyright (C) 2004 by Marco Kaufmann