/*************************************************************************************************************************************/
/* */
/* 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