Aufgrund der Breite der Variablen kann man das so natürlich nicht machen
(Überläufe). Daher dachte ich mir folgendes, um möglichst wenig
Genauigkeit zu verschenken:
1
int32_ty=256;
2
y-=a;
3
y*=p;
4
y>>=8;
5
y*=x;
6
y>>=16;
7
x-=y;
Die Frage ist nun: Geht das schneller/kleiner/besser?? Das Ganze
passiert 1200 mal je Sekunde (neben allerlei anderer Geschichten).
Das Wichtigste vergessen ^^
Ist ein ATMega, also mul kann er. Ich will Assembler nur im Notfall.
Also, mein Ziel ist erstmal, den C-Code zu optimieren.
> also mul kann er.
Aber nur 8bit*8bit. Also praktisch doch nicht.
Ideal wäre ein Prozessor der eine 32bit*32bit Multiplikation kann.
Dann geht das in einer Zeile so wie du es zuerst geschrieben hast.
Hallo,
hier ist noch eine 32Bit = 32Bitx32Bit Multiplikation mit 39 Takte + 4
(Ret).
Erg = A * B
Mit
# Erg := _HA3:0
# Temp:= _TMP3:0
# A := _HA3:0
# B := _HB3:0
Hmm, aber die einzelne 32-Bit-Multiplikation sollte der GCC doch drauf
haben. Ich gehe nicht davon aus, dass diese in einer ineffizienten Art
und Weise implementiert ist. Ich meine, das ist doch eine Grundfunktion,
die überall benutzt wird.
256-a ist 8 bit breit, * x sind 24 Bit, mal p sind eigentlich schon 40
Bit! Aber hier willst du sicher KEINE 64 Bit Multiplikation.
Also muss man p schon vorher um mind. 8 Bit nach recht schieben oder
gleich nur mit 8 Bit definieren, wenn es keine zusätzliche Einschränkung
der Zahlenbereiche der Variablen gibt.
Aber der GCC muss fast alles als 32 Bit rechnen, wo eine handoptimiere
ASM-Variante deutlich sparen kann. Aber dennoch gilt mein Link oben zum
Thema Optimierung! Wenn es auch so ausreichend schnell ist, so what!
Thorsten schrieb:> Das war so geschrieben, um das Prinzip zu verdeutlichen. "Pseudocode".
Gibt dann auch nur "Pseudoantworten".
Das ist bestimmt ne verkappte Fixedpoint-Berechnung, und über die
Wertebereiche der (Zwischenergebnisse ist vermutlich mehr bekannt als
dass diese in 40 Bits reinpassen.
hmmm Welche Würmer kann man sich sonst noch aus der Nase ziehen
lassen...?
Falk Brunner schrieb:> 256-a ist 8 bit breit, * x sind 24 Bit, mal p sind eigentlich schon 40> Bit! Aber hier willst du sicher KEINE 64 Bit Multiplikation.
Bitte lesen!! Pseudocode, um zu verdeutlichen, was eigentlich gemacht
werden soll. Natürlich bin ich mir der Überläufe bewusst, das steht aber
eigentlich alles schon im ersten Posting.
Von Fixpoint und auch Floating Point ist hier nie die Rede gewesen. Es
sind alles ganze Zahlen.
Danke, das sieht ganz gut aus. Dieser Trick mit der Fixpoint-Geschichte
bringt minimal Codevorteile. Der Trick mit der Fallunterscheidung macht
viel aus.
Es funktioniert, weil auch x nicht negativ wird (trotz signed). Ob es
letztendlich auch korrekt laufen würde, wenn das der Fall wäre, weiß ich
jetzt aber nicht (fun_f liefert ja schließlich auch unsigned zurück).