C Control I Unit-M 2.0 BASIC 5 Vdc Inputs / outputs 16 x digital I/Os/8 x analog or digital I/Os/2 x analogue outputs (s 198822 Ficha De Dados
Códigos do produto
198822
Wertebereich
Der Wertebereich der mit dieser FP-Arithmetic verarbeitet werden kann liegt im Bereich 1 × 10±38.
Der Wertebereich der mit dieser FP-Arithmetic verarbeitet werden kann liegt im Bereich 1 × 10±38.
Genauigkeit
Sie werden feststellen dass sich selbst mit einer 32 Bit FP-Arithmetik simple Zahlen nicht exakt darstellen
lassen. So lässt sich z.B. die Zahl 1234 im Rahmen dieser 32Bit nur als 1233.999 darstellen. Direkt damit
verbunden sind auch Rechenungenauigkeiten bei grossen Zahlen. 123456.0 + 0.8 führt zum Ergebnis
123456.7, was aber allein auf der endlichen Genauigkeit der 32Bit FP Darstellung beruht.
Sie werden feststellen dass sich selbst mit einer 32 Bit FP-Arithmetik simple Zahlen nicht exakt darstellen
lassen. So lässt sich z.B. die Zahl 1234 im Rahmen dieser 32Bit nur als 1233.999 darstellen. Direkt damit
verbunden sind auch Rechenungenauigkeiten bei grossen Zahlen. 123456.0 + 0.8 führt zum Ergebnis
123456.7, was aber allein auf der endlichen Genauigkeit der 32Bit FP Darstellung beruht.
Das Stack der Control Unit
Das Stack der Control Unit ist ein Speicher der zur kurzzeitigen Ablage von Werten dient. Das können
Werte sein, mit denen etwas gerechnet werden soll, oder auch Rücksprungadressen die für ein RETURN
(nach einem GOSUB) gebraucht werden. Dabei können Sie sich eine Ablage von einem Wert vorstellen wie
die Ablage von einem Holzscheit auf einem Stapel. Das bedeutet, das Holzstück, das zuletzt am Stapel
abgelegt wurde muss auch als erstes wieder vom Stapel genommen werden. Und es muss auf jeden Fall
vom Stapel genommen werden, weil sonst irgendwann der Stapel an der Decke anstößt (das ist dann der
besagte STACKÜBERLAUF)
Die Verarbeitung der Flieskommazahlen erfolgt bei der Control Unit in folgender Weise:
Das Stack der Control Unit ist ein Speicher der zur kurzzeitigen Ablage von Werten dient. Das können
Werte sein, mit denen etwas gerechnet werden soll, oder auch Rücksprungadressen die für ein RETURN
(nach einem GOSUB) gebraucht werden. Dabei können Sie sich eine Ablage von einem Wert vorstellen wie
die Ablage von einem Holzscheit auf einem Stapel. Das bedeutet, das Holzstück, das zuletzt am Stapel
abgelegt wurde muss auch als erstes wieder vom Stapel genommen werden. Und es muss auf jeden Fall
vom Stapel genommen werden, weil sonst irgendwann der Stapel an der Decke anstößt (das ist dann der
besagte STACKÜBERLAUF)
Die Verarbeitung der Flieskommazahlen erfolgt bei der Control Unit in folgender Weise:
MyFloat=FloatVar1*Floatvar2
Der Compiler erzeugt daraus eine Tokenfolge die folgendes veranlasst:
Wenn jetzt der Term zur Berechnung komplexer wird werden sehr viele Einträge im Stack gemacht bevor sie
nach und nach zur Berechnung vom Stack geholt werden.
nach und nach zur Berechnung vom Stack geholt werden.
Beispiel: MyFloat=Floatvar3-FloatVar1*(Floatvar2+Floatvar4)
Der Compiler erzeugt daraus eine Tokenfolge die Folgendes veranlasst:
Sie sehen, dass selbst bei einem relativ einfachen Term wie hier, bereits 4 Floats auf das Stack gelegt
werden, bevor auch nur eines zur Berechnung vom Stack genommen wird. Das sind bereits 16 Bytes.
Die maximale Stacktiefe (oder im Fall des Vergleichs mit dem Holzstapel: die max. Stapelhöhe) beträgt 46
Bytes, und man darf nicht vergessen dass jede Unterprogrammebene jeweils 2 Bytes für die
Rücksprungadresse im Stack belegt.
Bei sehr großen Termen kann es also sinnvoll (und auch meistens übersichtlicher) sein, den Term
in 2 oder mehrere Terme aufzuspalten. Damit ist man auf jeden Fall auf der sicheren Seite.
werden, bevor auch nur eines zur Berechnung vom Stack genommen wird. Das sind bereits 16 Bytes.
Die maximale Stacktiefe (oder im Fall des Vergleichs mit dem Holzstapel: die max. Stapelhöhe) beträgt 46
Bytes, und man darf nicht vergessen dass jede Unterprogrammebene jeweils 2 Bytes für die
Rücksprungadresse im Stack belegt.
Bei sehr großen Termen kann es also sinnvoll (und auch meistens übersichtlicher) sein, den Term
in 2 oder mehrere Terme aufzuspalten. Damit ist man auf jeden Fall auf der sicheren Seite.
Stacküberläufe äußern sich durch unkontrollierbares Verhalten der Control Unit I und sind nicht immer sofort
ersichtlich.
ersichtlich.
4
Lege den Inhalt von FloatVar1 auf das Stack
Lege den Inhalt von Floatvar2 auf das Stack
Lade die beiden letzen Werte von Stack in die beiden Fliesskomma-Akkumulatoren (FPACC)
Multipliziere beide FPACCs
Lade das Ergebnis auf das Stack
Lade den letzten Stackeintrag in die Variable MyFloat
Lege den Inhalt von Floatvar2 auf das Stack
Lade die beiden letzen Werte von Stack in die beiden Fliesskomma-Akkumulatoren (FPACC)
Multipliziere beide FPACCs
Lade das Ergebnis auf das Stack
Lade den letzten Stackeintrag in die Variable MyFloat
Lege den Inhalt von FloatVar3 auf das Stack
Lege den Inhalt von Floatvar1 auf das Stack
Lege den Inhalt von FloatVar2 auf das Stack
Lege den Inhalt von Floatvar4 auf das Stack
Lade die beiden letzte Werte von Stack in die beiden FPACCs
Addiere beide FPACCs
Lade das Ergebnis auf das Stack
Lade die beiden letzte Werte von Stack in die beiden FPACCs
Multipliziere beide FPACCs
Lade das Ergebnis auf das Stack
Lade die beiden letzte Werte von Stack in die beiden FPACCs
Subtrahiere beide FPACCs
Lade das Ergebnis auf das Stack
Lade den letzten Stackeintrag in die Variable MyFloat
Lege den Inhalt von Floatvar1 auf das Stack
Lege den Inhalt von FloatVar2 auf das Stack
Lege den Inhalt von Floatvar4 auf das Stack
Lade die beiden letzte Werte von Stack in die beiden FPACCs
Addiere beide FPACCs
Lade das Ergebnis auf das Stack
Lade die beiden letzte Werte von Stack in die beiden FPACCs
Multipliziere beide FPACCs
Lade das Ergebnis auf das Stack
Lade die beiden letzte Werte von Stack in die beiden FPACCs
Subtrahiere beide FPACCs
Lade das Ergebnis auf das Stack
Lade den letzten Stackeintrag in die Variable MyFloat