|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 1102
|
Conversione numeri in floating point: come si fa?
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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2516
|
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 Codice:
#include <iomanip> [...] cout << static_cast < float > (variabiledaconvertire); ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 1102
|
a me serve la conversione a mano
non mi serve per c, mi dovresti dire come si calcola la mantissa
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 1102
|
si devo fare quella
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
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
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. |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 1102
|
io però non capisco come si genera la mantissa
quella a 23bit, cosa ci devo mettere?
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 1102
|
ragazzi mi serve un esempio per
codifica per eccesso 2n-1, ditemi come si fa
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
Ciao!
Stavo per aprire una discussione per lo stesso problema, però visto che questa è già aperta..posso chiedere qui? ![]() 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?? ![]() 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ì:
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! ![]() Vi ringrazio per l'aiuto ![]()
__________________
blue_blue: nickname proprio di persona, femminile, singolare "Wait, before you close the curtain/There’s still another game to play/And life is beautiful that way"(Beautiful that way, Noa & Nicola Piovani) Fiore, sei un mito ![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 ![]() 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. |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
Grazie! Però scusa ma credo di essermi persa qualcosa
![]() 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 ![]() Quote:
Grazie ![]()
__________________
blue_blue: nickname proprio di persona, femminile, singolare "Wait, before you close the curtain/There’s still another game to play/And life is beautiful that way"(Beautiful that way, Noa & Nicola Piovani) Fiore, sei un mito ![]() |
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
![]() |
![]() |
![]() |
#15 | ||
Senior Member
Iscritto dal: Aug 2006
Messaggi: 1192
|
Quote:
![]() Quote:
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ì ![]() ![]()
__________________
blue_blue: nickname proprio di persona, femminile, singolare "Wait, before you close the curtain/There’s still another game to play/And life is beautiful that way"(Beautiful that way, Noa & Nicola Piovani) Fiore, sei un mito ![]() |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:15.