IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

convertir des octets en float : format apparement specifique


Sujet :

C++

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Salut,

    je pense que ta méthode va fonctionner, mais j'ai bien peur qu'elle ne gère ni l'endianess vu que l'on doit donner les octets dans le bon ordre, ni le sizeof float

    Alors bon, pour l'endianess, il est clair qu'il faut absolument que je trouve un moyen de le gérer automatiquement sans faire de test sur la machine (comme la méthode N° 2 de mon précédent post. Par contre au sujet de cette méthode, il est évident que ça ne fonctionnera pas vu que l'on renvoie recursivement un float qui dans la récursivité est traité comme un octet char... je vais voir pour bidouiller ça ^^)

    Par contre, j'ai une question très importante :

    Au sujet de la taille d'un type : Y'a-t-il réellement des différences de tailles de types selon les systemes d'exploit / archi processeur ?
    Pour exemple, au hasard et pas forcement juste, mais juste pour exprimer ma question : imaginons un float, sur pc/windows il est codé sur 4 octets, mais sur un autre systeme (je parle de systeme grand public, pas de station de calcul météo ou autres trucs du genre, ça je m'en tape un peu...), ne pourrait-il pas etre codé sur 8 par exemple ?

    Si c'est le cas, comment on le gere ça ? Car je me dis que le jour ou on va changer de codage de type (du moins au niveau taille, pas forcement au niveau de la maniere de faire) beh quand je vais mettre mes 4 octets dans un float codé sur 8, ça risquerait de faire un truc debile...
    Enfin ça c'est purement pour apprendre comment fonctionne l'interieur d'une becane on va dire, car pour le moment, un simple cast fait le taff, mais j'aimerai bien gérer ce genre de chose si c'est possible ^^

    Merci supersag, je vais tester ta technique et en meme temps voir ma bidouille de la deuxieme methode de mon post, je posterai les resultats

    ++

  2. #22
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Ta methode 1 (et ta methode 2) ne fonctionne pas. Elles lisent un entier mais pas un float meme si elles mettent le resultat dans un float.

    Si je ne me trompe pas (c'est pas teste, le 128 est de memoire), le code suivant devrait faire a peut pres ce que tu veux (les infini et les NaN ne sont pas traite)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    float readFloat(unsigned char* buf) 
    {
       float result = buf[0];
       result = result/256 + buf[1];
       result = result/256 + (buf[2] | 0x80);
       unsigned exp = unsigned(buf[3] & 0x7F) * 2 + ((buf[2] & 0x80) != 0 ? 1 : 0) - 128;
       bool sign = (buf[3] & 0x80) != 0;
       return sign ? -ldexp(result/256, exp) : ldexp(result/256, exp);
    }
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Supersag : je viens de tester ta méthode et elle fonctionne mais sans gérer l'endianess c'est bien ce qui me semblait.

    Ca m'embete car pour lire un long la méthode du décalage fonctionne très bien ! le but est simple : opérer un décalage par 8bits sur un octet. Grace à cela, si l'endianess change, le décalage aussi, donc au final, quelque soit l'endianess, on n'a pas à changer l'ordre des octets, il est toujours correct.

    Seulement cette méthode fonctionne bien pour un long, int ou short vu que ce sont des entiers donc codés directement sur tous les bits. Or pour mon cas d'un float, on ne peut pas vu que la mantisse est sur 23 bits, 8 bits pour l'exposant et 1 pour le signe.

    Il faudrait que je puisse opérer ce decalage de bits sans altérer le contenu en le stockant dans une variable. Et là je ne sais pas trop comment faire

  4. #24
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par zax-tfh
    Au sujet de la taille d'un type : Y'a-t-il réellement des
    différences de tailles de types selon les systemes d'exploit / archi
    processeur ?
    Suivant les processeurs et les modes de compilation, oui.

    Par exemple, sur la machine que j'utilise j'ai le choix entre deux modes,
    un pour lequel les long font 4 bytes, un pour lequel les long font 8 bytes.

    Pour exemple, au hasard et pas forcement juste, mais juste pour
    exprimer ma question : imaginons un float, sur pc/windows il est codé sur 4
    octets, mais sur un autre systeme (je parle de systeme grand public, pas de
    station de calcul météo ou autres trucs du genre, ça je m'en tape un
    peu...), ne pourrait-il pas etre codé sur 8 par exemple ?
    Peu de risques. Cela fait 20 ans a peu pres que tout le monde tends a
    s'aligner sur les formats IEEE. Il n'y a guere que les descendants de
    vielle architecture et les DSP ou je concois des differences.

    Si c'est le cas, comment on le gere ça ? Car je me dis que le jour
    ou on va changer de codage de type (du moins au niveau taille, pas
    forcement au niveau de la maniere de faire) beh quand je vais mettre mes 4
    octets dans un float codé sur 8, ça risquerait de faire un truc
    debile...
    Pour passer de 4 a 8, pas de probleme, tu etends avec les 0 et ca passera.
    Pour passer de 8 a 4, tu arrondis la partie fractionnaire. Le plus gros
    probleme c'est si l'intervalle de l'exposant dans la destination est plus
    petit que celui de la source ou la tu te retrouves avec des nombres qui ne
    sont meme pas approchables. Quelques possibilites: retourner un infini ou
    un NaN ou bien generer une erreur.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #25
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le code de Jean-Marc.Bourguet recalcule le float et le résultat doit donc être adapté automatiquement à l'endianess et à la taille du float de la machine. Il comporte uniquement une petite erreur sur les coefficients. Le code suivant doit marcher (sauf pour 0 ! ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    float readFloat(unsigned char* buf)
    {
       float result = buf[0];
       result = result/256 + buf[1];
       result = result/256 + (buf[2] | 0x80);
       unsigned  exp = unsigned(buf[3] & 0x7F) * 2 + ((buf[2] & 0x80) != 0 ? 1 : 0) - 134;
       return (buf[3] & 0x80) != 0? -ldexp(result, exp) : ldexp(result, exp);
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    Jean Marc : ok, donc en gros ça veut dire que je n'ai pas vraiment à me préoccuper de la taille d'un type quoi ^^ Ca m'enleve une épine du pied, surtout pour un petit soft comme je suis en train de faire, c'est purement pour l'apprentissage, c'est tout.

    Diogene : merci pour le code que tu as mis, en fait je ne l'avais pas vu, bizarrement... Donc merci à Jean Marc ! Je pense que le probleme de l'infini ne se posera pas vu que ce sont des coordonnées de Vertex donc il me semble que ce soit obligatoirement fini. Par contre pour les nan, vu que je ne sais pas ce que cela veut dire, je vais vite aller me renseigner et voir si dans mon cas c'est important ou pas.
    En tout cas j'ai testé le code sur mes deux machines et ça passe nickel chrome !

    Merci à tous !
    @ bientot

  7. #27
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par zax-tfh
    Par contre pour les nan, vu que je ne sais pas ce que cela veut dire, je vais vite aller me renseigner et voir si dans mon cas c'est important ou pas.
    NaN : Not a Number. Il y a peu de risques que ce soit important.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    En effet, il y a peu de risque vu que primo je recupere le float d'un format fixé et respectant la norme et que deuxio je ne fais pas d'operation sur le float ^^

    Encore merci a vous tous

Discussions similaires

  1. [Toutes versions] Questions pour convertir des nombres stockés en format texte
    Par antoisse3 dans le forum Excel
    Réponses: 7
    Dernier message: 20/04/2015, 10h55
  2. Convertir des chiffres format texte en vrai chiffre?
    Par Bertrand57 dans le forum Excel
    Réponses: 4
    Dernier message: 09/04/2008, 22h16
  3. Fonction pou de convertire des MIN en format HH:MM
    Par Rifton007 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/06/2007, 19h07
  4. Convertir des formats musicaux en langage C
    Par la_praline dans le forum C
    Réponses: 14
    Dernier message: 21/05/2007, 11h00
  5. convertir un string en float avec un format
    Par kisscool62 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 04/12/2006, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo