Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Nur mit ganzen Zahlen rechnen? Kategorie: C-Control I V1.1 (von laika63 - 23.12.2009 22:15)
 Als Antwort auf Nur mit ganzen Zahlen rechnen? von turbomatze - 22.12.2009 12:52
laika63 nutzt:  CC1-Unit V1.1
Hallo Matthias nochmal,

ich habe mich da auch eine Weile mit auseinander gesetzt, man kommt an erweiterter Integerrechnung nicht vorbei. Folgend ein Auszug aus meiner Programmbeschreibung:

Berechnungen: Festpunkt-, Integer-, Byte-Arithmetik
Es gibt nur Integer-Arithmetik in Byte- (0 ... 255) und Wortlänge (-32767 ... 32768), keine Fest- oder Gleitkomma-Arithmetik  -  auch nicht in Form von Hilfsroutinen.
Daher:
• Kommastellen müssen „gedanklich“ geführt werden, d.h. in Form von Multiplikation der Operanden mit 10, 100 usw., um mit ein, zwei usw. Nachkommastellen zu rechnen.
• Der Byte- bzw. Integer-Zahlenbereich muß berücksichtigt und vorher "auf dem Papier" geprüft werden, insbesondere bei Multiplikationen,  es gibt keinerlei Fehlerreaktion bei Überschreitung des Zahlenbereichs !
• Bei Divisionen innerhalb einer Formel ist die Ungenauigkeit zu berücksichtigen.  Ggf. muß der Dividend vorher mit 10 oder 100 multipliziert werden, um die erforderliche Genauigkeit zu erreichen.
Beispiel: 47 / 123 - das würde natürlich 0 statt 0,38 ergeben.
Multiplikation des Dividenden mit 100:  47 * 100 / 123 = 38, was dann weiter verarbeitet werden kann. Das Komma muss man "im Kopf behalten".
Am Ende muss wieder durch 10, 100 ... dividiert werden, um diese Faktoren weg zu kriegen.
• Ein Divisionsrest steht nicht automatisch zur Verfügung, er kann nur durch eine zusätzliche mod-Operation ermittelt werden.
• Bei Divisionen wird grundsätzlich abrundet.  Auf-/Abrunden muß daher erforderlichenfalls durch Addition von „0,5“ vor der Division erfolgen  -  Â„0,5“ heißt „Hälfte vom Divisor“.
• Bei längeren Formeln mit mehreren Multiplikationen und Divisionen ist die Reihenfolge so zu wählen, daß zunächst große Zahlen, i.d.R. durch Multiplikation, entstehen, die dann erst dividiert werden, sonst können Zwischenergebnisse, die sehr ungenau oder gar Null sind, entstehen.
• Werden Vor- und Nachkommastellen getrennt berechnet  -  z.B. beim Fertigwert der Temperatur  -  dann muß bei Werten -0,.. (d.h. > -1  und  < 0)  das Vorzeichen extra gemerkt werden, da es wegen des Wertes „0“ der Vorkommastelle nicht mehr vorhanden ist.

Beispiel: Darstellung von TA im Sendebefehl an den PC:
In der Variablen i1 steht die Temperatur mit dem Faktor 10:
i2 = i1 / 10 'Vorkomma, mit Vorzeichen
i1 = (i1 mod 10) 'Nachkomma, mit Vorzeichen
if i2=0 and i1<0 then print "-"; 'richtiges Vorzeichen erzeugen
print i2; ","; i1*sgn(i1) '  und an den PC senden

Fazit: Ergebnis und Zwischenergebnisse (!) jedes Berechnungsschritts einer Formel sind vorher auf gewünschte Genauigkeit, Zahlenbereichsgrenzen und Vorzeichen zu prüfen.
Die Berechnung der erforderlichen Aufladung ist eine der umfangreichsten, daher hier ausführlich als Beispiel.
Werforderlich   =   (VS * TI   +   KK * TKS)   -   VS * TA   -    KK * TK

Bereiche der Konstanten, Variablen und Zwischenergebnisse:
VS  =  6, TI  =  18 ... 25 => VS * TI  =  108 ... 150 ,       VS * TI  * 10  =  1080 ... 1500
KK  =  3,49, TKS = 20 ... 50   => KK * TKS =  70 ... 175 , KK * TKS * 10  =  700 ... 1750
=> (VS * TI   +   KK * TKS) * 10  =  1780 ... 3250

TA  =  -25 ... 40 °C für die Berechnung Grenzen extrem annehmen !
=> VS * TA  =  -150 ... 240, VS * TA * 10  =  -1500 ... 2400


TK  =  20 ... 100 °C
=> KK * TK  =    70 ... 350, KK * TK * 10  =     700 ... 3500

Werforderlich (TI  =  25;  TKS = 50;  TA = -25;  TK = 20)     =   4050
Werforderlich (TI  =  18;  TKS = 20;  TA =  40;  TK = 100)   =   -3820

Es liegt also alles hinreichend innerhalb der Integergrenzen.  Entsprechende Grenzbetrachtungen sind für alle Formeln durchzuführen und daraus die geeigneten Faktoren (hier die 10) zu bestimmen.


Ich hoffe, du kannst was mit anfangen ;-))
Nimm VS, TI usw. einfach als irgendwelche Variablen. Bei mir ist das die Berechnung der Aufladung meiner Nachtspeicherheizung.

Gruss
Laika

 Antwort schreiben

Bisherige Antworten: