Das lernst du heute
- Kleinste Toleranz bei Null
- brapz und brnaz
- Epsilon ist nicht die Toleranz
Gestern hast du gesehen, dass eine relative Toleranz nahe null winzig wird. Die z-Varianten der ap-Befehle vergleichen mit null. Wer erwartet, dass sie „ungefähr null“ mit Spielraum prüfen, erlebt eine Überraschung.
Was sapz wirklich prüft
Im Spielcode ist sapz r? a c nichts anderes als sap r? a 0 c. Die Bedingung lautet also: Der Betrag von a ist höchstens max(c × Betrag von a, float.epsilon × 8).
Der erste Teil, c mal der Betrag von a, ist für jede Toleranz unter 1 kleiner als der Betrag selbst. Er hilft nie. Übrig bleibt die feste Untergrenze float.epsilon × 8, etwa 1,1 · 10⁻⁴⁴. Das ist die kleinste Toleranz, die es bei den ap-Befehlen gibt, und bei null ist sie die einzige, die greift.
| Befehl | ergibt 1 bzw. springt, wenn |
|---|---|
sapz r? a c | a praktisch genau 0 ist |
snaz r? a c | a nicht praktisch genau 0 ist |
bapz a c ziel / brapz a c n | wie sapz, mit Sprung |
bnaz a c ziel / brnaz a c n | wie snaz, mit Sprung |
sapz prüft also auf genau null, wie seqz. Ein Rechenrest aus 0.1 + 0.2 − 0.3 gilt nicht als null:
add r0 0.1 0.2
sub r0 r0 0.3 # r0 ist ein winziger Rest, nicht 0
sapz r1 r0 0.5 # r1 = 0
Epsilon ist nicht die Toleranz
Die Konstante epsilon gibt es auch. Sie ist etwa 5 · 10⁻³²⁴, die kleinste Zahl über null, die der Chip darstellen kann. Mit der Grenze float.epsilon × 8 der ap-Befehle hat sie nichts zu tun. Wer sap r0 a b epsilon schreibt, vergleicht praktisch exakt.
Ungefähr null mit eigener Grenze
Für „fast null“ brauchst du eine absolute Grenze in der Einheit des Werts:
sub diff innen aussen
abs diff diff
slt gleich diff 0.5 # weniger als 0,5 kPa Unterschied
Das funktioniert auch im Vakuum, wo die relative Toleranz von sap versagt. Die z-Befehle bleiben für Werte, die von Natur aus genau 0 sind: Zähler, Anzahlen, 0/1-Flaggen.
Auch die z-Befehle behandeln NaN als weder null noch ungleich null: sapz und snaz liefern 0, bapz und bnaz springen nicht. Fang NaN vorher mit snan oder brnan ab, wenn es eine Rolle spielt.
Die Toleranz c darfst du bei den z-Befehlen nicht weglassen, sonst stimmt die Zahl der Operanden nicht. Schreib 0 hin. Eine Toleranz ab 1 macht das Ergebnis immer wahr, und das hilft niemandem.
Schaubild
Übung
Aufgabe
Vor der Schleuse:
- Gassensoren „Kammer“ und „Vorraum“: Wandleuchte „Ausgleich“ an, wenn die Drücke weniger als 0,5 kPa auseinanderliegen – auch im Vakuum. Fehlt ein Sensor: aus.
- Zwei Türen „Schleusentuer“: Blinklicht „Tueroffen“ an, sobald die Anzahl offener Türen nicht null ist. Benutze dafür
snaz(die Summe überOpenist eine ganze Zahl und nie NaN).
Hinweise
Hinweis 1
Ausgleich: sub, abs, dann slt gleich diff GRENZE. NaN macht slt von selbst zu 0.
Hinweis 2
Offene Türen: lbn … Open Sum zählt sie, weil jede offene Tür 1 meldet.
Hinweis 3
snaz warnen offen 0 ist 1, sobald mindestens eine Tür offen ist.
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