Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-11-2007, 21:35   #1
ubanton
Senior Member
 
L'Avatar di ubanton
 
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
ubanton è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2007, 21:53   #2
-Slash
Senior Member
 
L'Avatar di -Slash
 
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);
dai anche un occhio a setprecision e setw presenti sempre in io manip.. spero di esserti stato utile
-Slash è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2007, 22:06   #3
ubanton
Senior Member
 
L'Avatar di ubanton
 
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
ubanton è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2007, 22:49   #4
nico88desmo
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 1568
Quote:
Originariamente inviato da ubanton Guarda i messaggi
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?
nico88desmo è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 07:09   #5
ubanton
Senior Member
 
L'Avatar di ubanton
 
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
ubanton è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 08:21   #6
nico88desmo
Senior Member
 
Iscritto dal: Jul 2006
Messaggi: 1568
Quote:
Originariamente inviato da ubanton Guarda i messaggi
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.
nico88desmo è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 08:39   #7
ubanton
Senior Member
 
L'Avatar di ubanton
 
Iscritto dal: Nov 2003
Messaggi: 1102
io però non capisco come si genera la mantissa

quella a 23bit, cosa ci devo mettere?
ubanton è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 10:24   #8
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 11:18   #9
ubanton
Senior Member
 
L'Avatar di ubanton
 
Iscritto dal: Nov 2003
Messaggi: 1102
ragazzi mi serve un esempio per

codifica per eccesso 2n-1, ditemi come si fa
ubanton è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 11:29   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da ubanton Guarda i messaggi
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 17:02   #11
blue_blue
Senior Member
 
L'Avatar di blue_blue
 
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ì:
  • 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 )
    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!
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
blue_blue è offline   Rispondi citando il messaggio o parte di esso
Old 09-11-2007, 19:35   #12
cionci
Senior Member
 
L'Avatar di cionci
 
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 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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2007, 14:02   #13
blue_blue
Senior Member
 
L'Avatar di blue_blue
 
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:
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
__________________
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
blue_blue è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2007, 14:34   #14
cionci
Senior Member
 
L'Avatar di cionci
 
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.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2007, 16:03   #15
blue_blue
Senior Member
 
L'Avatar di blue_blue
 
Iscritto dal: Aug 2006
Messaggi: 1192
Quote:
Originariamente inviato da cionci Guarda i messaggi
Io ho approssimato, te devi arrivare alla dimensione in bit della mantissa
perfetto, allora ci sono

Quote:
Originariamente inviato da cionci Guarda i messaggi
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ì ) n sarebbe = 11..o non ho capito?
__________________
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
blue_blue è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Huawei punta sul canale europeo: per il ...
Ubuntu 26.04: le GPU guadagnano il 17% i...
La Commissione UE registra l'iniziativa ...
SSD troppo cari? La soluzione alla crisi...
Anteprima mondiale Hyundai IONIQ 3: segm...
Fintool sbarca su Microsoft 365: arrivan...
Hanno chiesto 1 dollaro per salvare un M...
Arriva AgentExchange, il marketplace di ...
Blizzard fa chiudere Turtle WoW: perché ...
Claude Desktop e la modifica silenziosa ...
Blue Origin ha mostrato gli interni del ...
Linux alla pari di Windows in gioco: con...
Il rientro del secondo stadio del razzo ...
Il controller ufficiale Microsoft per Xb...
DJI Power 1000 Mini: la power station da...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:18.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v