Forum: Mikrocontroller und Digitale Elektronik fmul == fmuls == fmulsu


von sep (Gast)


Lesenswert?

Hey, ich hab da mal eine blöde Frage.

Ist es so, das fmul, fmuls und fmulsu auf die gleiche "Funktion" 
arbeiten. Also, ich meine immer das selbe Ergebnis liefern und nur einen 
dokumentarischen Charakter haben, oder gibt es irgendwelche Fälle wo 
sich diese Funktionen unterscheiden. Denn so weit wie ich das bisher 
gesehen habe befindet sich ja die Festkommastelle immer zwischen dem 
6ten und dem 7ten Bit.

Danke schon mal.
Sep
von Rolf Magnus (Gast)


Lesenswert?

Da hilft vermutlich die Beschreibung des Instruction Sets des 
(unbekannten)  Prozessors weiter.
von sep (Gast)


Lesenswert?

Oh sry, ich mein allgemein das AVR Instruction Set Dokument. Also, Dort 
sind ja alle ATmegas und so mit enthalten. Bei mir speziell ist es der 
ATmega88P.
Aber mal rein logisch. Es werden keine Vorzeichenbits bei dem fmul(s/su) 
Befehlen benötigt. Weiterhin ist es ja bsp so das:

0,125 * 0,5 = -0,125 * -0,5 = | 0,125 * -0,5 |

usw usf. Oder stehe ich da irgendwie gerade auf dem Schlauch?
von Klaus W. (mfgkw)


Lesenswert?

Wenn ich das richtig sehe, haben FMULS und FMULSU denselben Code (0000 
0011 1ddd 1rrr).
Damit scheinen sie ziemlich gleich zu sein.

Zu FMUL:
1
...
2
Eine Multiplikation zweier Zahlen im Format N1.Q1 und N2.Q2
3
ergibt ein Ergebnis im Format (N1+N2).(Q1+Q2). N bedeutet dabei
4
die Anzahl der binären Stellen links vom Dezimalpunkt, Q bedeutet
5
die Anzahl der binären Stellen rechts vom Dezimalpunkt.
6
In Mikrocontroller-Anwendungen liegt der Input oft im Format 1.7,
7
womit sich ein Ergebnis im Format 2.14 ergibt. Ein Linksschieben
8
des Ergebnisses ermöglicht, dass das High- Byte des Ergebnisses
9
im gleichen Format wie der Input vorliegt.
10
Das 1.7 Format wird für gewöhnlich bei vorzeichenbehafteten Zahlen
11
verwendet, während FMUL eine Multiplikation vorzeichenloser Zahlen
12
durchführt. Daher wird FMUL für eine Teilmultiplikation von 16 Bit -
13
Zahlen im 1.15 Format verwendet, wenn ein Ergebnis im 1.31 Format
14
benötigt wird. Das Ergebnis der FMUL-Operation kann an einem
15
Zweierkomplement-Überlauf leiden, wenn das Ergebnis als eine Zahl
16
im 1.15 Format interpretiert wird. Das MSB des Ergebnisses vor dem
17
Linksschieben wird in das Carry-Flag gesichert.
18
Dieser Befehl ist nicht in allen Bausteinen verfügbar. Als
19
Operanden stehen nur die Register R16 bis R23 zur Verfügung.

Aus: 
http://www.avr-roboter.de/controller/befehle/uebersicht/uebersicht.html
von Arc N. (arc)


Lesenswert?

Klaus Wachtler schrieb:
> Wenn ich das richtig sehe, haben FMULS und FMULSU denselben Code (0000
> 0011 1ddd 1rrr).
> Damit scheinen sie ziemlich gleich zu sein.

http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf
1
FMULSU 0000 0011 1ddd 1rrr
2
FMULS  0000 0011 1ddd 0rrr
3
FMUL   0000 0011 0ddd 1rrr
4
                 ^    ^
von sep (Gast)


Lesenswert?

