Esercizio Floating Point
Bene, dopo la codifica bit pair, ecco un altro dubbio... Premetto che ho compreso il metodo per sommare due numeri floating point, eppure... Passo a spiegarvi il problema.
Ho questi due numeri FP, codificati in simil IEEE a 12 bit (1 bit segno, 5 esponente, 6 mantissa), per risparmiarvi tempo, il bias è 15, se può servire
280, in floating point 0 10111 000110 (l'esponente codificato è 23)
3.33 in floating point 0 10000 101010 (l'esponente codificato è 16)
Devo farne la sottrazione, quindi porto tutto all'esponente maggiore (23-16=7, shifto a dx di 7 posizioni la mantissa del 3.33 che ha l'esponente minore)
0000000101010 e qui nasce il problema, devo troncare la coda della mantissa perchè deve stare su 6 cifre, ottengo quindi
000 000 come mantissa di 3.33
Sottraggo le mantisse
000110-
000000
---------
000110
Quindi il numero ottenuto dovrebbe essere 0 10111 000110 che è sbagliato, perchè è ancora 280... Dov'è che sbaglio? Ho seguito varie guide su internet, alcune anche in inglese ma non risolvo il problema... Mi affido a voi!
(se può essere utile ne posto anche un altro che ho provato a fare, sempre con la stessa codifica)
0.25 in floating point 0 01101 000000 (esp codificato 13)
-0.012 in floating point 1 01000 100010 (esp codificato 8)
13-8=5, shifto la mantissa di -0.012 di 5 posizioni verso dx, ottenendo 000001
Sommo le mantisse
000000+
000001
----------
ooooo1
Dovrei ottenere quindi 0 011101 000001, ma la soluzione del prof è 0 01101 100000.... Vi prego illuminatemi perchè sto diventando matta... I numeri sono giusti perchè le moltiplicazioni mi riescono correttamente (e nelle soluzioni coincidono con quelle del professore)
Ho questi due numeri FP, codificati in simil IEEE a 12 bit (1 bit segno, 5 esponente, 6 mantissa), per risparmiarvi tempo, il bias è 15, se può servire
280, in floating point 0 10111 000110 (l'esponente codificato è 23)
3.33 in floating point 0 10000 101010 (l'esponente codificato è 16)
Devo farne la sottrazione, quindi porto tutto all'esponente maggiore (23-16=7, shifto a dx di 7 posizioni la mantissa del 3.33 che ha l'esponente minore)
0000000101010 e qui nasce il problema, devo troncare la coda della mantissa perchè deve stare su 6 cifre, ottengo quindi
000 000 come mantissa di 3.33
Sottraggo le mantisse
000110-
000000
---------
000110
Quindi il numero ottenuto dovrebbe essere 0 10111 000110 che è sbagliato, perchè è ancora 280... Dov'è che sbaglio? Ho seguito varie guide su internet, alcune anche in inglese ma non risolvo il problema... Mi affido a voi!
(se può essere utile ne posto anche un altro che ho provato a fare, sempre con la stessa codifica)
0.25 in floating point 0 01101 000000 (esp codificato 13)
-0.012 in floating point 1 01000 100010 (esp codificato 8)
13-8=5, shifto la mantissa di -0.012 di 5 posizioni verso dx, ottenendo 000001
Sommo le mantisse
000000+
000001
----------
ooooo1
Dovrei ottenere quindi 0 011101 000001, ma la soluzione del prof è 0 01101 100000.... Vi prego illuminatemi perchè sto diventando matta... I numeri sono giusti perchè le moltiplicazioni mi riescono correttamente (e nelle soluzioni coincidono con quelle del professore)
Risposte
Mi sa che nel fare lo shift ti sei scordata di considerare il '1' preimpostato all'inizio della mantissa; inoltre non hai tenuto conto dell'arrotondamendo.
Prova a vedere i numeri floating-point in binario (ovviamente non vale per lo zero) in questo modo:
$280=1.00011$ con esponente da $2^8=256$, quindi $256*1+128*0+64*0+32*0+16*1+8*1$
il primo uno della mantissa è preimpostato, la mantissa di sei bit parte da dopo la virgola e quindi - correttamente - ti viene 000110.
$3.33=1.101010101...$ che parte da esponente $2^1=2$, la mantissa su sei bit viene 101010 troncata ma con l'arrotondamento 101011
Prova a ricalcolare tenendo presente tutto questo.
Prova a vedere i numeri floating-point in binario (ovviamente non vale per lo zero) in questo modo:
$280=1.00011$ con esponente da $2^8=256$, quindi $256*1+128*0+64*0+32*0+16*1+8*1$
il primo uno della mantissa è preimpostato, la mantissa di sei bit parte da dopo la virgola e quindi - correttamente - ti viene 000110.
$3.33=1.101010101...$ che parte da esponente $2^1=2$, la mantissa su sei bit viene 101010 troncata ma con l'arrotondamento 101011
Prova a ricalcolare tenendo presente tutto questo.
Ma se devo shiftare la mantissa verso destra di 7 posizioni, ottengo 7 zeri e con la mantissa ristretta a 6 bit in pratica mi si "annulla"... Comunque non ho capito bene la storia dell'arrotondamento, come si fa?... Nella moltiplicazione tra 280 e 3.33 ho usato la mantissa non arrotondata e il risultato viene giusto...
Comunque anche usando la mantissa 1.101010, devo aggiungere 7 zeri prima ottenendo 0.0000001101010, potendo tenere solo 6 bit nella mantissa devo prendere la parte in grassetto che è ancora nulla!
Comunque anche usando la mantissa 1.101010, devo aggiungere 7 zeri prima ottenendo 0.0000001101010, potendo tenere solo 6 bit nella mantissa devo prendere la parte in grassetto che è ancora nulla!
Ciao,
In aggiunta a ciò che ha ben detto Rggb, cioè che una mantissa avendo il primo bit nascosto, devi aggiungerlo in posizioni più significativa alla mantissa della codifica FP, e poi shiftare (se necessario).
Una volta messo ad esponente comune (al più grande), e shiftato la mantissa, quello che NON devi fare è tagliare a 6 bit, lascia l'intero numero risultante.
Prendi le tue mantisse risultanti dallo shift (perciò può essere maggiore 6 bit) e li sommi. Il risultato lo normalizzi su 6 bit, e se necessario sistemi l'esponente (+ BIAS).
Se hai dubbi, basta chiedere
PS: per l'arrotondamento è una questione che non si pone se sommi/sottrai, prima di normalizzare...
EDIT:
sistemato errori
In aggiunta a ciò che ha ben detto Rggb, cioè che una mantissa avendo il primo bit nascosto, devi aggiungerlo in posizioni più significativa alla mantissa della codifica FP, e poi shiftare (se necessario).
Una volta messo ad esponente comune (al più grande), e shiftato la mantissa, quello che NON devi fare è tagliare a 6 bit, lascia l'intero numero risultante.
Prendi le tue mantisse risultanti dallo shift (perciò può essere maggiore 6 bit) e li sommi. Il risultato lo normalizzi su 6 bit, e se necessario sistemi l'esponente (+ BIAS).
Se hai dubbi, basta chiedere

PS: per l'arrotondamento è una questione che non si pone se sommi/sottrai, prima di normalizzare...
EDIT:
sistemato errori
Il primo esercizio, così facendo mi è venuto, ne riporto anche la soluzione:
1.000110*2^8
1.101010*2^1 ---> 0.0000001101010
1.0001100000000-
0.0000001101010
--------------------
1.0001010010110
che corrisponde alla mantissa della soluzione del prof...
L'altro invece non vuole saperne di uscire! anche mantenendo il primo bit viene così:
1.000000*2^-2
1.100010*2^-7 ---> porto alla -2 che viene 0.00001100010*2^-2
Sommo
0.00001100010+
1.00000000000
-----------------
1.00001100010 ma secondo il prof la mantissa deve venire 100000... mistero!
Intanto vi ringrazio perchè mi avete tolto da un brutto pasticcio
1.000110*2^8
1.101010*2^1 ---> 0.0000001101010
1.0001100000000-
0.0000001101010
--------------------
1.0001010010110
che corrisponde alla mantissa della soluzione del prof...
L'altro invece non vuole saperne di uscire! anche mantenendo il primo bit viene così:
1.000000*2^-2
1.100010*2^-7 ---> porto alla -2 che viene 0.00001100010*2^-2
Sommo
0.00001100010+
1.00000000000
-----------------
1.00001100010 ma secondo il prof la mantissa deve venire 100000... mistero!
Intanto vi ringrazio perchè mi avete tolto da un brutto pasticcio

piccola nota (a memoria):
- esponente postivo -> shift destro che equivale a dividere
- esponente negativo -> shift sinistro che equivale a moltiplicare
prendere l'esponente più grande mi sembra sia valido in entrambi i casi. Ma se la notazione è equivalente della notazione scentifica decimale, la base è quella.
E' da un po' che non faccio conti con FP perciò prova, così vediamo
- esponente postivo -> shift destro che equivale a dividere
- esponente negativo -> shift sinistro che equivale a moltiplicare
prendere l'esponente più grande mi sembra sia valido in entrambi i casi. Ma se la notazione è equivalente della notazione scentifica decimale, la base è quella.
E' da un po' che non faccio conti con FP perciò prova, così vediamo

In pratica dovrei shiftare a sinistra giusto? Provo:
1.000000*2^-2
1.100010*2^-7----> 110010.0 *2^-2
1.000000+
110010.000000
-----------------
110010.000000
normalizzo 1.10010.... niente da fare! Altri suggerimenti?
1.000000*2^-2
1.100010*2^-7----> 110010.0 *2^-2
1.000000+
110010.000000
-----------------
110010.000000
normalizzo 1.10010.... niente da fare! Altri suggerimenti?

lascia stare quanto detto sopra, è equivalente perchè si va ad esponente comune, ma meglio andare in modo standard...
Penso che quello fatto dal tuo professore sia sbagliato (prova a calcolare il numero risultante in decimale convertendolo in FP, così vedi subito)
Prendi l'esponente più piccolo (-7) lo trasli di 5 posizioni, e sommi.
1.0000000000+
0.0000110001
-----------------
1.0000110001
$1.000011 * 2^-2$
Fammi vedere i numeri completi con S Exp Mantissa che vorrei vedere na cosa
Penso che quello fatto dal tuo professore sia sbagliato (prova a calcolare il numero risultante in decimale convertendolo in FP, così vedi subito)
Prendi l'esponente più piccolo (-7) lo trasli di 5 posizioni, e sommi.
1.0000000000+
0.0000110001
-----------------
1.0000110001
$1.000011 * 2^-2$
Fammi vedere i numeri completi con S Exp Mantissa che vorrei vedere na cosa

(se può essere utile ne posto anche un altro che ho provato a fare, sempre con la stessa codifica)
0.25 in floating point 0 01101 000000 (esp codificato 13)
-0.012 in floating point 1 01000 100010 (esp codificato 8)
13-8=5, shifto la mantissa di -0.012 di 5 posizioni verso dx, ottenendo 000001
Sommo le mantisse
000000+
000001
----------
ooooo1
Dovrei ottenere quindi 0 011101 000001, ma la soluzione del prof è 0 01101 100000.... Vi prego illuminatemi perchè sto diventando matta... I numeri sono giusti perchè le moltiplicazioni mi riescono correttamente (e nelle soluzioni coincidono con quelle del professore)
ma scusa è lo stesso esercizio questo che non ti viene? Esponenti -7 e -2 non ne vedo...
E' lo stesso, -7 e -2 normalizzati sono risp. 8 e 13 (il bias è 15, come correttamente calcolato).
Anche secondo me il risultato indicato per il secondo esercizio non va bene (c'è un refuso da qualche parte?) chiedi al/la docente.
Anche secondo me il risultato indicato per il secondo esercizio non va bene (c'è un refuso da qualche parte?) chiedi al/la docente.
Mah, a questo punto spero che abbia sbagliato il prof perchè sennò siamo in 3 ad aver sbagliato e mi pare un pò strano... proverò a mandare una mail, vi farò sapere cosa dice!
"Rggb":
E' lo stesso, -7 e -2 normalizzati sono risp. 8 e 13 (il bias è 15, come correttamente calcolato).
ah si intendevo che, per fare i calcoli non serve sottrarre il BIAS e poi utilizzare il vero esponente, ma basta utilizzare il l'esponente codificato.
Se si calcola l'esponente di ogni numero (sottraendo il BIAS), bisogna ricordardi di aggiungerlo alla fine dei calcoli

"~Rose":
proverò a mandare una mail, vi farò sapere cosa dice!
Prova, prova pure. Al massimo, se ci è sfuggito qualcosa, ti dirà che i poponi sono tre invece di uno solo.

Scusate il ritardo, non sono più passata di qui perchè ho deciso di rimandare l'esame, ma la risposta tanto attesa è........ che -0.012 è negativo, quindi in realtà anche la seconda operazione è una sottrazione e non una addizione
E chi se n'era accorto... meno male che il prof è stato così gentile da rispondermi! grazie anche a voi u.u
