Festkommazahl

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Eine Festkommazahl ist eine Zahl, die aus einer festen Anzahl von Ziffern besteht. Die Position des Kommas ist dabei fest vorgegeben, daher der Name.

Fixpointnumbers.png

Der Grundgedanke dahinter ist die informationstechnische Repräsentation eines Ausschnitts der rationalen Zahlen. Diese Abbildung auf einen begrenzt großen Datentypen, typischerweise Integer verschiedener Bitbreiten, erfordert eine feste Anzahl von Ziffern für den Vorkomma- wie den Nachkommaanteil. Üblicherweise sind per Definition die ersten n \leq k Stellen Vorkommastellen und die restlichen m = k - n Nachkommastellen. In der Informatik haben die dezimalen wie die binären Festkommazahlen eine große praktische Bedeutung.

Vor- und Nachteile gegenüber einer Gleitkommazahl[Bearbeiten]

Performance-Betrachtung[Bearbeiten]

Durch die feste Position des Dezimalkommas fällt Rechenaufwand im Vergleich zur Rechnung mit Gleitkommazahlen weg. Wird in einem Computerprogramm eine binäre Festkommadarstellung gewählt, können zudem die zur Umrechnung und Korrektur notwendigen Multiplikationen und Divisionen durch schnelle Schiebeoperationen ersetzt werden. Ein Beispiel für eine Applikation, die gezielt aus Rechenaufwandsgründen mit Festkomma-Arithmetik entworfen wurde, ist z. B. Fractint, ein Fraktalgenerator[1]. Seit Mitte der 1990er Jahre haben Prozessoren dedizierte Gleitkommarechenwerke, die dazu führen, dass die Berechnung von Fraktalen mit Gleitkommazahlen schneller als die mit Ganzzahlen ist.

Präzision und Dynamik[Bearbeiten]

Aufgrund der exakten Darstellung ist der Wertebereich einer Festkommazahl kleiner als der jeweilige Wertebereich einer Gleitkommazahl derselben (Bit-)Länge. Dafür ist jedoch die Exaktheit der Darstellung einer Zahl im gesamten Wertebereich gesichert, bei Gleitkommazahlen nicht immer (z. B. durch Absorption[2]). Ein Beispiel für eine Anwendung, die aufgrund der nötigen exakten Darstellung Festkommazahlen verwendet, ist GnuCash[3].

Repräsentationsbeispiel: Binäre Festkommazahl[Bearbeiten]

Alle binären Festkommazahlen der Länge k = 2 mit n \in \{0,1,2\} Vorkommastellen:

n = 2 n = 1 n = 0
Binärmuster Binär Dezimal Binär Dezimal Binär Dezimal
00 00, 0 0,0 0,0 ,00 0,00
01 01, 1 0,1 0,5 ,01 0,25
10 10, 2 1,0 1,0 ,10 0,50
11 11, 3 1,1 1,5 ,11 0,75

Man beachte, dass jedes der vier aufgelisteten binären Muster für jeweils drei unterschiedliche Zahlen steht, je nachdem an welche Stelle das Komma gesetzt wird. Da die Anzahl der Vorkommastellen ja bereits per Definition fest liegt, ist es unnötig, das sonst übliche Komma zu schreiben beziehungsweise zu speichern, d.h. die Repräsentation ist immer die der Spalte "Binärmuster".

Rechnen mit Festkommazahlen[Bearbeiten]

Bei der Rechnung mit Festkommazahlen werden die binären Muster prinzipiell so verarbeitet wie bei der Rechnung mit ganzen Zahlen. Festkomma-Arithmetik kann daher von jedem digitalen Prozessor durchgeführt werden, der arithmetische Operationen mit ganzen Zahlen unterstützt. Dennoch sind einige Regeln zu beachten, die sich auf die Position des Kommas vor und nach der Rechenoperation beziehen:

  • Bei Addition und Subtraktion muss die Position des Kommas für alle Operanden identisch sein. Ist dies nicht der Fall, sind die Operanden durch Schiebeoperationen entsprechend anzugleichen. Die Kommaposition des Ergebnisses entspricht dann der Kommaposition der Operanden.
  • Bei Multiplikation entspricht die Anzahl der Vorkommastellen des Ergebnisses der Summe der Anzahlen der Vorkommastellen aller Operanden; ebenso entspricht die Anzahl der Nachkommastellen des Ergebnisses der Summe der Anzahlen der Nachkommastellen aller Operanden.
  • Eine Division oder Multiplikation mit einer Potenz 2^n entspricht einer Bit-Schiebe-Operation des binären Musters nach rechts bzw. links um n Stellen bei gleichbleibender Kommaposition. Alternativ kann die Operation als imaginäre Verschiebung des Kommas aufgefasst werden.

