home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 17 / CD_ASCQ_17_101194.iso / dos / prg / alb_c10 / chap_12 / ch12_04.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-08  |  2.7 KB  |  102 lines

  1. /*********************************************************************
  2. *  CH12_04.C                             Fonction Factorielle: x!  *
  3. *                                                                    *
  4. *  x! est dΘfinie pour tout x sauf les entiers nΘgatifs -1, -2, -3,..*
  5. *                                                                    *
  6. *   Ce programme ne couvre que le domaine x: [ -1 , 170.6 ]          *
  7. *   La fonction renvoie une valeur nulle en cas de succΘs et -1 si   *
  8. *   x sort de son domaine. La prΘcision relative est de l'ordre de   *
  9. *   1e-12  entre -1 et 3 et mieux au delα. Elle utilise la fonction  *
  10. *   Gamma d'Euler et le dΘveloppement de son logarithme:             *
  11. *                                                                    *
  12. *                   Log x!= Log [ Gamma( x+ 1) ]                 *
  13. *                                                                    *
  14. *********************************************************************/
  15.  
  16. #include<stdio.h>
  17. #include<math.h>
  18.  
  19. enum logique { Echec= -1, Succes, Vrai= 0, Faux} x_entier;
  20.  
  21. void LitInt( int*);
  22. void LitDble( double*);
  23. enum logique Fact( const double, double*);
  24.  
  25. main( void)
  26. {
  27.     int n= 12;
  28.     double x, fde_x;
  29.         enum logique test;
  30.  
  31.     printf(" Calcul de x! pour x rΘel= ] -1 ; 170.6 ] \n\n");
  32.  
  33.     do
  34.         {
  35.         printf(" Entrez la valeur de x: ");
  36.         LitDble( &x);
  37.     }
  38.     while( x< -1 || x> 170.6);
  39.  
  40.     test= Fact( x, &fde_x);
  41.  
  42.     if( x_entier== Vrai)
  43.         n= 0;
  44.     if( test== Succes)
  45.         printf("\n %.*lf!= %.*lf", n, x, n, fde_x);
  46.         else printf("\n Echec de la fonction!");
  47. }
  48.  
  49. enum logique Fact( const double u, double *fact)
  50. {
  51.     double  z, t= u,
  52.         PI= 3.14159265358979323846,
  53.         epsilon= 1e-300;
  54.  
  55.     if( t< -1+ epsilon || t> 170.6 )
  56.      {
  57.         printf("\n Hors limites:    x= ] -1 ; 170.6 ] ");
  58.         return( Echec);
  59.          }
  60.     if( u> -1 && u< 3) t+= 4;
  61.  
  62.     z= exp(   t* ( log( t)- 1)
  63.         + 0.5* log( 2.0* PI* t)
  64.         + 1.0/ (   12   *      t     )
  65.         - 1.0/ (  360   * pow( t,  3))
  66.         + 1.0/ ( 1260   * pow( t,  5))
  67.         - 1.0/ ( 1685.78* pow( t,  7))
  68.         + 1.0/ ( 1300.60* pow( t,  9))
  69.         - 1.0/ ( 1014.84* pow( t, 11))
  70.         + 1.0/ ( 1915.86* pow( t, 13))
  71.           );
  72.  
  73.     if( u> -1 && u< 3) z/= t* ( t- 1)* ( t- 2)* (t- 3);
  74.  
  75.     x_entier= ( t== floor( t)) ?  Vrai: Faux;
  76.  
  77.     if( x_entier== Vrai)  *fact= floor( z+ 0.5);
  78.     else *fact= z;
  79.  
  80.     return( Succes);
  81. }
  82.  
  83. void LitInt( int *entier)
  84. {
  85.     double dble;
  86.     do
  87.         {
  88.        while( scanf("%lf", &dble)!= 1)
  89.         while( getchar() != '\n');
  90.        while( getchar() != '\n');
  91.     }
  92.     while( dble< -32768.0 || dble> 32767.0);
  93.         *entier= (int) dble;
  94. }
  95.  
  96. void LitDble( double *reel)
  97. {
  98.     while( scanf("%lf", reel)!= 1)
  99.         while( getchar() != '\n');
  100.     while( getchar() != '\n');
  101. }
  102.