Seite 1 von 1

Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 12:16
von mister_tt
Moin,

Code: Alles auswählen

.data
Number: .double 8589934591.

.text
l.d $f0, Number
cvt.w.d $f4, $f0
Nach meinem Verständnis dieser *** cvt-Befehlen müsste in $f0 anschließend der Integer-Wert von meiner Number 8589934591 stehen... Dem ist aber nicht so. Was wird da berechnet?

Für jedwede Hilfe bin ich dankbar.
Viele Grüße,
Simon

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 13:45
von AlexPi11
Edit: vorher stand hier Quarck

cvt.w.d liefert die Ganzzahl vor dem Komma als integer im 2ten Register. Also so sieht es zumindest aus, wenn man ein wenig im MIPS spielt.

Edit2:
Probleme bei deiner Zahl werden wohl entehen, da sie nicht in ein 32bit-Register passt (2^32 = 4294967296 < 8589934591)

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 13:55
von mister_tt
... und genau das will ich doch!?

Es funktioniert soweit auch, wenn die Zahl < (2^31 - 1) ist, d.h. in einem Register darstellbar. Wenn sie größer ist, würde ich erwarten, dass der Befehl die Integer-Zahl auf zwei Register aufsplittet (wie es bei Doubles ja auch gemacht wird)... Dem ist wohl nicht so?

Blöd, da ich die Mantisse auf dem Coprozessor in eine Ganzzahl umwandele (multiplizieren mit 2^(2s)) und dann gerne wieder auf dem normalen Prozessor haben würde, um die Wurzel zu berechnen... :?:

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 14:06
von AlexPi11
Man braucht auch kein cvt.w.d
Die Mantisse steht ja in den f-Registern auf 52 Bit veteilt. Man muss also nur den unnötigen Teil (Exponent z.B.) loswerden und eventuell eine 1 vorne anhängen.

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 14:06
von hm
Kriegt man das vielleicht mit den Hi und Lo Registern irgendwie gedeichselt?

Aber: wie kommst Du denn auf das s?

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 14:11
von ivoch
mister_tt hat geschrieben:Moin,

Code: Alles auswählen

.data
Number: .double 8589934591.

.text
l.d $f0, Number
cvt.w.d $f4, $f0
Nach meinem Verständnis dieser *** cvt-Befehlen müsste in $f0 anschließend der Integer-Wert von meiner Number 8589934591 stehen... Dem ist aber nicht so. Was wird da berechnet?

Für jedwede Hilfe bin ich dankbar.
Viele Grüße,
Simon
Der Integer-Wert steht nach Ausführen von cvt.w.d $f4, $f0 nicht in $f0, sondern in $f4. :wink:

Schau dir nochmal was in $f4 steht und überleg dir dann - passt deine Zahl überhaupt in einem 32-bit Integer-Register rein?

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 14:21
von AlexPi11
Also wir sind einfach davon ausgegangen, dass es immer 52 Nachkommastellen sind.
Man könnte auch durch Shiften und Vergleiche rausfinden, wieviele Nachkommastellen man ohne 0er am Ende hat.

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 14:51
von mister_tt
ivoch hat geschrieben:Schau dir nochmal was in $f4 steht und überleg dir dann - passt deine Zahl überhaupt in einem 32-bit Integer-Register rein?
Ne schon klar, nicht in ein 32-Bit-Register... Habe ich ja dann noch geschrieben... Frage dann: Was passiert wenn es nicht in ein Register passt?

Re: Praktikum 2 - Problem mit Gleitkomma-Konversion

Verfasst: 29. Nov 2009 15:18
von mister_tt
Ich präzisiere nochmal meine Frage von vorhin... Ich muss ja irgendwann mal Mantisse * 2^(2s) berechnen. Dies mache ich auf dem Coprozessor. Um die Wurzel ziehen zu können, brauche ich diese Zahl, die aber ja potentiell nicht mehr in ein Register passt, wieder auf dem normalen Prozessor als "normale" Integer (dann halt in zwei auf einander folgenden Registern)... Wie kann ich das machen? :?

Danke für eure Hilfe...