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