home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- * CH12_05.C Fonction Gamma d'Euler *
- * Elle est dΘfinie pour toutes valeurs de x sauf les entiers nΘgatifs*
- * *
- * Ce programme ne couvre que le domaine x: [ 0, 170.6 ] *
- * La fonction renvoie une valeur nulle en cas de succΘs et -1 si *
- * x sort de son domaine. La prΘcision relative est de l'ordre de *
- * 1e-12 entre 0 et 3 et mieux au delα. *
- * Elle utilise le dΘveloppement de Log [ Gamma( x) ]. *
- * *
- *********************************************************************/
-
- #include<stdio.h>
- #include<math.h>
-
- enum logique { Echec= -1, Succes, Vrai= 0, Faux} test, x_entier;
-
- void LitInt( int*);
- void LitDble( double*);
- enum logique Gamma( const double, double*);
-
- main( void)
- {
- int n= 8;
- double x, fde_x;
-
- printf(" Calcul de Gamma( x) pour x= ] 0 ; 171.6 ] \n\n");
-
- do
- {
- printf(" Entrez la valeur de x: ");
- LitDble( &x);
- }
- while( x<= 0 || x> 171.6);
-
- test= Gamma( x, &fde_x);
-
- if( x_entier== Vrai) n= 0;
- if( test== Succes) printf("\n Gamma(%.*lf)= %.*lf",
- n, x, n, fde_x);
- else printf("\n Echec de la fonction!");
- }
-
- enum logique Gamma( const double u, double *y)
- {
- double z, t= u,
- PI= 3.14159265358979323846,
- epsilon= 1e-300;
-
- if( t< 0+ epsilon || t> 171.6 )
- {
- printf("\n Hors limites: x= ] 0 ; 171.6 ] ");
- return( Echec);
- }
- if( u> 0 && u< 3) t+= 4;
-
- z= exp( t* ( log( t)- 1)
- - 0.5* log( t)
- + 0.5* log( 2* PI)
- + 1.0/ ( 12 * t )
- - 1.0/ ( 360 * pow( t, 3))
- + 1.0/ ( 1260 * pow( t, 5))
- - 1.0/ ( 1685.78* pow( t, 7))
- + 1.0/ ( 1300.60* pow( t, 9))
- - 1.0/ ( 1014.84* pow( t, 11))
- + 1.0/ ( 1915.86* pow( t, 13))
- );
-
- if( u> 0 && u< 3) z/= ( t- 1)* ( t- 2)* ( t- 3)* ( t- 4);
-
- x_entier= ( t== floor( t)) ? Vrai: Faux;
- if( x_entier== Vrai) *y= floor( z+ 0.5);
- else *y= z;
-
- return( Succes);
- }
-
- void LitInt( int *entier)
- {
- double dble;
- do
- {
- while( scanf("%lf", &dble)!= 1)
- while( getchar() != '\n');
- while( getchar() != '\n');
- }
- while( dble< -32768.0 || dble> 32767.0);
- *entier= (int) dble;
- }
-
- void LitDble( double *reel)
- {
- while( scanf("%lf", reel)!= 1)
- while( getchar() != '\n');
- while( getchar() != '\n');
- }
-