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