fmul == fmuls == fmulsu

Gast #2445134
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
Gast #2445154
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?
#2445198
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
Gast #2445230
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...
Gast #2445249
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.
Gast #2445253
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...
#2445257
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.
Gast #2445269
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.
Gast #2445280
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. ^^
Gast #2445287
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! ^^
Gast #2445290
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren