Warum passieren einem Computer bei Rechenvorgängen Fehler?
Zunächst: strenggenommen kann ein Computer keine Fehler machen, da er immer genau das macht, was die Entwickler der Hard- und Software vorgesehen haben. Das stimmt aber nicht immer mit der Vorstellung der Entwickler überein, da diese eben “nur” Menschen sind und möglicherweise bestimmte Randbedingungen übersehen (oder absichtlich außer Acht lassen).
Der wahrscheinlich häufigste Fehler was Rechenvorgänge anbelangt sind Überläufe, bei denen das Ergebnis einer Berechnung größer als der maximale Wert einer Variable wird. Wenn man zum größtmöglichen Wert einer Zahl, bestimmt durch die Menge der für die Darstellung dieser Zahl im Speicher vorgesehenen Bits, eins hinzuaddiert, erhält man die kleinstmögliche darstellbare Zahl (diesen Typs). So kann zum Beispiel bei der Verwendung einer unsigned (niemals negativen) 8-bit-Zahl als Ergebnisvariable plötzlich
128+128=0
sein (8 Bit unsigned können normalerweise 256 Werte von 0 bis 255 darstellen).
Ein weiterer sehr häufiger Fehler, der besonders aber nicht nur von Anfängern gerne gemacht wird, ist die Verwendung von Gleitkommazahlen für “präzise” Berechnungen. Dazu muss man wissen, dass Gleitkommazahlen (nach IEEE 754 single oder double precision, zum Beispiel float und double in C) als Kombination aus “Signifikand” und “Exponent” gespeichert werden. Grob gesagt ist der Wert
2
Exponent
×(1+Signifikand)
. Dabei ist der Signifikand ein Wert zwischen 0 und 1, der als Summe der Brüche von
1
2
bis
1
2
23
dargestellt wird. Dadurch entstehen “Schritte” zwischen den darstellbaren Werten, und je größer der Betrag einer Zahl, also je weiter von Null “entfernt”, desto größer sind die Schritte, bis zu einem Abstand von 4 zwischen zwei darstellbaren Zahlen. Dies führt zu Ergebnissen wie a = 16800000.000000, b = 5.000000, a + b = 16800004.000000, aber auch dazu dass zum Beispiel 0,1 nicht genau dargestellt werden kann (0,1 in Binär ist 0,00011001100110011…). Der “Fehler” ist sehr klein, aber wenn mit diesem Wert gerechnet wird dann kann der “Fehler” immer größer werden.
Andere Fehler können von den Prozessordesignern gemacht werden - berühmt ist zum Beispiel der sogenannt F00F-Bug des Pentium-Prozessors
, der allerdings nichts mit Rechenfehlern zu tun hat - oder von den Designern des Arbeitsspeichers oder anderer Teile des PCs. Außerdem ist es möglich, dass Teile außerhalb ihrer Spezifikationen verwendet werden - zum Beispiel durch Overclocking, oder durch unpassende Umgebungsbedingungen (Temperatur, elektromagnetische Strahlung) - und dadurch nicht mehr verlässlich arbeiten.
Und schließlich gibt es auch Phänomene, die in weniger kritischen Systemen einfach “hingenommen” werden, da sie so selten sind: zum Beispiel so genannte “Bit Flips”, bei denen ein Speicherbit scheinbar von sich aus seinen Wert von 0 auf 1 oder umgekehrt ändert. Das kann zum Beispiel als Folge von Lese-/Schreiboperationen auf benachbarten Speicherzellen oder durch elektromagnetische Strahlung usw. passieren. Dagegen gibt es Schutzmechanismen, primär auf Basis von Prüfsummen, die aber meist nur in Serversystemen eingesetzt werden (ECC-RAM, aber auch softwarebasierte Methoden).