[Binario] Conversione da virgola mobile a virgola fissa

smartmouse
Salve, ho il seguento numero binario espresso nella notazione a virgola mobile...

\(10111110011011000000000000000000\)

...da rappresentare nella notazione a virgola fissa.

Ditemi se ho fatto bene per favore:

Seguendo la formula \((-1)^S \cdot (1 + m) \cdot 2^{e-polarizzazione}\)
dove "S" sta per il bit del segno, "m" per la mantissa, "e" per l'esponente e "polarizzazione" per il valore 127, ottengo:

Segno = \(1\)
Esponente = \(01111100_{2} = 124_{10}\)
Mantissa = \(0,0011011_{2} = 0,2109375_{10}\)

= \((-1)^1 \cdot (1 + 0,2109375) \cdot 2^{124-127}\) =
= \(-1,2109375 \cdot 2^{-3}\) =

Fin qui ho trasformato da binario virgola mobile in decimale, mi dite se è corretto per favore?

Risposte
smartmouse
Ho reso il post più leggibile (non avevo usato i tag per visualizzare correttamente le formule) ed ho corretto quella che credo sia la soluzione al quesito.

Per favore c'è qualcuno che può dirmi se l'esercizio è stato svolto correttamente?

Grazie.

hamming_burst
se è in virgola fissa devi fissare un punto per separare parte intera da parte frazionaria, mi sembra tu non lo abbia scritto (è una banalità) :-)

smartmouse
"hamming_burst":
se è in virgola fissa devi fissare un punto per separare parte intera da parte frazionaria, mi sembra tu non lo abbia scritto (è una banalità) :-)

Scusa, non ho capito cosa dovevo fare...

smartmouse
Ho aggiornato ancora una volta il primo post, credo fosse sbagliata la soluzione.
Ora l'ho corretta, c'è qualcuno che capisce l'argomento che sa dirmi se ho fatto bene? Grazie.

hamming_burst
Allora vediamo di riniziare.

il numero in virgola mobile spezzato è
\(1\ 01111100\ 11011000000000000000000\)

per trasformarlo in decimale:
Segno = \(1\) ok
Esponente = \(01111100_{2} = 124_{10}\) ok BIAS: 127
Mantissa = \(0,0011011_{2} = 0,2109375_{10}\)

perchè mai 0.00??

la mantissa è la parte frazionaria con un bit implicito perciò diventa:
\(1.11011000000000000000000\)

nella tua formula lo aggiungi implicitamente con $1+m$ ma è meglio sepere il perchè di questa somma.
La mantissa viene trasformata in decimale attraverso moltiplicazioni successive perciò:
\(1.11011000000000000000000 = 1 + \frac{1}21 + \frac{1}41 + \frac{1}80 + \frac{1}{16}1 + \frac{1}{32}1 + \frac{1}{64}0 ... = \sum_{i=0}^{|m|} \frac{1}{2^i}*m = 1.84375\)

ora aggreghiamo le altre informazioni segno+esponente+mantissa = \(- 1.84375 * 2^{124-127} = - 1.84375 * 2^{-3} = -0,23046875\)

il tuo errore? ti dimentichi del bit implicito, applicando l'esponente (notazione scientifica) prima dell'aggiunta dell'unità e convertendo (ricorda che se c'è esponente (BIAS) c'è stata normalizzazione).

La formula è ben corretta, io ho solo spezzato nettamente i passaggi:
- calcolo segno
- calcolo esponenente: sottrazione dall'esponente il bias ("polarizzazione" non è bello da leggersi)
- calcolo della mantissa: trasformazione in decimale ricordando l'unità implicita

aggreggare il tutto.
Ora per trasformarlo in virgola fissa, è semplice:
- trasformi in binario la parte intera (divisioni successive)
- trasformi in binario la parte frazionaria (moltiplicazioni successive)

prova. Oppure esiste una strada ancora più semplice senza passare per i decimale, la vedi?
Da tenere in considerazione che bisogna stabilire una grandezza dei bit di rappresentazione come nel caso di un numero intero, ma possiamo semplicemente utilizzare la stessa di quella a virgola mobile usando la sua interezza (es. senza suddivisione IEEE).

se hai dubbi e non ho commesso errori, chiedi pure :-)

smartmouse
"hamming_burst":
Allora vediamo di riniziare.

[...]

aggreggare il tutto.

Tutto chiaro! Ho rifatto l'esercizio e mi trovo.

