/*************************************************************************************************************************************/ /* */ /* C A L C U L D ' U N P O L Y N O M E D E F I N I P A R U N F I C H I E R N U M E R I Q U E : */ /* */ /* */ /* Author of '$xrv/polynome.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20030805104547). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ #define LE_PREMIER_ELEMENT_DU_FICHIER_CORRESPOND_A_LA_PUISSANCE_LA_PLUS_ELEVEE \ FAUX \ /* Faut-il conserver l'ordre des elements du fichier ('VRAI') ou bien l'inverse ('FAUX') ? */ \ /* Ceci fut introduit le 20070904135332, la valeur par defaut garantissant la compatibilite */ \ /* anterieure. En fait, le 20070904140624, cela fut bouleverse : dorenavant le premier */ \ /* element du fichier correspond, par defaut, a la puissance la moins elevee de la variable, */ \ /* ce qui est evidemment plus logique que la convention anterieure... */ #define DIVISER_LES_COEFFICIENTS_PAR_LES_FACTORIELLES_APPROPRIEES \ FAUX \ /* Faut-il diviser les coefficients du polynome par les factorielles ('VRAI') ou les */ \ /* utiliser tels quels ('FAUX') ? Ceci fut introduit le 20070904125624 et la valeur par */ \ /* defaut garantit la compatibilite anterieure... */ #define VARIABLE \ FU \ /* Variable a utiliser pour calculer la valeur du polynome. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" /* Passage a l'allocation dynamique le 20060214193231... */ #define NOMBRE_DE_DECIMALES \ SEIZE #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" #define VALEUR_IMPLICITE \ FU gGENERATION_D_UN_FICHIER(fichier_des_valeurs,liste_des_valeurs); /* Definition en memoire du fichier. */ #define ELEMENT_DU_FICHIER(index) \ gELEMENT_DU_FICHIER(liste_des_valeurs,index) \ /* Acces a un element courant du fichier. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S C O E F F I C I E N T S E F F E C T I F S : */ /* */ /*************************************************************************************************************************************/ #define COEFFICIENT(coefficient,indice) \ COND(IL_FAUT(diviser_les_coefficients_par_les_factorielles_appropriees) \ ,DIVI(coefficient,FACT(indice)) \ ,NEUT(coefficient) \ ) \ /* Coefficient effectif du polynome (introduit le 20070904125624). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S E D I T I O N S : */ /* */ /*************************************************************************************************************************************/ #define FORMAT_EFFECTIF_D_EDITION(message) \ Cara(chain_Aconcaten5(message,INTRODUCTION_FORMAT,valeurs_signees,".*",format_d_edition)) \ /* Format effectif de certaines editions... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A L C U L D ' U N P O L Y N O M E D E F I N I P A R U N F I C H I E R N U M E R I Q U E : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Int,INIT(nombre_d_elements,NOMBRE_D_ELEMENTS)); /* Nombre d'elements attendus a priori dans le fichier. */ DEFV(Int,INIT(index,UNDEF)); /* Index de l'element courant dans le fichier. */ DEFV(Logical,INIT(le_premier_element_du_fichier_correspond_a_la_puissance_la_plus_elevee ,LE_PREMIER_ELEMENT_DU_FICHIER_CORRESPOND_A_LA_PUISSANCE_LA_PLUS_ELEVEE ) ); /* Faut-il conserver l'ordre des elements du fichier ('VRAI') ou bien l'inverse ('FAUX') ? */ /* Ceci fut introduit le 20070904135332, la valeur par defaut garantissant la compatibilite */ /* anterieure... */ DEFV(Float,INIT(variable,VARIABLE)); /* Variable a utiliser pour calculer la valeur du polynome. */ DEFV(Float,INIT(polynome,FZERO)); /* Valeur courante du polynome. */ DEFV(Logical,INIT(diviser_les_coefficients_par_les_factorielles_appropriees ,DIVISER_LES_COEFFICIENTS_PAR_LES_FACTORIELLES_APPROPRIEES ) ); /* Faut-il diviser les coefficients du polynome par les factorielles ('VRAI') ou les */ /* utiliser tels quels ('FAUX') ? Ceci fut introduit le 20070904125624 et la valeur par */ /* defaut garantit la compatibilite anterieure... */ #include xci/valeurs.03.I" /*..............................................................................................................................*/ GET_ARGUMENTS_(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; PROKESF_ARGUMENT_FICHIER("fichier=" ,fichier_des_valeurs ,liste_des_valeurs ,VALEUR_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); GET_ARGUMENT_L("premier_element__puissance_plus_elevee=""pe_ppe=""0N=" ,le_premier_element_du_fichier_correspond_a_la_puissance_la_plus_elevee ); GET_ARGUMENT_N("premier_element__puissance_moins_elevee=""pe_pme=""00=" ,le_premier_element_du_fichier_correspond_a_la_puissance_la_plus_elevee ); /* Parametres introduits le 20070904135332. On notera les notations suivantes : */ /* */ /* 00= */ /* 0N= */ /* */ /* ^^ */ /* || */ /* | ----------------- se refere a la puissance ("0" pour la moins elevee */ /* | et "N" pour la plus elevee), */ /* | */ /* ------------------ se refere au premier ("0") du fichier). */ /* */ GET_ARGUMENT_L("factorielles=""fact=",diviser_les_coefficients_par_les_factorielles_appropriees); /* Parametres introduits le 20070904125624... */ GET_ARGUMENT_F("x=""variable=",variable); GET_ARGUMENT_C("signe=",valeurs_signees); GET_ARGUMENT_C("format=",format_d_edition); /* On notera le 20070302110708, que l'on peut ecrire : */ /* */ /* format="f" */ /* */ /* ('v $Falias_change format=') comme argument explicite dans l'appel a une commande '$X'. */ /* Par contre, definir : */ /* */ /* set PaRaMeTrEs='... format="f" ...' */ /* */ /* puis appeler une commande '$X' avec comme argument explicite '$PaRaMeTrEs' ne marchera */ /* pas car, en effet, les '$K_QD' qui entourent le format 'f' seront integrees au format, */ /* ce qui est evidemment incorrect ('v $Falias_Udisk format='). Il a donc ete decide a cette */ /* date de ne jamais encadrer des formats ("f", "g",...) par des '$K_QD', quel que soit */ /* l'utilisation. Au passage, si l'on souhaitait veritablement "double quoter" les formats */ /* ("f", "g",...), il suffirait d'ecrire : */ /* */ /* set PaRaMeTrEs=`eval echo '... format="f" ...'` */ /* */ /* pour avoir les '$K_QD's et les "effacer" immediatement... */ GET_ARGUMENT_I("decimales=",nombre_de_decimales); ) ); #define il_faut_incrementer \ le_premier_element_du_fichier_correspond_a_la_puissance_la_plus_elevee \ /* Introduit le 20070907114253 pour ameliorer la lisibilite du 'DoVa(...)' qui suit... */ DoVa(index ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ,I ,il_faut_incrementer ) Bblock DEFV(Float,INIT(valeur_courante,ELEMENT_DU_FICHIER(index))); /* Recuperation de la valeur courante dans le fichier. */ EGAL(polynome ,HORNER_1_01(variable ,polynome ,COEFFICIENT(valeur_courante ,COND(EST_VRAI(il_faut_incrementer) ,SOUS(DERNIER_ELEMENT_D_UN_FICHIER,index) ,SOUS(index,PREMIER_ELEMENT_D_UN_FICHIER) ) ) ) ); /* Calcul optimise du polynome par la methode de Horner... */ Eblock EDoV #undef il_faut_incrementer CAL2(Prin2(FORMAT_EFFECTIF_D_EDITION(C_VIDE) ,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) ,polynome ) ); CAL2(Prin0("\n")); lGENERATION_D_UN_FICHIER(liste_des_valeurs,VALEUR_IMPLICITE); RETU_Commande; Eblock ECommande