PDA

View Full Version : Conversione numeri in floating point: come si fa?


ubanton
08-11-2007, 21:35
Ragazzi,
domani ho l'esame di fondamenti di informatica, ma non so fare la conversione dei numeri reali in floating point(virgola mobile) e soprattutto una volta ottenuto in binario non so come disporlo per la mantissa e come si calcola l'esponente.
Se qualcuno mi da una mano, per favore

-Slash
08-11-2007, 21:53
se ho capito bene quello che devi fare(anche io seguo fondamenti ma da poco) in c++ puoi usare static_cast presente nell'headers <iomanip>

in questo modo


#include <iomanip>
[...]
cout << static_cast < float > (variabiledaconvertire);

dai anche un occhio a setprecision e setw presenti sempre in io manip.. spero di esserti stato utile :D

ubanton
08-11-2007, 22:06
non mi serve per c, mi dovresti dire come si calcola la mantissa

nico88desmo
08-11-2007, 22:49
non mi serve per c, mi dovresti dire come si calcola la mantissa

Devi fare la conversione da decimale a binario di un numero in virgola mobile?

ubanton
09-11-2007, 07:09
mi trovo il numero in binario puro sia quello intero e quello decimale però poi non riesco a calcolarmi la mantissa, se mi potessi fare un esempio grazie

nico88desmo
09-11-2007, 08:21
mi trovo il numero in binario puro sia quello intero e quello decimale però poi non riesco a calcolarmi la mantissa, se mi potessi fare un esempio grazie

120,35

120/2 = 60 R = 0
60/2 = 30 R = 0
30/2 = 15 R = 0
15/2 = 7 R = 1
7/2 = 3 R = 1
3/2 = 1 R = 1
1/2 = 0 R = 1

parte binaria intera = 1111000

0.35*2 = 0.70 ---> 0
0.70*2 = 1.40 ---> 1
0.40*2 = 0.80 ---> 0
0.80*2 = 1.60 ---> 1
0.60*2 = 1.20 ---> 1
0.20*2 = 0.40 ---> 0

Numero convertito = 1111000,010110 con le ultime 4 cifre periodiche.
Notare come un numero decimale finito può diventare un numero binario periodico.

ubanton
09-11-2007, 08:39
quella a 23bit, cosa ci devo mettere?

cionci
09-11-2007, 10:24
Se hai un numero in decimale lo devi prima convertire in modo da avere un esponente 2.
Ad esempio: 5,51*10^5 diventa 1,050949097*2^19

Log(5.51*10^5) / Log (2) = Log in base 2 (5.51*10^5)

Prendi la parte intera di questo risultato e la metti da parte, sarà il tuo esponenziale e.
Prendi la parte dopo la virgola (basta toglierci la parte intera) e fai:

2^(parte dopo la virgola) ed ottieni la mantissa m su cui la vorare

Converti la mantissa m secondo le potenze di due viste sopra.

A questo punto hai la mantissa in binario che deve essere normalizzata (deve avere un 1 in testa)...se la mantissa non ha un 1 in testa allora sposti la virgola verso destra fino a quando ha un 1 in testa. Per ogni posizione che sposti aggiungi un 1 all'esponente.
L'uno in testa non va riportato nel formato IEEE754.

A questo punto hai la forma finale della mantissa e per l'esponente ti basta aggiungere il dsiplacement ((2^(dimensione dell'esponente - 1)) - 1) ed hai la forma finale che ovviamente va messa in binario.

Se il numero decimale che ti presentano è semplice (non ha un grande esponente) puoi saltare il calcolo del logaritmo e convertire direttamente in binario il numero, a questo punto ti basta passare dalla normalizzazione per calcolare l'esponente.

ubanton
09-11-2007, 11:18
codifica per eccesso 2n-1, ditemi come si fa

cionci
09-11-2007, 11:29
codifica per eccesso 2n-1, ditemi come si fa
La codifica per eccesso 2^(n-1) è quella che si fa per l'esponente e che ti ho detto sopra dove parlavo di displacement.

Prendi un numero decimale (positivo o negativo) e ci aggiungi (2^(n-1))-1...a questo punto converti in binario. Quindi ad esempio con n = 8 bit si ottiene che 00000000 corrisponde a -127, 01111111 corrisponde a 0, 11111111 corrisponde a +128.

blue_blue
09-11-2007, 17:02
Ciao!
Stavo per aprire una discussione per lo stesso problema, però visto che questa è già aperta..posso chiedere qui? :stordita:

