[MIPS] Somma di due numeri formato IEEE754
Salve, sto facendo degli esercizi di "architettura degli elaboratori" e mi trovo davanti a questo quesito:
Scrivere un programma MIPS per calcolare la somma di A e B, supponendo che siano memorizzati nel formato IEEE 754.
(‐1)S•(1+m)•2(e ‐ polarizzazione)
Sapete dirmi la soluzione? Come faccio a gestire con le istruzioni previste dal MIPS numeri nel formato IEEE754. Immagino debba controllare il "peso" dell'esponente ed eventualmente convertire uno dei due numeri. O sono fuori traccia?
Avete qualche idea?
Grazie!
Scrivere un programma MIPS per calcolare la somma di A e B, supponendo che siano memorizzati nel formato IEEE 754.
(‐1)S•(1+m)•2(e ‐ polarizzazione)
Sapete dirmi la soluzione? Come faccio a gestire con le istruzioni previste dal MIPS numeri nel formato IEEE754. Immagino debba controllare il "peso" dell'esponente ed eventualmente convertire uno dei due numeri. O sono fuori traccia?
Avete qualche idea?
Grazie!
Risposte
Ora li devi sommare, converti A e B in decimale, li sommi normalmente e poi converti il risultato in esadecimale.
[OT]
Rggb: 1.48 AM
ramy1989: 1.59 AM
gli informatici sono tutti nottambuli

[/OT]
Rggb: 1.48 AM
ramy1989: 1.59 AM
gli informatici sono tutti nottambuli


[/OT]
"hamming_burst":
ma che è: gli informatici sono tutti nottambuli![]()
Per definizione, l'hacker è nottambulo.

"Rggb":
Vedi anche i link che avevo postato prima, mi sembra ben spiegato.
Avevo già letto quel link però non mi è chiaro perchè gli esponenti sono a 4 bit e non 8. In ogni caso mi è sembrato irrilevante ai fini dell'apprendimento del procedimento... che ho applicato in questo modo:
\(A = 1.001011 \cdot 2^7\)
\(B = 1.1111 \cdot 2^6\)
Allineo quindi il numero con l'esponente più piccolo al numero con l'esponente più grande:
\(A = 1.001011 \cdot 2^7\)
\(B = 0.11111 \cdot 2^7\)
Eseguo la somma delle mantisse:
\(A = 1.001011 +\)
\(B = 0.11111\)
Ed ottengo:
\(10.001001 \cdot 2^7\)
che diventa...
\(1.0001001 \cdot 2^8\)
E adesso? E il segno?
Quel link non lo menziona proprio!
"ramy1989":
Ora li devi sommare, converti A e B in decimale, li sommi normalmente e poi converti il risultato in esadecimale.
Eh no... era troppo facile così! L'esercizio non chiedeva questo!
Grazie comunque per il suggerimento

"smartmouse":
...
\(A = 1.001011 \cdot 2^7\)
\(B = 0.11111 \cdot 2^7\)
ok.
Eseguo la somma delle mantisse:
.... Nì
E adesso? E il segno?
ma scusa pensasi un attimo, le operazioni in notazione scientifica decimale e binaria sono le stesse. Come sommeresti due numeri decimali?
tipo:
$3*10^1$
$-4*10^1$
è più facile di quanto pensi.

"hamming_burst":
[quote="smartmouse"]
...
\(A = 1.001011 \cdot 2^7\)
\(B = 0.11111 \cdot 2^7\)
ok.
Eseguo la somma delle mantisse:
.... Nì
E adesso? E il segno?
ma scusa pensasi un attimo, le operazioni in notazione scientifica decimale e binaria sono le stesse. Come sommeresti due numeri decimali?
tipo:
$3*10^1$
$-4*10^1$
è più facile di quanto pensi.

Il risultato sarebbe
\(-1 * 10^1\)
Ma non capisco cosa c'entra con il mio esercizio. Non devo fare la somma delle 2 mantisse?
"smartmouse":
Il risultato sarebbe
\(-1 * 10^1\)
Ma non capisco cosa c'entra con il mio esercizio. Non devo fare la somma delle 2 mantisse?
semplicemente, come nelle operazioni elementari in decimale, nella somma consideri anche il segno.
Lo hai fatto anche con l'esempio banale che ti ho proposto, invece di sommare, sottrai perchè un numero è negativo:
$3 + (-4) = 3 - 4 = -1$
Nel tuo caso:
$A= -1.001011*2^7$
$B= +0.11111*2^7$
$-1.001011+$
$+0.11111$
o se vuoi più intuitivo, sottrai invertendo gli operandi:
$0.11111-$
$1.001011$
penso sia chiaro ora, ricorda che le operazioni sono le stesse che hai imparato alle elementari