Ora per trasformarlo in virgola fissa, è semplice:
- trasformi in binario la parte intera (divisioni successive)
- trasformi in binario la parte frazionaria (moltiplicazioni successive)

prova.

Ho fatto come mi hai detto e come sapevo già fare (c'è poco da fare sulla parte intera) e il risultato è (stabilendo n=8 e m=8 come numero di bit per rappresentare rispettivamente la parte intera e quella frazionaria): \(00000000.00111011_{2}\)

Giusto?

Oppure esiste una strada ancora più semplice senza passare per i decimale, la vedi?

Ehm... no :(

hamming_burst
Ho fatto come mi hai detto e come sapevo già fare (c'è poco da fare sulla parte intera) e il risultato è (stabilendo n=8 e m=8 come numero di bit per rappresentare rispettivamente la parte intera e quella frazionaria): \(00000000.00111011_{2}\)

ok. Anche se di solito si ha un numero di bit totali e poi si fissa il punto di inizio parte frazionaria, non avendo dipedenza dal numero che rappresento (per l'esercizio non ha molto importanza è correto così), cioè dipenderebbe dall'architettura che usi. D
a ricordarsi che il bit più significativo è il segno :-)
perciò nel tuo caso:
-segno: 1 bit
-intero: 7 bit
-frac: 8 bit
[quote]Oppure esiste una strada ancora più semplice senza passare per i decimale, la vedi?

Ehm... no :([/quote]
semplicemente avendo rappresentazione scientifica binaria (trovata dalla virgola mobile), in questo caso:
\(- 1.11011000000000000000000 * 2^{-3}\)

si calcola tutto direttamente in binario, cioè ho il numero frazionario (senza notazione scientifica):
\(- 1.11011000000000000000000 * 2^{-3} = - 0.00111011000000000000000000\)
e da qui lo trasformi in virgola fissa:
\(1\ 0000000\ 001110110\)

tutto senza passare per base \(10\) :-)

smartmouse
"hamming_burst":
ok. Anche se di solito si ha un numero di bit totali e poi si fissa il punto di inizio parte frazionaria, non avendo dipedenza dal numero che rappresento (per l'esercizio non ha molto importanza è correto così), cioè dipenderebbe dall'architettura che usi. D
a ricordarsi che il bit più significativo è il segno :-)
perciò nel tuo caso:
-segno: 1 bit
-intero: 7 bit
-frac: 8 bit


Ah, è vero il numero era negativo, lo avevo dimenticato!
Quindi si aggiunge solo un 1 all'inizio (usando la rappresentazione Modulo e Segno, giusto?):

\(10000000.001110110\)

semplicemente avendo rappresentazione scientifica binaria (trovata dalla virgola mobile), in questo caso:
\(- 1.11011000000000000000000 * 2^{-3}\)

si calcola tutto direttamente in binario, cioè ho il numero frazionario (senza notazione scientifica):
\(- 1.11011000000000000000000 * 2^{-3} = - 0.00111011000000000000000000\)
e da qui lo trasformi in virgola fissa:
\(1\ 0000000\ 001110110\)

tutto senza passare per base \(10\) :-)

Wow, buono a sapersi... non ci avevo proprio pensato! Grazie mille!


PS: Potresti aiutarmi anche con questo post?

Grazie ancora!

hamming_burst
"smartmouse":

Quindi si aggiunge solo un 1 all'inizio (usando la rappresentazione Modulo e Segno, giusto?)

attento, non aggiunge, ma un bit è riservato al segno, perciò nella rappresentazione ci sono 3 parti da considerare (come dici nel caso signed). :-)

smartmouse
Si, è vero, lo avevo capito, ho solo sbagliato a scrivere :P

Grazie mille per il tuo prezioso aiuto!

GlassPrisoner91
Approfitto di questo topic se mi è consentito. Mi dareste una mano anche a me, non riesco proprio ad afferrare il concetto di come trasformare un numero da virgola mobile a virgola fissa, forse sbaglio delle banalità, ecco fin dove riesco ad arrivare:

Il numero in virgola mobile che deve essere trasformato in virgola fissa è questo: (l'ho già scomposto)

1_10000100_10000000000000000000000
...rispettivamente segno, esponente e mantissa.

Ora però non riesco a capire quale sia il prossimo passaggio da fare, non sono sicuro in verità. Bisogna applicare la formula giusto? E poi, per calcolare l'esponente bisogna considerarlo come se fosse una normale conversione da binario in decimale?

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