Das lernst du heute
- 53 Bit Mantisse
- Rundungsfehler
- Große Hashes im Register
Ein Zähler addiert jeden Takt 0,1. Nach zehn Takten fragt der Chip beq zehntel 1 fertig – und springt nie. Der Code ist richtig, die Zahl ist es nicht ganz. Heute geht es darum, was ein Register wirklich speichert.
53 Bit Mantisse
Jedes Register ist eine Kommazahl doppelter Genauigkeit: 53 Bit für die Ziffern, dazu ein Exponent, der das Komma verschiebt. Daraus folgen zwei Regeln:
- Ganze Zahlen bis 2^53 sind exakt. Darüber fehlen Bits für die letzten Stellen.
- Die meisten Dezimalbrüche sind nicht exakt. 0,1 ist im Binärsystem ein unendlicher Bruch, wie 1/3 im Dezimalsystem. Gespeichert wird die nächstgelegene Zahl.
Rundungsfehler
add r0 0.1 0.2 ergibt 0,30000000000000004. Das ist kein Fehler des Spiels, sondern jeder Rechner mit Kommazahlen macht das so. seq r1 r0 0.3 liefert deshalb 0.
add summe 0.1 0.2 # 0.30000000000000004
seq genau summe 0.3 # 0, nicht gleich
sap ungefaehr summe 0.3 TOLERANZ # 1, nah genug
Die Lösung kennst du seit Tag 109: Vergleiche mit Toleranz. sap prüft, ob zwei Werte relativ nah beieinander liegen. Bei Regelungen ist eine Hysterese mit sgt und slt ohnehin besser als ein Gleichheitstest.
Zahlen wie 0,5, 0,25 oder 0,125 sind dagegen exakt – sie sind Zweierbrüche. Ein Zähler in halben Sekunden bleibt deshalb genau.
Große Zahlen
Über 2^53 = 9 007 199 254 740 992 gehen Einer verloren:
add verlust GROSS 1 # 2^53 + 1 wird zu 2^53
sub verlust verlust GROSS # 0 statt 1
Im Spiel triffst du die Grenze vor allem beim Packen: Werte mit zusammen mehr als 53 Bit verlieren die untersten Bits.
Große Hashes im Register
Hashes sehen groß aus, etwa −1252983604 für den Gassensor. Sie sind aber 32-Bit-Zahlen und passen damit spielend und exakt in ein Register. seq auf zwei Hashes ist deshalb sicher, auch wenn sonst bei Kommazahlen Vorsicht gilt.
Rechne nicht mit Hashes. Ein Hash mal 1000 oder zwei Hashes in einem gepackten Wert brauchen mehr als 53 Bit – dann stimmen die unteren Stellen nicht mehr, und ein späterer Vergleich schlägt fehl.
Schaubild
Übung
Aufgabe
Zeig dir die Grenzen selbst:
summe= 0,1 + 0,2genau= 1, wenn summe exakt 0,3 ist (seq)ungefaehr= 1, wenn summe mit TOLERANZ nah an 0,3 liegt (sap)verlust= (GROSS + 1) − GROSSzehntel= zehnmal 0,1 in einer Schleife addierteins= 1, wenn zehntel mit TOLERANZ nah an 1 liegt
Hinweise
Hinweis 1
seq genau summe 0.3 und sap ungefaehr summe 0.3 TOLERANZ.
Hinweis 2
Für den Verlust erst add, dann sub mit GROSS.
Hinweis 3
Schleife mit Zähler bis 10, danach sap eins zehntel 1 TOLERANZ.
Quiz
4 Fragen. Ab 60 % ist das Quiz bestanden – die Auswertung macht der Server.
Tag abschließen
- Übung im Simulator bestanden
- Quiz mit mindestens 60 % bestanden
Ohne Konto wird der Fortschritt nur in diesem Browser gespeichert.
Fehler in dieser Lektion melden
Zum Melden bitte anmelden. Anmelden