Das lernst du heute
- Warum seq bei Kommazahlen scheitert
- Toleranz relativ angeben
- brap und brna
Ein Mischtank soll genau 21 % Sauerstoff haben. Du prüfst seq ok o2 0.21, und es kommt nie 1 heraus, obwohl die Anzeige 21 % zeigt. Der Grund: Messwerte landen fast nie exakt auf einer Zahl.
Warum seq bei Kommazahlen scheitert
Der Chip rechnet mit Gleitkommazahlen. Viele Dezimalzahlen lassen sich darin nicht genau darstellen, und jede Rechnung schleppt kleine Reste mit:
add r0 0.1 0.2
seq r1 r0 0.3 # r1 = 0, r0 liegt knapp ueber 0.3
Ein Sensorwert, ein Mittelwert, eine Division: Alle landen knapp neben der glatten Zahl. seq, beq und breq vergleichen exakt und treffen deshalb fast nie.
Ungefähr gleich mit Toleranz
Die ap-Befehle (approximately) vergleichen mit Spielraum:
sap ok o2 0.21 0.05 # 1, wenn o2 hoechstens 5 % von 0.21 abweicht
Die Toleranz ist relativ: Erlaubt ist ein Abstand von c × max(|a|, |b|). Bei c = 0,05 sind das 5 % des größeren Betrags, für 0,21 also gut 0,01.
| Befehl | macht |
|---|---|
sap r? a b c | r = 1, wenn a ≈ b |
sna r? a b c | r = 1, wenn a deutlich anders als b |
bap a b c ziel | springt, wenn a ≈ b |
bna a b c ziel | springt, wenn a deutlich anders als b |
brap a b c n | relativ, wenn a ≈ b |
brna a b c n | relativ, wenn a deutlich anders als b |
Die Toleranz relativ angeben
Relativ ist praktisch, weil eine Toleranz für alle Größenordnungen passt: 2 % sind bei 100 kPa 2 kPa und bei 5000 kPa 100 kPa. Für Drücke, Temperaturen in Kelvin und Mischverhältnisse ist das meist genau richtig.
sap gleich innen aussen 0.02 # Druckausgleich auf 2 % genau
Mit NaN ist der Abstand keine Zahl, also weder klein noch groß. Im Spielcode liefern dann sowohl sap als auch sna eine 0, und weder bap noch bna springen. Wer eine Tür mit sna sperrt, sperrt sie bei Sensorausfall also nicht. Bau sicherheitsrelevante Bedingungen mit sap/bap/brap und lass die freigebende Aktion nur dann laufen, wenn „ungefähr gleich“ wirklich zutrifft.
Nahe null wird eine relative Toleranz winzig. 2 % von 0,01 kPa sind 0,0002 kPa. Im Vakuum sind 0,01 und 0 kPa deshalb nicht „ungefähr gleich“. Für Werte nahe null brauchst du eine absolute Grenze, darum geht es morgen.
Schaubild
Übung
Aufgabe
Die Kammertür darf nur entsperrt sein, wenn der Druck in der Kammer ungefähr dem im Vorraum entspricht.
- Gassensoren „Kammer“ und „Vorraum“, Tür „Kammertuer“, Wandleuchte „Ausgleich“
- Toleranz 5 % relativ (
TOL) - Lampe an und
Lock0, wenn beide Drücke ungefähr gleich sind, sonst Lampe aus undLock1 - Fehlt ein Sensor: Lampe aus, Tür gesperrt
Benutze sap und brap (kein seq, beq, breq).
Hinweise
Hinweis 1
Ersetze seq durch sap gleich innen aussen TOL.
Hinweis 2
Tür: move sperre 0, dann brap innen aussen TOL 2 und move sperre 1.
Hinweis 3
Bei NaN springt brap nicht – die Tür bleibt dann gesperrt.
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