naja. Aber wie ist denn das mathematisch... (+/-) a * (+/-) b = |a|*|b| 
Oder etwa nicht? Da denn also die Vorzeichen ja nicht mit übergeben 
werden (also im MSB) und die Form der Zahlen ja immer gleich ist, denke 
ich das es sich nur um einen dokumentarischen Charakter handelt. Also, 
es erfolgt trotz unterschiedlichem Opcode die gleiche Schaltung... Ich 
weiß nu nicht, wie ich das anders ausdrücken soll...
von Klaus W. (mfgkw)


Lesenswert?

Arc Net schrieb:
> Klaus Wachtler schrieb:
>> Wenn ich das richtig sehe, haben FMULS und FMULSU denselben Code (0000
>> 0011 1ddd 1rrr).
>> Damit scheinen sie ziemlich gleich zu sein.
>
> http://www.atmel.com/dyn/resources/prod_documents/...FMULSU 0000 0011 1ddd 1rrr
> FMULS  0000 0011 1ddd 0rrr
> FMUL   0000 0011 0ddd 1rrr
>                  ^    ^

ups...
Sorry & Danke!
von Klaus W. (mfgkw)


Lesenswert?

sep schrieb:
> Da denn also die Vorzeichen ja nicht mit übergeben
> werden (also im MSB)

?
Wie kommst du darauf?
von (prx) A. K. (prx)


Lesenswert?

sep schrieb:

> Da denn also die Vorzeichen ja nicht mit übergeben werden

Manual Not Read Error.

0x80 = -1.0. Die Vorkommastelle ist bei Operanden mit Vorzeichen 
gleichzeitig auch das Vorzeichen.
von sep (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> sep schrieb:
>> Da denn also die Vorzeichen ja nicht mit übergeben
>> werden (also im MSB)
>
> ?
> Wie kommst du darauf?

Naja, wenn man sich die Doc anschaut von den Befehlen, dann ist es so 
dass alle eine 1.7 Struktur besitzen. Also Bit 7 gibt an ob die Zahl 
gößer als 1 ist. (Also 2^0) Bit 6 ist 2^(-1) Bit 5 ist 2^(-2) usw. Diese 
Struktur ist bei allen gleich. Ich sehe in der doc nichts von 
Vorzeichen. D.h. Die Struktur ist gleich nur die Opcodes unterscheiden 
sich.

Oder ich habe die Befehle FMUL, FMULS und FMULSU ein bisschen falsch 
verstanden.
von sep (Gast)


Lesenswert?

A. K. schrieb:
> 0x80 = -1.0. Die Vorkommastelle ist bei Operanden mit Vorzeichen
> gleichzeitig auch das Vorzeichen.

genauso ist 0x80 bei FMUL = 1 und 0x40 ist bei FMUL 0.5 bzw bei FMULS 
-0.5
Die Struktur der Zahlen ist doch somit gleich. Nur das die verschieden 
interpretiert werden...
von (prx) A. K. (prx)


Lesenswert?

sep schrieb:

> Die Struktur der Zahlen ist doch somit gleich. Nur das die verschieden
> interpretiert werden...

Eben, und genau das macht den Unterschied aus.

Wir sind es zwar gewohnt, dass Addition und Subtraktion sich nicht dafür 
interessieren, ob die Operanden mit oder ohne Vorzeichen gemeint sind 
(*). Aber bei der Multiplikation NxN => 2N trifft das nicht zu. Nur die 
untere Hälfte vom Ergebnis ist nicht von der Vorzeicheninterpretation 
abhängig, die obere hingegen schon.

Zieh das mal von Hand für 8x8=>16 Bits durch, indem du beide Operanden 
auf 16 Bits entsprechend vorzeichenerweiterst und dann rechnest.

Die FMUL (1,7)x(1,7) => (1,15) Befehle unterscheiden sich nur durch die 
abschliessende Schiebeoperation von den MUL 8x8 => 16 Befehlen.

*: Für das 9. Bit trifft das auch hier nicht mehr zu. Das gibts deshalb 
zweimal, als Carry und als Overflow.
von sep (Gast)


Lesenswert?

naja. Aber sie werden ja nicht bei der Auswertung des Befehls anders 
interpretiert. Denn, es ist ja egal, ob ich -a oder a mit -b oder b 
multipliziere. Im Betrag kommt immer das selbe raus. Da das Vorzeichen 
ja nicht mit übergeben wird, sondern nur am Befehl hängt und man sich ja 
denken kann das zwei negative Zahlen multipliziert wieder eine positive 
ergeben, oder zwei positive Zahlen ja auch wieder eine positive Zahl 
ergeben, oder aber eine positive und eine negative Zahl eine negative 
ergeben, kann doch immer nur via einem Befehl gerechnet werden... Also, 
ob ich nun:

>  1.5 *  0.5 =  0.75
> -1.5 * -0.5 =  0.75
> -1.5 *  0.5 = -0.75

rechne. Das Ergebnis ist doch im Betrag immer das gleiche. Die einzelnen 
Befehle geben als Bitmuster auch das Gleiche aus. (Bei gleicher Eingabe) 
Also, die Interpretation obliegt doch dem Programmierer. Also könnte man 
doch bei allen drei Fällen jeweils nur auf das FMUL zurück greifen.
von (prx) A. K. (prx)


Lesenswert?

sep schrieb:

> Da das Vorzeichen
> ja nicht mit übergeben wird, sondern nur am Befehl hängt

Wir sind hier in der Technik, nicht in der Politik, d.h. der Satz wird 
durch ständige Wiederholung nicht richtiger. ;-)

