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

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