Skip to content
Snippets Groups Projects
nearestpow2.c 1.97 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <stdio.h>
    #include "ieee754.h"
    #include <math.h>
    
    #ifdef NO_UNDERSCORE
    # define NEAREST_POW2 nearest_pow2
    # define MINBITS_IN_WORD minbits_in_word
    # define FMINBITS_IN_WORD fminbits_in_word
    #else
    # define NEAREST_POW2 nearest_pow2_
    # define MINBITS_IN_WORD minbits_in_word_
    # define FMINBITS_IN_WORD fminbits_in_word_
    #endif
    
    void NEAREST_POW2(union ieee754_double *xval, unsigned int *pow)
    {
    
      if (xval->d != 0.0)
        *pow = xval->ieee.exponent - IEEE754_DOUBLE_BIAS;
      else {
          printf("Warning : NEAREST_POW2 ne traite que des reels > 0.0\n");
          *pow = 0;
      }
    
    }
    
    void MINBITS_IN_WORD(int *nval, unsigned int *nbit)
    {
      union ieee754_double xval;
      int ival = *nval;
    
      /* ne fonctionne qu'avec des entiers non signs */
      if (ival-- < 0){
        printf("Warning : MINBITS_IN_WORD ne traite que des entiers POSITIFS.\n");
        *nbit = -1;
        return;
      } else
        if (ival > 0){
          xval.d = (double)ival;
          NEAREST_POW2(&xval,nbit);
          (*nbit)++;
        } else 
          *nbit = 0 ;
        
    }
    
    int FMINBITS_IN_WORD(int *nval)
    {
      union ieee754_double xval;
      int ival = *nval;
      unsigned int nbit;
    
      /* ne fonctionne qu'avec des entiers non signs */
      if (ival < 0){
        printf("Warning : MINBITS_IN_WORD ne traite que des entiers POSITIFS.\n");
        return -1;
      } else {
        if (ival > 0){
          xval.d = (double)ival;
          NEAREST_POW2(&xval,&nbit);
          nbit++;
        } else 
          nbit = 0 ;
        return nbit;
      }
    }
    
    /* int main(){ */
    
    /*   double x; */
    /*   int i,nbit; */
    /*   int exp2; */
    
    /*   printf("Reel : "); */
    /*   scanf("%lf",&x); */
      
    /*   nearest_pow2_((union ieee754_double*)&x,&exp2); */
    
    /*   printf("2**%d = %lf est la puissance de 2 la plus proche et inferieure  %lf\n", */
    /* 	 exp2,pow(2.,exp2),x); */
    /*   printf("%lf <= %lf <= %lf\n",pow(2.,(double)exp2),x,pow(2.,(double)exp2+1.)); */
      
    /*   printf("Entier positif : "); */
    /*   scanf("%d",&i); */
    /*   minbits_in_word_(&i,&nbit); */
    /*   printf("%d valeurs : %d bits (2**%d = %d).\n",i,nbit,nbit,(1<<nbit)); */
    /* } */