0x40 ist positiv, egal ob FMUL oder FMULS.
0xC0 ist bei FMUL positiv, bei FMULS negativ.
von sep (Gast)


Lesenswert?

A. K. schrieb:
> Wir sind hier in der Technik, nicht in der Politik, d.h. der Satz wird
> durch ständige Wiederholung nicht richtiger. ;-)

Jo, stimmt wohl. :D

Aber ich habe doch bei gleichen Bitmustern in den Registern Rd und Rr 
bei FMUL, FMULS und FMULSU das gleiche Bitmusster als Ergebnis in R0:R1, 
oder ist das nicht so? Wenn nicht, dann würd ich gerne mal ein 
Gegenbeispiel haben. ^^
von (prx) A. K. (prx)


Lesenswert?

Hatte ich grad geliefert.

Vorsicht Falle: Die Festkommadarstellung ist nicht Sign-Magnitude wie 
bei Fliesskommadarstellung, sondern weiterhin Zweierkomplement, also
   0x80 (-1.0) < 0x81 < 0x82 ... < 0xFF < 0x00 ... < 0x7F (fast 1.0)
von sep (Gast)


Lesenswert?

Jop, hatte ich gerade ein bisschen überlesen, bzw vorschnell 
geantwortet. Danke nochmal der Erklärung. Dann muss ich noch mal ein 
bisschen experimentieren und vielleicht gehts dann auch in den Geist 
über! ^^
von Noname (Gast)


Lesenswert?

Offen gesagt bin ich bei der Interpretation der Zahlenformate und der 
Befehle auch unsicher. Wäre vielleicht einer so nett, das mit ein 
bisschen Systematik mal für Dummies zu beschreiben?
Ich weiss nicht ob das Schema passt, aber ich stelle mir das ungefähr so 
vor.


1.Operand   2.Operand   FMUL            FMULS          FMULSU
0x00        0x00        0*0=0x0000
0x00        0x0F
0x00        0x80
0x00        0x8F
0x0F        0x00
0x0F        0x0F
0x0F        0x80
0x0F        0x8F
0x80        0x00                        -1*
0x80        0x0F                        -1*
0x80        0x80                        -1*-1=0x0001?
0x80        0x8F                        -1*
0x8F        0x00
0x8F        0x0F
0x8F        0x80
0x8F        0x8F
von (prx) A. K. (prx)


Lesenswert?

sep schrieb:

> dann würd ich gerne mal ein Gegenbeispiel haben.

Mit MUL,MULS:

MUL:  0x81*0x81 = 0x0081*0x0081 = 0x4101
MULS: 0x81*0x81 = 0xFF81*0xFF81 = 0x3F01

Bei FMULx kommt nur die Anpassung (2,14) => (1,15) hinzu.
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.