"hamming_burst":
[quote="smartmouse"]
Il risultato sarebbe
\(-1 * 10^1\)
Ma non capisco cosa c'entra con il mio esercizio. Non devo fare la somma delle 2 mantisse?
semplicemente, come nelle operazioni elementari in decimale, nella somma consideri anche il segno.
Lo hai fatto anche con l'esempio banale che ti ho proposto, invece di sommare, sottrai perchè un numero è negativo:
$3 + (-4) = 3 - 4 = -1$
Nel tuo caso:
$A= -1.001011*2^7$
$B= +0.11111*2^7$
$-1.001011+$
$+0.11111$
o se vuoi più intuitivo, sottrai invertendo gli operandi:
$0.11111-$
$1.001011$
penso sia chiaro ora, ricorda che le operazioni sono le stesse che hai imparato alle elementari

No scusami, ma ancora non mi è chiaro

Per effettuare la somma tra due numeri di segno discorde non devo effettuare il complemento a 2 al numero negativo?
In entrambi i modi che mi hai detto, comunque effettuo la somma (sottrazione) tra due numeri binari senza tener conto del segno...
"smartmouse":
No scusami, ma ancora non mi è chiaro
Per effettuare la somma tra due numeri di segno discorde non devo effettuare il complemento a 2 al numero negativo?
In entrambi i modi che mi hai detto, comunque effettuo la somma (sottrazione) tra due numeri binari senza tener conto del segno...
qua non si parla di complementi e cose simili, ma di somme elementari (non credo che togliendo momentaneamente la virgola si può codificare il numero, ora mi pare un'assurdità ma ci dovrei pensare).
il segno è ovvio che devi tenerlo in considerazione, pensa in decimale:
$(+1) + (-2) = (-2) + (+1) = -2 + 1 = 1 - 2 $
questa si chiama commutatività rispetto la somma o sottrazione e vale sia in decimale che binario e guarda che io parlo di operazioni elementari, il complemento a due funziona con gli interi (sempre che non si possa togliere momentaneamente la virgola anche se ripeto mi pare non possibile).
ripensaci e ne riparliamo se vuoi, ma è una cosa più semplice di quanto stai scrivendo.
La mia obiezione nasce dal fatto che ho la soluzione di questo esercizio: http://www.megaupload.com/?d=VWES70F4
Dato che non l'avevo capita ho chiesto qui... vediamo se riusciamo a tirarne fuori una regola... che si applica nel caso di somma tra numeri in virgola mobile (con esponente e segno diverso!).
Dato che non l'avevo capita ho chiesto qui... vediamo se riusciamo a tirarne fuori una regola... che si applica nel caso di somma tra numeri in virgola mobile (con esponente e segno diverso!).
"hamming_burst":
(non credo che togliendo momentaneamente la virgola si può codificare il numero, ora mi pare un'assurdità ma ci dovrei pensare).
...
(sempre che non si possa togliere momentaneamente la virgola anche se ripeto mi pare non possibile).
ok, sono andato a controllare, avevo un vago ricordo ma non ne ero sicuro. Si può usare il complemento a due togliendo momentaneamente la virgola, basta ricordarsi di metterla dopo, scusa non ricordavo bene questo particolare

"smartmouse":
La mia obiezione nasce dal fatto che ho la soluzione di questo esercizio: http://www.megaupload.com/?d=VWES70F4
Dato che non l'avevo capita ho chiesto qui... vediamo se riusciamo a tirarne fuori una regola... che si applica nel caso di somma tra numeri in virgola mobile (con esponente e segno diverso!).
il link non è disponibile (soliti problemi temporanei di megaupload!!), ti dirò qualcosa quando è scaricabile.
Allora ho visto il link e fa esattamente quanto ho scritto, tiene conto del segno.
Ti dice esattamente:
io ti ho proposto solamente la somma/sottrazione elementare senza codifiche di sorta ed è la STESSA cosa, qui semplicemente utilizzi la più comoda codifica.
Forse ti manca un passaggio:
visto che è un numero negativo aggiungi un bit, ma la mantissa non è codificata (è RAW se vuoi). In complemento a due un numero negativo NON è un numero dove aggiungi semplicemente un bit più significativo $1$ (questo è il modulo e segno), perciò per codificare correttamente la mantissa in complemento a due devi:
- prendi la parte frazionaria senza exp: $1.001011$
- lo leggi come intero ed aggiungi un bit positivo $01001011$
- lo codifichi in complemento a due se il segno in float in point è negativo.
- poi sommi
chiaro ora?
Ti dice esattamente:
"A è negativo e quindi eseguo il complemento a due aggiungendo un bit per il segno"
A=10.110101 B=...
io ti ho proposto solamente la somma/sottrazione elementare senza codifiche di sorta ed è la STESSA cosa, qui semplicemente utilizzi la più comoda codifica.
Forse ti manca un passaggio:
visto che è un numero negativo aggiungi un bit, ma la mantissa non è codificata (è RAW se vuoi). In complemento a due un numero negativo NON è un numero dove aggiungi semplicemente un bit più significativo $1$ (questo è il modulo e segno), perciò per codificare correttamente la mantissa in complemento a due devi:
- prendi la parte frazionaria senza exp: $1.001011$
- lo leggi come intero ed aggiungi un bit positivo $01001011$
- lo codifichi in complemento a due se il segno in float in point è negativo.
- poi sommi
chiaro ora?
Si, ora è molto più chiaro... però non era proprio immediato come ragionamento!
Grazie di tutto!
Grazie di tutto!