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 データシート

製品コード
198822
ページ / 73
Wertebereich
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.
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:
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.
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.
Stacküberläufe äußern sich durch unkontrollierbares Verhalten der Control Unit I und sind nicht immer sofort  
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 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