home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************************
- * CH12_04.C Fonction Factorielle: x! *
- * *
- * x! est dΘfinie pour tout x sauf les entiers nΘgatifs -1, -2, -3,..*
- * *
- * Ce programme ne couvre que le domaine x: [ -1 , 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 -1 et 3 et mieux au delα. Elle utilise la fonction *
- * Gamma d'Euler et le dΘveloppement de son logarithme: *
- * *
- * Log x!= Log [ Gamma( x+ 1) ] *
- * *
- *********************************************************************/
-
- #include<stdio.h>
- #include<math.h>
-
- enum logique { Echec= -1, Succes, Vrai= 0, Faux} x_entier;
-
- void LitInt( int*);
- void LitDble( double*);
- enum logique Fact( const double, double*);
-
- main( void)
- {
- int n= 12;
- double x, fde_x;
- enum logique test;
-
- printf(" Calcul de x! pour x rΘel= ] -1 ; 170.6 ] \n\n");
-
- do
- {
- printf(" Entrez la valeur de x: ");
- LitDble( &x);
- }
- while( x< -1 || x> 170.6);
-
- test= Fact( x, &fde_x);
-
- if( x_entier== Vrai)
- n= 0;
- if( test== Succes)
- printf("\n %.*lf!= %.*lf", n, x, n, fde_x);
- else printf("\n Echec de la fonction!");
- }
-
- enum logique Fact( const double u, double *fact)
- {
- double z, t= u,
- PI= 3.14159265358979323846,
- epsilon= 1e-300;
-
- if( t< -1+ epsilon || t> 170.6 )
- {
- printf("\n Hors limites: x= ] -1 ; 170.6 ] ");
- return( Echec);
- }
- if( u> -1 && u< 3) t+= 4;
-
- z= exp( t* ( log( t)- 1)
- + 0.5* log( 2.0* PI* t)
- + 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> -1 && u< 3) z/= t* ( t- 1)* ( t- 2)* (t- 3);
-
- x_entier= ( t== floor( t)) ? Vrai: Faux;
-
- if( x_entier== Vrai) *fact= floor( z+ 0.5);
- else *fact= 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');
- }
-