"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog
Il segno è gestito come "magnitude and sign", non come complemento a due, corretto? In tal caso mi sembra che quell'affare non sia altro che un intero a 16 bit little-endian con segno stile "magnitude and sign", da riscalare di 2^16.
Per "importarlo" in un float così a naso dovrebbe bastare una cosa di questo genere:
codice:#include <stdint.h> float readF16(const unsigned char * ptr) { uint16_t temp; float out=(ptr[1]&128)?-1.f:+1.f; // scambiare il +1 con il -1 a seconda della convenzione usata per il segno unsigned char * tempPtr=(unsigned char *)&temp; // nota: scambiare su piattaforme big-endian tempPtr[0]=ptr[0]; tempPtr[1]=ptr[1]&0x7f; // toglie il bit del segno out*=temp; // unisce il valore con il segno determinato prima out/=65536.f; // riscala di 2^16 return out; }
Amaro C++, il gusto pieno dell'undefined behavior.
Ti credo sulla parola.
Copierò questo codice senza nemmeno cercare di capirlo
Se funziona, non lo studierò
Se non prima verrò qui, ti insulterò pesantemente e poi ti chiederò di metterlo a posto.
...
...
...
Ti è andata bene, funziona.
Scherzo! Grazie mille, ora mi studio queste 4 righe per capire cosa hai combinato.
"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog
E se dovessi leggere un F13?
"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog
Un tipo da 13 bit?Originariamente inviato da XWolverineX
E se dovessi leggere un F13?bizzarro, come è allineato? hai una qualche specifica?
Amaro C++, il gusto pieno dell'undefined behavior.
Grazie in primis per l'aiuto.
Devi ringraziare gli standard IEC per queste assurdità di rappresentazione.
In realtà si tratta di un intero a 16 bit così diviso:
In cui F13 è composto in questo modo:
![]()
"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog
È lo stesso mestiere di prima, basta fare un masking dei bit non rilevanti e dividere per 2^13. Volendo si potrebbe anche scrivere una funzione template generica che gestisca tutti i vari F...
Tra parentesi, mi sa che sui numeri negativi prima ho sbagliato... dovrebbe essere
codice:float readF16(const unsigned char * ptr) { uint16_t temp; float out=(ptr[1]&128)?-1.f:0.f; unsigned char * tempPtr=(unsigned char *)&temp; // nota: scambiare su piattaforme big-endian tempPtr[0]=ptr[0]; tempPtr[1]=ptr[1]&0x7f; // toglie il bit del segno out+=temp/65536.f; return out; }
Amaro C++, il gusto pieno dell'undefined behavior.
Perché out+=?
NOn dovrebbe essere moltiplicato?
"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog
No, perché ho visto dall'ultimo screenshot che hai postato che non è in rappresentazione "sign and magnitude" come pensavo, ma una roba diversa; non capisco se è complemento a due o cosa.Originariamente inviato da XWolverineX
Perché out+=?
NOn dovrebbe essere moltiplicato?![]()
Amaro C++, il gusto pieno dell'undefined behavior.
Volendone fare una versione con un numero variabile di bit, ho scritto una cosa del genere
Secondo te potrebbe andare bene?codice:static inline float readF(const unsigned char * ptr, const int Size) { unsigned int PSize = static_cast<unsigned int>(pow(2,Size)); unsigned short temp; float out=(ptr[1] & PSize) ? -1.f : 0.f; unsigned char * tempPtr=(unsigned char *) & temp; tempPtr[0]=ptr[0]; tempPtr[1]=ptr[1] & PSize - 1; out += static_cast<float>(temp) / PSize; return out; }
"Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)
"Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)
http://xvincentx.netsons.org/programBlog