/*************************************************************************************************************************************/
/* */
/* G E N E R A T I O N D E S U I T E S D E V A L E U R S : */
/* */
/* */
/* Author of '$xci/valeurs.02$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1994??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#ifndef iTRANSFORMATION
/* Ceci a ete ajoute le 20000117113044 lorsque ce fichier a ete inclus dans pratiquement */
/* tous les programmes '$xrv/*$K', alors que 'iTRANSFORMATION' est deja defini dans */
/* '$xrq/nucleon.LX.1$I', '$xrq/nucleon.Lf.2$I' et '$xrq/particle.Mf$I'. */
# define iTRANSFORMATION(np,npA,npB) \
ADD2(DIVI(FLOT(SOUS(np,npA)),FLOT(SOUS(npB,npA))),COORDONNEE_BARYCENTRIQUE_MINIMALE) \
/* Formule definissant la coordonnee barycentrique d'interpolation pour le numero de */ \
/* periode 'np' dans [npA,npB] : */ \
/* */ \
/* np - npA */ \
/* ----------- */ \
/* npB - npA */ \
/* */ \
/* Enfin, on notera que lors du calcul de 'iTRANSFORMATION(...)', on ne verifie pas que le */ \
/* resultat est dans [COORDONNEE_BARYCENTRIQUE_MINIMALE,COORDONNEE_BARYCENTRIQUE_MAXIMALE]. */
# define iDERIVATION(dt,npA,npB) \
DIVI(dt,LENG(npA,npB)) \
/* Formule "renormalisant" les derivees par rapport au nombre de periodes. */
# define iINTERPOLATION_LINEAIRE(tA,dtA,tB,dtB,np,npA,npB) \
INTERPOLATION_LINEAIRE(tA \
,tB \
,iTRANSFORMATION(np,npA,npB) \
)
# define iINTERPOLATION_CUBIQUE(tA,dtA,tB,dtB,np,npA,npB) \
INTERPOLATION_CUBIQUE(tA,iDERIVATION(dtA,npA,npB) \
,tB,iDERIVATION(dtB,npA,npB) \
,iTRANSFORMATION(np,npA,npB) \
)
/* Formules definissant les methodes d'interpolation. */
#Aifndef iTRANSFORMATION
#Eifndef iTRANSFORMATION
#define EDITION_DE_LA_VALEUR_DE_L_OPERATEUR(valeur_de_l_operateur) \
Bblock \
DEFV(CHAR,INIT(POINTERc(format_d_edition_de_la_valeur_de_l_operateur) \
,chain_Aconcaten4(INTRODUCTION_FORMAT,valeurs_signees,".*",FORMAT_D_EDITION_EFFECTIF) \
) \
); \
\
CAL2(Prin2(Cara(format_d_edition_de_la_valeur_de_l_operateur) \
,NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) \
,MULTIPLE_DE(ENTIER_FLOTTANT(valeur_de_l_operateur)) \
) \
); \
\
CALZ_FreCC(format_d_edition_de_la_valeur_de_l_operateur); \
Eblock \
/* Introduit le 20180313142557 pour permettre l'execution d'un 'CALZ_FreCC(...)'... */
#ifdef DES_NOMBRES_ENTIERS
/* Ceci a ete ajoute le 20081120143333 pour 'v $xci/valeurs_SurR$K 20081120142701'... */
# define FORMAT_D_EDITION_EVENTUELLEMENT_ENTIER \
COND(IL_FAUT(des_nombres_entiers) \
,ptCARA(FORMAT_D_EDITION_g) \
,format_d_edition \
) \
/* Dans le cas ou l'edition de nombres entiers est demande, il faut forcer le format */ \
/* 'FORMAT_D_EDITION_g'. Ceci fut introduit le 20081120100649 afin de permettre d'editer */ \
/* des nombres entiers avec des ecritures (d'apparence paradoxale) du type : */ \
/* */ \
/* format=f entier=VRAI */ \
/* */ \
/* Dans cet exemple le parametre "format=f" sera ignore et "format=g" sera en fait utilise */ \
/* grace a la procedure 'FORMAT_D_EDITION_g'. Cela s'est vu lors du developpement des */ \
/* commandes du type 'v $xci/StatLigne.01$Z .FoRmAt.entier=VRAI' ou la variable '$FoRmAt' */ \
/* contient "format=f"... */
#Aifdef DES_NOMBRES_ENTIERS
# define FORMAT_D_EDITION_EVENTUELLEMENT_ENTIER \
format_d_edition
#Eifdef DES_NOMBRES_ENTIERS
#define FORMAT_D_EDITION_EFFECTIF \
COND(IL_FAUT(ajouter_un_K_LF_en_fin_de_format_d_edition) \
,chain_Aconcaten2(FORMAT_D_EDITION_EVENTUELLEMENT_ENTIER,C_LF) \
,FORMAT_D_EDITION_EVENTUELLEMENT_ENTIER \
) \
/* Format d'edition effectif (introduit le 20040323142056). */
#ifdef DES_NOMBRES_ENTIERS
/* Ceci a ete ajoute le 20081121142050 pour 'v $xci/valeurs_SurR$K 20081120142701'... */
# define NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) \
COND(IL_FAUT(des_nombres_entiers) \
,NOMBRE_DE_DECIMALES \
,COND(IFEQ_chaine(FORMAT_D_EDITION_EVENTUELLEMENT_ENTIER,FORMAT_D_EDITION_g) \
,nombre_de_decimales \
,nombre_de_decimales \
) \
) \
/* Formule permettant de selectionner le nombre de decimales effectif en fonction du format */ \
/* utilise, sachant qu'avec le format "g" le "nombre de decimales" designe en fait le */ \
/* nombre de chiffres... */ \
/* */ \
/* ATTENTION, pendant "quelques minutes" avant le 20011207174434, j'ai utilise : */ \
/* */ \
/* COND(IFEQ_chaine(format_d_edition,FORMAT_D_EDITION_g) */ \
/* ,NOMBRE_DE_DECIMALES */ \
/* ,nombre_de_decimales */ \
/* ) */ \
/* */ \
/* mais, malheureusement, cela risque de poser quelques problemes de compatibilite (c'est */ \
/* par exemple le cas de 'v $xiird/.ACIN.G.11.$U decimales=8') ; cette definition est */ \
/* dond (provisoirement ?) "annulee"... */ \
/* */ \
/* Le 20081121134507 fut introduit le test des nombres entiers, afin de prendre en compte, */ \
/* comme le 20081120100649 ci-dessus, les ecritures (d'apparence paradoxale) du type : */ \
/* */ \
/* format=f decimales=2 entier=VRAI */ \
/* */ \
/* Dans cet exemple le parametre "decimales=2" sera remplace par "decimales=14". Cela s'est */ \
/* vu lors du developpement des commandes du type 'v $xci/StatLigne.01$Z decimales='... */
# define ENTIER_FLOTTANT(x) \
COND(IL_FAUT(des_nombres_entiers) \
,AINT_a_peu_pres(x,epsilon_de_conversion_entier) \
,x \
) \
/* Formule permettant d'editer soit des nombres flottants entiers, soit des nombres */ \
/* flottants avec leurs decimales... */
#Aifdef DES_NOMBRES_ENTIERS
# define NOMBRE_DE_DECIMALES_EFFECTIF(nombre_de_decimales) \
COND(IFEQ_chaine(FORMAT_D_EDITION_EVENTUELLEMENT_ENTIER,FORMAT_D_EDITION_g) \
,nombre_de_decimales \
,nombre_de_decimales \
) \
/* Formule permettant de selectionner le nombre de decimales effectif en fonction du format */ \
/* utilise, sachant qu'avec le format "g" le "nombre de decimales" designe en fait le */ \
/* nombre de chiffres... */
# define ENTIER_FLOTTANT(x) \
NEUT(x) \
/* Formule permettant d'editer soit des nombres flottants entiers, soit des nombres */ \
/* flottants avec leurs decimales... */
#Eifdef DES_NOMBRES_ENTIERS
#define MULTIPLE_DE(x) \
COND(IL_FAUT(etre_multiple_de) \
,MULTIPLE(x,unite_de_multiplicite) \
,x \
) \
/* Formule permettant, si necessaire, de ramener la valeur courante a un multiple */ \
/* de 'unite_de_multiplicite'. */
#define MODULO(x) \
COND(IL_FAUT(etre_modulo) \
,fMODF(x,origine_modulo,extremite_modulo) \
,x \
) \
/* Formule permettant, si necessaire, de ramener la valeur courante dans un segment */ \
/* [origine,extremite] modulo... */
#ifdef DES_NOMBRES_ENTIERS
/* Ceci a ete ajoute le 20081120144332 pour 'v $xci/valeurs_SurR$K 20081120142701'... */
# define PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_ENTIERES \
Bblock \
\
DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
\
GET_ARGUMENT_L("entiers=""entier=""e=",des_nombres_entiers); \
/* Le parametre "entiers=" fut introduit le 20070104135147 car il s'agit en fait de la forme */ \
/* la plus utilisee... */ \
GET_ARGUMENT_F("epsilon=",epsilon_de_conversion_entier); \
\
FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
\
Eblock \
/* Introduit le 20081120144332... */
#Aifdef DES_NOMBRES_ENTIERS
# define PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_ENTIERES \
Bblock \
\
DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
\
BLOC(VIDE;); \
\
FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
\
Eblock \
/* Introduit le 20081120144332... */
#Eifdef DES_NOMBRES_ENTIERS
#define PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1 \
Bblock \
\
DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
/* Introduit le 20070130091001 car, en effet, il manquait... */ \
\
GET_ARGUMENT_C("signe=",valeurs_signees); \
GET_ARGUMENT_C("format=",format_d_edition); \
/* On notera le 20070302105758, 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); \
/* On notera bien qu'il s'agit d'un synonyme de 'v $xig/fonct$vv$DEF ChiffresFlot='... */ \
\
PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_ENTIERES; \
/* Introduit le 20081120144332 sous cette forme... */ \
\
GET_ARGUMENT_L("multiple=",etre_multiple_de); \
GET_ARGUMENT_F("unite=",unite_de_multiplicite); \
\
FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
/* Introduit le 20070130091001 car, en effet, il manquait... */ \
\
Eblock \
/* Introduit le 20061226180952... */
#define PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_2 \
Bblock \
\
DEBUT_D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
/* Introduit le 20070130091001 car, en effet, il manquait... */ \
\
GET_ARGUMENT_L("LF=""K_LF=",ajouter_un_K_LF_en_fin_de_format_d_edition); \
\
FIN___D_IMBRICATION_DES_____gPROCESS_PARAMETRE_____SECONDAIRES; \
/* Introduit le 20070130091001 car, en effet, il manquait... */ \
\
Eblock