Anwendungsbeispiele[Bearbeiten]

Die folgenden Beispiele gehen von einer dezimalen Festkommadarstellung aus, bei der zwei Nachkommastellen vorgesehen sind. Dies wird durch den Faktor 100 ausgedrückt, mit denen die ursprünglichen Werte multipliziert wurden, um die Festkommadarstellung zu erhalten.

Addition
6{,}3\times{}100 + 2{,}1\times{}100 = 8{,}4\times{}100
Subtraktion
6{,}3\times{}100 - 2{,}1\times{}100 = 4{,}2\times{}100
Multiplikation
6{,}3\times{}100 \times{} 2{,}1\times{}100 = 13{,}23\times{}100\times{}100
Hier ist das Ergebnis keine Festkommazahl nach denselben Kriterien wie die beiden Faktoren; eine Korrektur ist notwendig (hier: Division durch 100).
Division
\frac{6{,}3\times{}100}{2{,}1\times{}100} = 3
Hier ist das Ergebnis keine Festkommazahl nach denselben Kriterien wie Dividend und Divisor; eine Korrektur ist notwendig (hier: Multiplikation mit 100).
Beispiel in binärer 8-bit-Darstellung mit 4 Nachkommastellen und Schiebeoperation, wie sie z. B in Rechnerarchitekturen verwendet wird

Dezimal:

3{,}5_d\times{}2{,}5_d = 8{,}75_d

Binär:

0011{,}1000_b\times{}0010,1000_b = \mbox{0000 1000 1100, 0000}_b

Ergebnis wäre hier entsprechend der 8-Bit-Festkommadarstellung mit 4 Nachkommastellen:

\mbox{1100,0000}_b = 12_d

Fehlerhafte Darstellung der Kommaposition, daher ist die Schiebeoperation notwendig:

0011{,}1000_b\times{}0010,1000_b = \mbox{0000 1000,1100 0000}_b

Ergebnis wäre hier entsprechend der 8-Bit-Festkommadarstellung mit 4 Nachkommastellen:

1000{,}1100_b = 8,75_d

Das Ergebnis nach der Korrektur entspricht nun dem erwarteten Ergebnis.

Probleme[Bearbeiten]

Bei der Darstellung einer reellen Zahl z kann es einige Probleme geben. Im Folgenden hat die Festkommazahl (angelehnt an die Darstellung in einem Rechner) eine Länge von k = 8 und n = m = 4 Vor- und Nachkommastellen. Der Ziffernvorrat sei \{0,1\} - also eine binäre Festkommazahl der Länge eines Bytes mit gleich vielen Vor- und Nachkommastellen. Der tiefgestellte Index bezeichnet die Darstellung der Zahl:  X_R für eine reelle Zahl in üblicher Dezimaldarstellung und  X_F für eine derartige Festkommazahl.

  • 0_R = 00000000_F
  • 1_R = 00010000_F
  • 10_R = 10100000_F
  • 0,5_R = 00001000_F
  • 0,625_R = 00001010_F
  • 0,0625_R = 00000001_F
  • 15,9375_R = 11111111_F
  • 16_R > 11111111_F
  • 0,06_R < 00000001_F
  • 7,7_R \approx 01111011_F

Wie man sieht, können also mit 8 Bits und 4 Vor- und Nachkommastellen nur Festkommazahlen zwischen 0_R und 15,9375_R (bei einer Auflösung von 0,0625_R) dargestellt werden. Dieser geringe Darstellungsbereich ist auch der entscheidende Nachteil gegenüber Gleitkommazahlen.

Weiterhin entstehen wie auch bei Gleitkommazahlen Rundungsfehler bei der Umwandlung der dezimalen, reellen Zahlen in eine binäre Festkommadarstellung. 7_R = 01110000_F kann im Gegensatz zu 0,7_R \approx 00001011_F exakt dargestellt werden. 0,7_R kann allerdings bei noch so vielen Nachkommastellen nicht als Summe von Zweierpotenzen dargestellt werden. Um diese Probleme zu umgehen, kann aber bei Bedarf eine dezimale Festkommadarstellung eingesetzt werden.

Siehe auch[Bearbeiten]

Weblinks[Bearbeiten]

 Wiktionary: Festkommazahl – Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen

Referenzen[Bearbeiten]

  1. Noel Giffin: Fractint: A Little Code, Limitations of Integer Math (And How We Cope). Nehee Enterprises. Abgerufen am 9. Juli 2012.
  2. David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic. In: ACM Computing Surveys. 23, 1991, S. 5-48. doi:10.1145/103162.103163. Abgerufen am 2. September 2010.
  3. What's new in GnuCash 1.6?. gnucash.org. Abgerufen am 3. September 2010.