SURFEX v8.1
General documentation of Surfex
nearestpow2.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include "ieee754.h"
3 #include <math.h>
4 
5 #ifdef NO_UNDERSCORE
6 # define NEAREST_POW2 nearest_pow2
7 # define MINBITS_IN_WORD minbits_in_word
8 # define FMINBITS_IN_WORD fminbits_in_word
9 #else
10 # define NEAREST_POW2 nearest_pow2_
11 # define MINBITS_IN_WORD minbits_in_word_
12 # define FMINBITS_IN_WORD fminbits_in_word_
13 #endif
14 
15 void NEAREST_POW2(union ieee754_double *xval, unsigned int *pow)
16 {
17 
18  if (xval->d != 0.0)
19  *pow = xval->ieee.exponent - IEEE754_DOUBLE_BIAS;
20  else {
21  printf("Warning : NEAREST_POW2 ne traite que des reels > 0.0\n");
22  *pow = 0;
23  }
24 
25 }
26 
27 void MINBITS_IN_WORD(int *nval, unsigned int *nbit)
28 {
29  union ieee754_double xval;
30  int ival = *nval;
31 
32  /* ne fonctionne qu'avec des entiers non signés */
33  if (ival-- < 0){
34  printf("Warning : MINBITS_IN_WORD ne traite que des entiers POSITIFS.\n");
35  *nbit = -1;
36  return;
37  } else
38  if (ival > 0){
39  xval.d = (double)ival;
40  NEAREST_POW2(&xval,nbit);
41  (*nbit)++;
42  } else
43  *nbit = 0 ;
44 
45 }
46 
47 int FMINBITS_IN_WORD(int *nval)
48 {
49  union ieee754_double xval;
50  int ival = *nval;
51  unsigned int nbit;
52 
53  /* ne fonctionne qu'avec des entiers non signés */
54  if (ival < 0){
55  printf("Warning : MINBITS_IN_WORD ne traite que des entiers POSITIFS.\n");
56  return -1;
57  } else {
58  if (ival > 0){
59  xval.d = (double)ival;
60  NEAREST_POW2(&xval,&nbit);
61  nbit++;
62  } else
63  nbit = 0 ;
64  return nbit;
65  }
66 }
67 
68 /* int main(){ */
69 
70 /* double x; */
71 /* int i,nbit; */
72 /* int exp2; */
73 
74 /* printf("Reel : "); */
75 /* scanf("%lf",&x); */
76 
77 /* nearest_pow2_((union ieee754_double*)&x,&exp2); */
78 
79 /* printf("2**%d = %lf est la puissance de 2 la plus proche et inferieure à %lf\n", */
80 /* exp2,pow(2.,exp2),x); */
81 /* printf("%lf <= %lf <= %lf\n",pow(2.,(double)exp2),x,pow(2.,(double)exp2+1.)); */
82 
83 /* printf("Entier positif : "); */
84 /* scanf("%d",&i); */
85 /* minbits_in_word_(&i,&nbit); */
86 /* printf("%d valeurs : %d bits (2**%d = %d).\n",i,nbit,nbit,(1<<nbit)); */
87 /* } */
int FMINBITS_IN_WORD(int *nval)
Definition: nearestpow2.c:47
unsigned int exponent
Definition: ieee754.h:28
void NEAREST_POW2(union ieee754_double *xval, unsigned int *pow)
Definition: nearestpow2.c:15
void MINBITS_IN_WORD(int *nval, unsigned int *nbit)
Definition: nearestpow2.c:27
struct ieee754_double::@1 ieee
double d
Definition: ieee754.h:21