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
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?
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...
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!
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.
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.
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...
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.
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.
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.
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. ^^
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)
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! ^^
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
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.