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 

 Multiplikation und präzise Division Kategorie: Programmierung Basic (von Stefan Wesenberg - 8.12.2007 21:37)
Stefan Wesenberg nutzt:  CC1-Unit V1.1
' Multiplikaton von zwei Word Variablen (0 bis 65535)
' Ergebniswert steht in zwei Word Variablen (0 bis 4294836225)
' Eine präsise Division ist hiermit auch möglich, wenn
' das höherwetige Ergebnisword alleine betrachtet wird.

define A word[1]   'Multiplikator, 16 Bit Zahl
define B word[2]  'Multiplikator 16 Bit Zahl
define C word[3]   'Produkt High-Word (16 Bit) vom 32 bit Ergebnis
define D word[4]   'Produkt Low-Word (16 Bit) vom 32 bit Ergebnis
define Tempbyte byte[9]  'Zwischenpuffer

'folgende Definitionen treffen das High- bzw. Low- Byte
'der oben definierten Word Variablen   Stefan Wesenberg
define Ah byte[1]   ' High Byte von der Word Variable A
define Al byte[2]   ' Low Byte von der Word Variable A
define Bh byte[3]   ' High Byte von der Word Variable B
define Bl byte[4]   ' Low Byte von der Word Variable B
define Ch byte[5]   ' High Byte von der Word Variable C
define Cl byte[6]   ' Low Byte von der Word Variable C
define Dh byte[7]   ' High Byte von der Word Variable D
define Dl byte[8]   ' Low Byte von der Word Variable D

' Um Überläufe bei der Multiplikation auszuschliessen werden
' zwei Bytewerte multipliziert und das Produkt als Wordwert erfasst.
' folgende Rechenregel wird angewendet:
' (Ah+Al)*(Bh+Bl) = Al*Bl + Al*Bh + Ah*Bl + Ah*Bh
' das vier Byte große Ergebnis steht in den zwei Wordvariablen C und D.
' Um nur ein Byte als Zwischenpuffer zu benötigen werden Teilergebnisse
' zwischen verschiedenen Variablen verschoben und das Teilergebnis Al*Bl
' zwei mal berechnet.


A = 12345 ' Multiplikator A
B = 23456 ' Multiplikator B
gosub MULTIPLIKATION

Print A;" * ";B;"  =  ";C;" * 65536 + ";D;

if C<0 then print "  negativ dann 65536";C;
if D<0 then print "  negativ dann 65536";D else print

end


#MULTIPLIKATION
C  = Al * Bl
D  = Ah * Bl
Dh = Ch
C  = Dl + Dh
D  = Al * Bh
C  = C  + D
Tempbyte = Cl
D  = Ah * Bl
Dl = Ch
C  = Dl + Dh
D  = Ah * Bh
C  = C  + D
D  = Al * Bl
Dh = Tempbyte
return

 Antwort schreiben

Bisherige Antworten: