stationeers.de Mod-Werkstatt · Dominik1199
EN Anmelden
  1. Start
  2. IC10-Akademie
  3. Tag 285

Tag 285 von 365 · Experte · Monat 10: Bits und Daten

Gleitkomma-Genauigkeit

Register sind Kommazahlen mit 53 Bit Mantisse: warum 0,1 + 0,2 nicht 0,3 ist, wo ganze Zahlen ihre Genauigkeit verlieren und warum Hashes trotzdem sicher sind.

Lektion 16 Min. Woche 41

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:

  1. Ganze Zahlen bis 2^53 sind exakt. Darüber fehlen Bits für die letzten Stellen.
  2. 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.

Achtung

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

Die Registerbank des Chips r0 42 r1 31 r2 10 r3 -2.5 r4 0 r5 0 r6 0 r7 0 r8 0 r9 0 r10 0 r11 0 r12 0 r13 0 r14 0 r15 0 sp = r16 ra = r17 16 freie Register, je eine Zahl sp: Stapelzeiger · ra: Rücksprungadresse
Eine Kommazahl speichert 53 Bit Ziffern und einen Exponenten. Was nicht in die 53 Bit passt, wird gerundet.

Übung

Aufgabe

Zeig dir die Grenzen selbst:

  • summe = 0,1 + 0,2
  • genau = 1, wenn summe exakt 0,3 ist (seq)
  • ungefaehr = 1, wenn summe mit TOLERANZ nah an 0,3 liegt (sap)
  • verlust = (GROSS + 1) − GROSS
  • zehntel = zehnmal 0,1 in einer Schleife addiert
  • eins = 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

Esc
↑ ↓ wählenEnter öffnen/ öffnet die Suche überall