- Messaggi: 1222
- Ringraziamenti ricevuti 104
Convertire 4 char in un Float
Si, ero arrivato più o meno alle stesse conclusioni e nel frattempo facendo varie prove ho capito che alla fine il problema non è shiftare il float ma convertire il dato da long o char in float.per come e' organizzato un float fare uno shift non ha molto senso.
Infatti hai una mantissa ed esponente e traslare causerebbe problemi se si facesse uno shift nel senso stretto della parola. Questo pero' non toglie che un compilatore possa supportare uno shift per float.
Nel caso di float e' forse meglio effettuare la moltiplicazione per la potenza di due necessaria.
In questo modo sei indipendente dal compilatore.
Ho inizialmente un dato float (quindi 32bit) che in java viene inviato tramite seriale, ma la seriale del pic riceve un char (8bit) alla volta. Quindi mi ritrovo 4 char che devono ridiventare un float.
Facendo varie prove riesco ad ottenere un long che rispecchia l'ordine dei bit e teoricamente quello che mi è stato trasmesso.
Se ad esempio in debug mode copio a mano questa serie di bit dentro la variabile di tipo float, li copio nella colonna Binary, la variabile assume il valore float trasmesso in origine; se però tento di mettere il valore della variabile long dentro quella float dal programma in C il falore che ottengo è diverso. Spero di farmi capire meglio con un esempio.
Parto da un valore float pari a
2222222
e andando a guardare i singoli bit è rappresentato da
01001010 00000111 10100010 00111000
mi ritrovo quindi lato pic che ho 4 variabili con dentro quei valori...
dato1 = 01001010
dato2 = 00000111
dato3 = 10100010
dato4 = 00111000
adesso riesco ad ottenere un long che al suo interno abbia i seguenti bit...
datoTemp = 01001010 00000111 10100010 00111000 [datoTemp è di tipo long]
Il problema è che non riesco ad ottenere un float che abbia quei medesimi bit..
la seguente righa non "funziona"..
datoConvertito = (float) datoTemp; [datoConvertito è di tipo float]
e mi sembra che non funzioni nemmeno la seguente...
datoConvertito = datoTemp; [datoConvertito è di tipo float]
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Autore della discussione
- Moderator
Il tuo ragionamento è corretto ma non è valido per i float, oppure sono io che sbaglio qualcosa.
Se prendi sulla calcolatrice il valore 4,3e7 non è un float ma un decimale, se io ho una variabile di tipo float e durante il debug software ci metto a mano un valore ho i seguenti risultati..
Se metto dentro la colonna float il valore
4.300000e+007
alla colonna Binary ho
01001100 00100100 00001000 00110000
Se metto dentro la colonna binary il valore
00000010 10010000 00100000 11000000
alla colonna float mi ritrovo
2.117770e-037
Inizialmente ho un float, poi con java mi sembra che prenda i bit e li invii 8 per volta (fa degli shift).
Se uso un long riesco ad avere la stessa serie di bit, ma gli stessi bit dentro una variabile long o dentro una variabile float hanno significato e valore diverso e io dovrei riuscire a riportare quella sequenza dentro il float.
Non so se dopo questi lunghissimi post ho solo finito di incasinare tutto, chiedete pure se qualcosa non è chiaro.
Il piano B sarebbe prendere il float da java e moltiplicarlo per togliere la virgola e farlo diventare qualsiasi altra cosa e dovrebbe andare..ma prima del piano B vorrei capire se quello A è fattibile o se sto cercando di congelare l'inferno..
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Autore della discussione
- Moderator
- Messaggi: 1222
- Ringraziamenti ricevuti 104
mantissa 23 bit
esponente 8 bit
segno 1 bit
La vedo dura.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- shinshi
- Elite Member
- Messaggi: 293
- Ringraziamenti ricevuti 29
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- shinshi
- Elite Member
- Messaggi: 293
- Ringraziamenti ricevuti 29
Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Autore della discussione
- Moderator
- Messaggi: 1222
- Ringraziamenti ricevuti 104
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.