Forum: Mikrocontroller und Digitale Elektronik Problem mit R8C (Multiplikation)


von TheMason (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe mal wieder ein Problem. Diesmal softwaretechnischer Art.
Und zwar habe ich mal ein bischen mit dem R8C-Board der Elektor
rumgespielt. Bin auch ganz zufrieden (Debugger läuft, Timer läuft,
prima) . Jetzt möchte ich zwei Zahlen multiplizieren (was ja eigentlich
das einfachste von Welt ist), aber irgendwie kommt da nur murks bei rum.
(siehe JPG).
Wie kann es sein das 0x3000 (int) * 0x2000 (int) = 0x00000000 (long)
ist wo mein mathematisches Verständnis aus der Grundschule mir sagt das
da 0x06000000 rauskommen muß ?
Fast dasselbe Ergebnis habe ich wenn ich zwei long Zahlen miteinander
multipliziere, wobei dann long long rauskommt. Da kommt kurioserweise
immer ein konstanter Wert bei raus (egal welche Zahlen ich nehme,
iummer 0xFFFFFFFFD2000000).
Was mache ich falsch ?

Gruß
Rene

von Marko B. (Gast)


Lesenswert?

probier mal

lResult = (long) iVal1 * (long) iVal2;

von TheMason (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Marko,

erstmal danke für den Hinweis. Es hat mit dem type-casting geklappt.
Ich versteh nur noch nicht ganz warum man den type cast direkt bei der
multiplikation machen muß. Wenn ich die beiden multiplikatoren direkt
als long definiere kommt wieder nur murks bei raus.

Ein weiteres Problem habe ich noch mit der multiplikation. Bei 32x32
Bit klappt das nicht. Sprich wenn ich zwei long zahlen habe bei denen
dann long long rauskommen muß. Da ist das ergebnis auch verkehrt.

Gruß
Rene

von A.K. (Gast)


Lesenswert?

In C ist das Ergebnis einer Multiplikation nicht grösser als die
Operanden, egal ob es reinpasst oder nicht. Bei 16x16-Bit kommt also
ein 16-Bit Produkt raus, bei 32x32-Bit ein 32-Bit Produkt.

Noch schöner: Bei Multiplikation mit Vorzeichen ist das Ergebnis
undefiniert, wenn es nicht ins Format passt.

von TheMason (Gast)


Lesenswert?

mmh ... ok. das mit den operandengrößen krieg ich ja gerade noch so auf
die kette, aber warum funzt das dann nicht bei einer 32x32bit operation
(siehe 2.jpg). da ist der typecast für 64bit bei beiden operanden mit
drin, die operanden können keinen überlauf oder sonstiges undefiniertes
ergebnis liefern und trotzdem kommt nur müll raus ...

gruß
rene

von A.K. (Gast)


Lesenswert?

Yep, schaut wirklich interessant aus. Da wirst Du dir wohl mal den
generierten Code zur Brust nehmen müssen, genug davon hat er für die
64bit Mult ja erzeugt.

von TheMason (Gast)


Lesenswert?

allerdings ...
komme wohl nicht drum herum mir eine eigene routine dafür schreiben zu
müssen, zumal der generierte code wahrscheinlich viel zu lange braucht
(ausführungszeit).

da habe ich mal ne frage, wenn ich das ganze in assembler von hand
machen möchte. und zwar : muß ich erst beide werte (32bit) von signed
nach unsigned konvertieren, multiplizieren und dann wieder
rückkonvertieren oder gibt es da einen einfacheren weg ?!

gruß und dank
rene

von A.K. (Gast)


Lesenswert?

Du erwartest doch nicht wirklich, dass eine 64Bit Multiplikation
sauschnell ist? Zumal auf einem Prozessor, der dafür etwas zu wenig
Register hat.

von A.K. (Gast)


Lesenswert?


von TheMason (Gast)


Lesenswert?

hallo a.k.,

das die multiplikation nicht superschnell ist ist mir klar, zumal ich
ja eigentlich auch nur eine 32x32 bit signed multiplikation brauche
(den umweg über long long muß ich ja nur machen wegen der
operandengrößen) die mir ein 64bit ergebnis liefert. mir reicht es
schon wenn der das in 50 - 60 takten schafft, und das sollte doch
eigentlich machbar sein, da der r8c ja nen 16x16bit-hardware-multiplier
hat der 5 takte pro multiplikation braucht. sprich 4 * 5 takte für die
multiplikation, dann noch ca diesselbe anzahl takte für die addition
der 4 teil-produkte und nochmal 20 fürs konvertieren. kommt das in etwa
hin ?

denke für den link. werds mir mal anschauen.

gruß
rene

von Profi (Gast)


Lesenswert?

Beispiele, wie man eine 32x32-Multiplikation auf 8x8 zurückführt:
http://www.mikrocontroller.net/forum/read-1-343046.html?reload=yes#349964

auf 16x16 zurückführen ist ähnlich, nur einfacher.

von TheMason (Gast)


Lesenswert?

@profi

danke für den hinweis. mir ist schon (fast) klar wie das mit dem
aufteilen zu bewerkstelligen ist, aber ich hatte damals gehofft das
jemand mir ungefähr sagen kann mit vievielen taktzyklen ich etwa
rechnen muß, damit ich errechnen kann wie lange mein IIR Filter
braucht.
Spaßeshalber hab ich das ganze mit 16x16 probiert (auf nem msp430) und
es klingt (für die samplefrequenz von 8khz) halbwegs brauchbar.
jedenfalls filtert der filter :-)

gruß
rene

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.