So, hier endlich die Fortsetzung zum Thema “Rechnen mit Gleitkommazahlen”. Das letzte mal habe ich erklärt, was Gleitkommazahlen überhaupt sind und wie sie im Computer dargestellt werden. Den Nachteil dieser Zahlendarstellung habe ich auch schon vorgestellt: es lassen sich nicht sämtliche Zahlen in einem bestimmten Bereich darstellen (was bei den reellen Zahlen ohnehin mit endlichem Speicher nicht möglich wäre); schlimmer noch ist aber, dass die Abstände zwischen den darstellbaren Zahlen immer größer werden, je größer die Zahlen selber werden. Tückisch wird das vor allem dann, wenn es ans Rechnen mit Gleitkommazahlen geht. Und das soll das heutige Thema sein.
Bevor die Probleme beim Rechnen dargelegt werden können, muss natürlich erst einmal geklärt werden, wie mit Gleitkommazahlen überhaupt gerechnet wird. Glücklicherweise ist das nicht allzu umständlich und lässt sich relativ schnell erklären. Insbesondere Multiplikation und Division lassen sich (in der Theorie) sehr einfach umsetzen; bei der Multiplikation werden einfach die beiden Mantissen (welche ja Festkommazahlen darstellen) miteinander multipliziert und die beiden Exponenten addiert. Wollen wir zum Beispiel die beiden Dezimal-Zahlen 2.5*105 und 6.1*103 miteinander multiplizieren, so rechnen wir:
2.5 * 6.1 = 15.25
und
5 + 3 = 8
Damit erhalten wir als Ergebnis 15.25*108, was in der Tat der gewünschten Zahl entspricht. Bei der Division kann man genauso vorgehen, nur dividiert man hier die Mantissen und subtrahiert die Exponenten. Im dualen Zahlensystem funktioniert die Rechnung genauso, kann also auch auf den Bitketten der bereits vorgestellten Gleitkommadarstellung im Computer durchgeführt werden – ich führe die weiteren Rechnung aber alle im Dezimalsystem aus, damit sie besser verständlich sind.
Für Addition und Subtraktion muss nur ein zusätzlicher Schritt durchgeführt werden: vor der eigentlichen Rechnung müssen die Exponenten angeglichen werden. Sollen also etwa die beiden oben genannten Zahlen 2.5*105 und 6.1*103 addiert werden, so muss die erste Zahl entweder als 250.0*103 oder die zweite als 0.061*105 umgeschrieben werden – üblicherweise transformiert man die kleinere Zahl hin zum größeren Exponenten. Anschließend reicht es, die beiden Mantissen zu addieren. Für obiges Beispiel ergibt sich damit die folgende Rechnung:
2.5*105 + 6.1*103 = 2.5*105 + 0.061*105 = 2.561*105
So weit, so einfach. Die Anpassung des Exponenten kann übrigens ziemlich einfach durchgeführt werden, indem das Komma der Mantisse um die benötigte Anzahl an Stellen nach links oder rechts geschoben wird (das geht im dualen wie im dezimalen System gleichermaßen).
Die Problematik entsteht dadurch, dass im Computer nur eine bestimmte Menge an Bits für eine Gleitkommazahl zur Verfügung stehen; insbesondere die beschränkte Mantissenlänge (für Gleitkommazahlen einfacher Genauigkeit sind das etwa 23 Bit) erweist sich hier als der größte Fallstrick mit verschiedenen Auswirkungen.
Eine dieser Auswirkungen ist die sogenannte Auslöschung (im Englischen cancellation genannt). Sie tritt auf, wenn bei der Verrechnung ähnlicher Zahlen niederwertige Informationen verloren gehen und sich dabei zwar nicht der absolute Fehler, dafür aber der relative Fehler erhöht. Als absoluten Fehler bezeichnet man die tatsächliche Abweichung einer (berechneten) Zahl vom eigentlich gewünschten Wert. Soll etwa das Ergebnis einer Rechnung den Wert 0.51 ergeben, der Computer errechnet aber stattdessen 0.50, so haben wir einen absoluten Fehler von 0.01. Berechnen wir 100.50, wollten aber 100.51, so ist der absolute Fehler ebenfalls 0.01. Der relative Fehler bezeichnet dementsprechend die relative Abweichung der beiden Werte (des berechneten und des eigentlich korrekten) voneinander. Beim Wertepaar 100.51/100.50 beträgt der relative Fehler (die relative Abweichung) knapp 0.01%, wohingegen es beim Wertepaar 0.51/0.50 bereits 2% Abweichung sind. Der Effekt tritt insbesondere bei der Subtraktion auf; ein Beispiel: angenommen, wir haben die Zahlen 1.2345*105 und 1.2340*105 und wollen sie voneinander subtrahieren. In der “gewöhnlichen” Mathematik ist das kein Problem und wir erhalten als Ergebnis:
1.2345*105
– 1.2340*105
____________
= 0.0005*105
Rechnen wir nun aber am Computer, so ist ja die maximale Anzahl an speicherbaren Ziffern in einer Zahl beschränkt; stehen uns zum Beispiel nur 4 Ziffern zur Verfügung (im binären System würde das 4 Bit entsprechen), so würden statt der originalen Zahlen gerundete verwendet werden. Wir hätten also die folgende Rechnung:
Kommentare (14)