Hinweise zu den Fließkommazahlen
Darstellung der Zahlen
Der Zahlenbereich umfaßt 3.4 E38 bis -5.9 E-39 mit einer Genauigkeit von sieben Ziffern
(Bei einer Mantissa mit 23 Bit sind das 2^-23 = 1.2 E-7).
Die Zahlen werden kodiert als
Byte 1 | Normalisierte Mantisse, MSB (mit Vorzeichen) |
Byte 2 | Mantisse |
Byte 3 | Mantisse, LSB |
Byte 4 | Exponent in binärer 2'er Komplementdarstellung |
Die Mantisse erklärt sich wie folgt:
Bei einer Länge von drei Bytes ergeben sich 3*8=24 Bits.
Das MSB wird als Vorzeichen benutzt.
Das nächste Bit hat eine Wertigkeit von 1/2, das nächste Bit 1/4, dann 1/8 usw.
Hieraus ersieht man, daß der Wert der Mantisse maximal 1/2+1/4+1/8+..., also immer < 1 ist.
Der Ausdruck "Normalisierung" bedeutet hierbei, daß immer das dem MSB folgende Bit gesetzt ist, die Mantisse also immer >= 0,5 ist.
Weil das MSB als Vorzeichen benutzt wird, muß der ermittelte Wert noch mit zwei multipliziert werden und danach muß nur noch der so ermittelte Wert der mit dem Exponenten multipliziert werden, um den realen Zahlenwert zu erhalten.
In der hier vorliegenden Kodierung bedeutet:
Exponent (hex) | 00 | 2^0 | = 1 |
| 01 | 2^1 | = 2 |
| 02 | 2^2 | = 4 |
| usw. |
| FF | 2^-1 | = 1/2 |
| FE | 2^-2 | = 1/4 |
| FD | 2^-3 | = 1/8 |
| usw. |
Die Zahl ist 0, wenn das dem MSB folgende Bit Null ist.
Beispiel 1: | Zahl=1. Sie ist darstellbar durch 0,5*2^1=(0,5*2)*2^0, damit ergibt sich: 40 80 00 00 |
Beispiel 2: | Zahl=-2,5. Sie ist darstellbar durch -(0,5+0,125)*2^2=-((0,5+0,125)*2)*2^1, damit ergibt sich für die Darstellung: D0 00 00 01 |
Mit diesen Darstellungen ergeben sich die Grenzwerte:
Kleinste Zahl | 40 00 00 81 | 5.87747E-39 |
|
Größte Zahl | 7F FF FF 7F | 3.40283E+38 |
Fehlerbehandlung
Bei Bereichsüberschreitung der Zahlen, Wurzel aus einer negativen Zahl, Division durch Null und Zahlenüber- oder -unterlauf wird die interne Fehlerflag FLPERR' auf den Wert TRUE (dezimal 255, hex FF) gesetzt.
Außerdem wird bei einem Fehler das Carryflag der CPU gesetzt.
Das Prüfen dieser Flag obliegt dem Programmierer.
Im Speicherplatz FLPERR+1' findet sich ein weiterer Code, der genauere Auskunft gibt:
Code | Bedeutung |
0 | Overflow |
2 | Division durch Null |
4 | Exponent erwartet |
6 | Ziffer erwartet |
8 | Zahl zu groß |
10 | Aufruf Fehler |
Formathinweise
Das folgende Beispiel veranschaulicht die Ausgabe mit der Routine FLFORM mit unterschiedlichen Parametern (_ entspricht einem Leerzeichen):
Zahl | Dezimalstellen | Nachkommastellen | Darstellung |
| 123456789012 |
100 | 6 | 2 | 100.00 |
100 | 8 | 2 | __100.00 |
23.455 | 6 | 1 | __23.5 |
23.455 | 4 | 2 | _2.34550E+01 |
23.455 | 4 | 9 | __23 |
Bei der speziellen Formatausgabe (Akkumulator hält -1), bestimmt das Register C die Darstellungsform:
Register C | Darstellung |
1.. 7 | Die vollen 12 Zeichen werden dargestellt |
8..12 | Es werden bis fünf Dezimalstellen dargestellt |
ab 13 | Es werden entsprechende Leerzeichen vorangestellt |
Am Beispiel der Zahl -1.23E+10 sei dies veranschaulicht (_ entspricht einem Leerzeichen):
Register C | Darstellung |
| 12345678901234567890 |
7 | -1.23000E+10 |
8 | -1.2E+10 |
9 | -1.23E+10 |
10 | -1.230E+10 |
11 | -1.2300E+10 |
12 | -1.23000E+10 |
13 | _-1.23000E+10 |
14 | __-1.23000E+10 |
Wandlungshinweise
Für die Wandlungen der Fließkommazahlen in das Ganzzahlformat gibt es ja unterschiedliche Routinen.
Es sei kurz im Bereich 12.0 bis 12.9 die unterschiedliche Art der Wandlung dargestellt.
(Die Wandlung in eine Ganzzahl geschieht über ENTIER)
FLP ROUND ENTIER TRUNC FLP ROUND ENTIER TRUNC
12.0 12 12 12 -12.0 -12 -12 -12
12.1 12 12 12 -12.1 -12 -13 -12
12.2 12 12 12 -12.2 -12 -13 -12
12.3 12 12 12 -12.3 -12 -13 -12
12.4 12 12 12 -12.4 -12 -13 -12
12.5 13 12 12 -12.5 -12 -13 -12
12.6 13 12 12 -12.6 -13 -13 -12
12.7 13 12 12 -12.7 -13 -13 -12
12.8 13 12 12 -12.8 -13 -13 -12
12.9 13 12 12 -12.9 -13 -13 -12
|