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 :

32 bits à 64 bits


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut 32 bits à 64 bits
    Bonjour, je désire implémenter la fonction erf(x). Je l'ai donc téléchargée du net (http://www.ks.uiuc.edu/Research/namd...C-source.html). En m'intéressant à l'algorithme, il y a une partie que je ne comprends pas. La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    /*  assume little endian  */
    typedef union 
    {
      double value;
      struct 
      {
        unsigned int lsw;
        unsigned int msw;
      } parts;
    } ieee_double_shape_type;
     
     
    /* Get the more significant 32 bit int from a double.  */
     
    #define GET_HIGH_WORD(i,d)                                      \
    do {                                                            \
      ieee_double_shape_type gh_u;                                  \
      gh_u.value = (d);                                             \
      (i) = gh_u.parts.msw;                                         \
    } while (0)
     
     
    /* Set the less significant 32 bits of a double from an int.  */
     
    #define SET_LOW_WORD(d,v)                                       \
    do {                                                            \
      ieee_double_shape_type sl_u;                                  \
      sl_u.value = (d);                                             \
      sl_u.parts.lsw = (v);                                         \
      (d) = sl_u.value;                                             \
    } while (0)
    J'ai 4 questions

    1) que font ces fonctions ?
    2) Mon PC est sur 64 bits. Comment les modifier ?
    3) Comment faire pour que mon code soit portable (sur du 32 bits et du 64 bits) ?
    4) que veulent dire les lignes suivantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (i) = gh_u.parts.msw;  
    (d) = sl_u.value;
    Dans le code, ces fonctions sont appellées de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifdef WIN32  /* Real math libraries provide erf(). */
    /*  assume 32 bit int  */
    typedef int int32_t;
    typedef unsigned int u_int32_t;
     double erf(double x) 
     {
           int32_t hx,ix,i;
           double R,S,P,Q,s,y,z,r;
           GET_HIGH_WORD(hx,x);
     
    blabla
    }
    Merci.
    Je travaille non pas sous windows mais sur la Suse Pro 9.3

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Pardon, j'avais un peu modifié le code. Le vrai code qui me pose pb est le suivant (j'avais remplacé les typedef)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    /*  assume 32 bit int  */
     
    typedef int int32_t;
     typedef unsigned int u_int32_t;
     
     /*  assume little endian  */
     typedef union 
     {
       double value;
       struct 
       {
         u_int32_t lsw;
        u_int32_t msw;
      } parts;
     } ieee_double_shape_type;
     
     
     /* Get the more significant 32 bit int from a double.  */
     
     #define GET_HIGH_WORD(i,d)                                      \
     do {                                                            \
       ieee_double_shape_type gh_u;                                  \
       gh_u.value = (d);                                             \
       (i) = gh_u.parts.msw;                                         \
     } while (0)
     
     
     /* Set the less significant 32 bits of a double from an int.  */
     
     #define SET_LOW_WORD(d,v)                                       \
     do {                                                            \
       ieee_double_shape_type sl_u;                                  \
       sl_u.value = (d);                                             \
       sl_u.parts.lsw = (v);                                         \
       (d) = sl_u.value;                                             \
     } while (0)

  3. #3
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Salut,

    Un double fait 8 octets, on peut donc le representer avec 2 variables de 32 bits.
    C'est ce qu'il se passe ici avec l'union (soit je prends la valeur double, soit je prends les 2 entiers 32 bits).
    Il faudrait connaitre la representation du double (qui est standardisée d'ailleurs) pour comprendre le sens des 2 entiers, mais pour moi ces 2 entiers ne peuvent pas etre utilisées. En gros, ça sert à rien. A part peut etre à transmettre sur le reseau, j'en sais rien.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gruik
    Un double fait 8 octets,
    Ca dépend de l'implémentation. Sans autres precisions, cette affirmation est fausse.

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Ouais, je me doutais bien .. mais l'union ci dessus assume qu'il fait 64bits

Discussions similaires

  1. bits,bytes,bit word ?
    Par Battosaiii dans le forum C
    Réponses: 2
    Dernier message: 17/03/2006, 11h29
  2. Comment lire un char bit a bit ?
    Par damien99 dans le forum C++
    Réponses: 9
    Dernier message: 02/02/2006, 21h57
  3. Lire bit par bit
    Par The_Undertaker dans le forum C++
    Réponses: 8
    Dernier message: 01/07/2005, 11h43
  4. Conversion de handles 16 bits <--> 32 bits
    Par Alcatîz dans le forum Windows
    Réponses: 6
    Dernier message: 13/12/2003, 13h40
  5. Désassemblage à la main 16 bits / 32 bits
    Par le mage tophinus dans le forum Assembleur
    Réponses: 12
    Dernier message: 19/04/2003, 00h55

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