Esercizio Floating Point

~Rose16
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)

Risposte
Rggb1
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.

~Rose16
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!

hamming_burst
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

~Rose16
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 :shock:

hamming_burst
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 :-)

~Rose16
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? :(

hamming_burst
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 :-)

hamming_burst

(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...

Rggb1
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.

~Rose16
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!

hamming_burst
"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 :-)

Rggb1
"~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. :-D

~Rose16
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 :shock: E chi se n'era accorto... meno male che il prof è stato così gentile da rispondermi! grazie anche a voi u.u

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.