mikrocontroller.net

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


Autor: TheMason (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Marko B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier mal

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

Autor: TheMason (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiele, wie man eine 32x32-Multiplikation auf 8x8 zurückführt:
http://www.mikrocontroller.net/forum/read-1-343046...

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

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.