La prof ha spiegato qualche giorno fa queste conversioni, ma è andata troppo veloce e secondo me ha dato "qualcosina" per scontato..
Allora: io ho capito che se mi danno un numero del tipo -134.56 io prendo la parte intera e comincio a dividerla, tenendo i resti dall'ultimo al primo; poi prendo la parte frazionaria, comincio a moltiplicarla e tengo la parte intera di ciascun risultato ottenuto (ma fino a quando vado avanti così?); quindi il mio numero diventa 10000110,1000111101011100 , giusto? Adesso sposto la virgola verso sinistra di 7 posti, ottenendo 1,00001101000111101011100 x 2^7; poi prendo il 7 dell'esponente, ci sommo 127 (però non ho ben capito perché), ottenendo 134, e trasformo 134 in binario (10000110) usando la stessa regoletta di prima (divido per due e tengo i resti dall'ultimo al primo); adesso scelgo il bit del segno e, visto che -134.56 è negativo, sarà 1; poi compongo tutto e alla fine -134.56 in float mi viene questa roba qua:
1 10000110 00001101000111101011100
è giusto così o sto sbagliando da qualche parte?? :mc:

poi ci ha dato anche un altro esercizio, che mi pareva simile ma invece non riesco a farlo. devo sempre convertire in float il numero 0.04 = 0,4 x 10^-1.
Io ho provato fare quello che ha spiegato cionci, così:
Log 0.04/Log 2 = -4.643856278

-4.643856278 + 4 = -0.643856278 (oppure dovevo fare -4 ugualmente?? e il segno - va bene o devo toglierlo?)


(supponendo che il passaggio prima sia giusto :D )
2^(-0.643856278)= 0.63999996


e a questo punto cosa faccio? prendo la parte frazionaria e la converto in binario moltiplicando per 2 e tenendo le parti intere come prima? e poi come vado avanti?

Scusate per il post un po' lungo, ma ho un sacco di dubbi! :muro:
Vi ringrazio per l'aiuto :)

cionci
09-11-2007, 19:35
Se un numero in base 10 è senza esponente la parte dei logaritmi si può saltare. Puoi passare direttamente a convertire in binario ed a normalizzare portando la cifra ad un solo 1 in testa.
Cioè...se avessi 2.512x10^2 tanto vale convertire 251,2...ma se ho 2.512x10^55 devi usare i logaritmi.

I passaggi che hai fatto per 0.04 vanno bene. Ottieni 0.63999996 * 2^(-4)
A questo punto converti 0.63999996 in binario come ha detto nico88desmo ;) Ed ottieni la mantissa convertita (mi sono fermato un po' presto) cioè 0,101001000. Però ricordo che ci deve essere l'uno in testa...quindi: 1,01001000 * 2^(-3)
Per lo standard IEEE754 si toglie l'uno in testa ed le restanti cifre si mettono nella mantissa, per l'esponente si aggiunge il (2^(n-1)) - 1 come visto sopra e si converte in binario.

blue_blue
10-11-2007, 14:02
Grazie! Però scusa ma credo di essermi persa qualcosa :cry:
quando converto 0.63999996 in binario come ha spiegato nico88desmo devo tenere tutte le cifre decimali nella moltiplicazione o posso approssimare?
Esempio:
0.63999996 x 2 = 1,27999992 tengo 1
0,27999992 x 2 = 0,55999984 tengo 0
0,55999984 x 2 = 1,11999968 tengo 1
0,11999968 x 2 = 0,23999936 tengo 0
0,23999936 x 2 = 0,47999872 tengo 0
0,47999872 x 2 = 0,95999744 tengo 0
invece a te a questo punto viene 1..dove sto sbagliando? dipende dall'approssimazione?

e poi un'altra cosa :stordita:
per l'esponente si aggiunge il (2^(n-1)) - 1 come visto sopra e si converte in binario.
l' n nell'esempio di 0.04 che cos'è? e perchè si fanno quei due -1?
Grazie :)

cionci
10-11-2007, 14:34
Io ho approssimato, te devi arrivare alla dimensione in bit della mantissa ;)

n è la dimensione in bit dell'esponente...mettiamo che sia 8.

2^(n-1) = 128
(2^(n-1))-1 = 127

Se ho un esponente di -100 dovrò sommarci 127 ed ottengo il numero da convertire in binario per inserirlo nei bit dell'esponente di un numero IEEE754.

blue_blue
10-11-2007, 16:03
Io ho approssimato, te devi arrivare alla dimensione in bit della mantissa ;)
perfetto, allora ci sono :D


n è la dimensione in bit dell'esponente...mettiamo che sia 8.

2^(n-1) = 128
(2^(n-1))-1 = 127

Se ho un esponente di -100 dovrò sommarci 127 ed ottengo il numero da convertire in binario per inserirlo nei bit dell'esponente di un numero IEEE754.
Aaaah, forse ho capito! L'n non dipende dal numero che sto convertendo, ma in che cosa lo voglio convertire..giusto?
Cioè, adesso io sto convertendo 0.04 in float, quindi n=8 perchè 8 sono i bit "dedicati" all'esponente dei 32 totali; però se io stessi convertendo sempre 0.04 in double (non so se le regole sono le stesse, ma supponiamo di sì :D ) n sarebbe = 11..o non ho capito? :stordita: