Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563

    C++ - Fixed Point number

    Ciao a tutti,
    devo leggere questo tipo di dato.



    Avete dei consigli per leggere tal valore in modo rapido e indolore? (Solo leggere)
    "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

  2. #2
    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.

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    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

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    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

  5. #5
    Originariamente inviato da XWolverineX
    E se dovessi leggere un F13?
    Un tipo da 13 bit? bizzarro, come è allineato? hai una qualche specifica?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    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

  7. #7
    È 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.

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    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

  9. #9
    Originariamente inviato da XWolverineX
    Perché out+=?
    NOn dovrebbe essere moltiplicato?
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Volendone fare una versione con un numero variabile di bit, ho scritto una cosa del genere

    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;
    	}
    Secondo te potrebbe andare bene?
    "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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.