/*************************************************************************************************************************************/
/* */
/* A V A N T - P R E M I E R E P A R T I E D E S D E F I N I T I O N S D U L A N G A G E ' K ' */
/* D E P E N D A N T E S D U L A N G A G E S O U R C E ( ' C ' ) : */
/* */
/* */
/* Definition : */
/* */
/* Dans ce fichier, se trouvent toutes les */
/* constantes, les definitions et les macros */
/* utiles a la definition du langage 'K' et */
/* qui dependent du langage source (le 'C'). */
/* */
/* */
/* Author of '$xil/defi_c3$vv$DEF' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 20040417150812). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N D U S Y S T E M E U T I L I S E : */
/* */
/* */
/* Nota : */
/* */
/* on definit ici le systeme utilise */
/* pour compiler les modules, et ce sous */
/* la forme : ORDINATEUR/OS/COMPILATEUR, */
/* ou 'OS' designe le systeme d'exploitation. */
/* Les noms suivants sont reconnus pour */
/* la variable-shell 'SYSTEME' : */
/* */
/* SYSTEME_APC_LinuxDebian_GCC, */
/* SYSTEME_APC_LinuxMandrake_GCC, */
/* SYSTEME_APC_LinuxRedHat_GCC, */
/* SYSTEME_APC_LinuxUbuntu_GCC, */
/* SYSTEME_APC_LinuxUbuntu_ICC, */
/* SYSTEME_APC_LinuxUlmint_GCC, */
/* SYSTEME_APC_LinuxUlmint_ICC, */
/* SYSTEME_CRAY2_UNICOS_CC, */
/* SYSTEME_CRAY2_UNICOS_SCC, */
/* SYSTEME_CRAYC98_UNICOS_CC, */
/* SYSTEME_CRAYC98_UNICOS_SCC, */
/* SYSTEME_CRAYC916_UNICOS_CC, */
/* SYSTEME_CRAYC916_UNICOS_SCC, */
/* SYSTEME_CRAYYMP1_UNICOS_CC, */
/* SYSTEME_CRAYYMP1_UNICOS_SCC, */
/* SYSTEME_CRAYYMP2_UNICOS_CC, */
/* SYSTEME_CRAYYMP2_UNICOS_SCC, */
/* SYSTEME_CRAYYMP4_UNICOS_CC, */
/* SYSTEME_CRAYYMP4_UNICOS_SCC, */
/* SYSTEME_DECALPHA340_OSF1_CC, */
/* SYSTEME_DECALPHA340_OSF1_GCC, */
/* SYSTEME_DECALPHA340_OSF1_CC, */
/* SYSTEME_DECALPHA340_OSF1_GCC, */
/* SYSTEME_DPX2000_SPIX_CC, */
/* SYSTEME_DPX5000_SPIX_CC, */
/* SYSTEME_ES9000_AIX_CC, */
/* SYSTEME_FX2800_CONCENTRIX_FXC, */
/* SYSTEME_FX2800_CONCENTRIX_PCC, */
/* SYSTEME_FX2800_CONCENTRIX_SCC, */
/* SYSTEME_FX40_CONCENTRIX_CC, */
/* SYSTEME_FX40_CONCENTRIX_FXC, */
/* SYSTEME_HP705_HPUX_CC, */
/* SYSTEME_HP710_HPUX_CC, */
/* SYSTEME_HP720_HPUX_CC, */
/* SYSTEME_HP750_HPUX_CC, */
/* SYSTEME_HP755_HPUX_CC, */
/* SYSTEME_HP819_HPUX_CC, */
/* SYSTEME_NWS3000_NEWSOS_CC, */
/* SYSTEME_NWS3000_NEWSOS_2CC, */
/* SYSTEME_RS6000_AIX_CC, */
/* SYSTEME_SG4D20G_IRIX_CC, */
/* SYSTEME_SG4D25TG_IRIX_CC, */
/* SYSTEME_SG4D310VGX_IRIX_CC, */
/* SYSTEME_SG4D35TG_IRIX_CC, */
/* SYSTEME_SG4D85GT_IRIX_CC, */
/* SYSTEME_SGIND308_IRIX_CC, */
/* SYSTEME_SGIND324_IRIX_CC, */
/* SYSTEME_SGIND3GA_IRIX_CC, */
/* SYSTEME_SGIND408_IRIX_CC, */
/* SYSTEME_SGIND424_IRIX_CC, */
/* SYSTEME_SGIND4GA_IRIX_CC, */
/* SYSTEME_SGIND508_IRIX_CC, */
/* SYSTEME_SGIND524_IRIX_CC, */
/* SYSTEME_SGIND5GA_IRIX_CC, */
/* SYSTEME_SGIND808_IRIX_CC, */
/* SYSTEME_SGIND824_IRIX_CC, */
/* SYSTEME_SGIND8GA_IRIX_CC, */
/* SYSTEME_SGINDA08_IRIX_CC, */
/* SYSTEME_SGINDA24_IRIX_CC, */
/* SYSTEME_SGINDAGA_IRIX_CC, */
/* SYSTEME_SGO200A1_IRIX_CC, */
/* SYSTEME_SGO200A2_IRIX_CC, */
/* SYSTEME_SGO200A4_IRIX_CC, */
/* SYSTEME_SGO25224_IRIX_CC, */
/* SYSTEME_SGO252VA_IRIX_CC, */
/* SYSTEME_SGO252VN_IRIX_CC, */
/* SYSTEME_SGPCM801_IRIX_CC, */
/* SYSTEME_SGPCMA01_IRIX_CC, */
/* SYSTEME_SPS9_ROS_CC, */
/* SYSTEME_SPS9_ROS_RC, */
/* SYSTEME_SUN3_SUNOS_CC, */
/* SYSTEME_SUN4_SUNOS_CC, */
/* SYSTEME_SUN4NCUBE2S_SUNOS_CC, */
/* SYSTEME_SUN4NCUBE2S_SUNOS_NCC, */
/* SYSTEME_VAX8600_ULTRIX_CC, */
/* SYSTEME_VAX8600_ULTRIX_VCC, */
/* SYSTEME_VAX9000_ULTRIX_CC, */
/* SYSTEME_VAX9000_ULTRIX_GCC, */
/* SYSTEME_VAX9000_ULTRIX_VCC. */
/* */
/* La variable 'SYSTEME' est definie par un */
/* "#define" implicite lors de la phase de */
/* pre-processing par 'cpp' (option "-D"). */
/* */
/* Mais ATTENTION, actuellement, l'ensemble */
/* des logiciels n'a ete teste que pour (le */
/* symbole "-->" indiquant le compilateur qui est */
/* effectivement utilise lorsqu'il y a le choix */
/* entre plusieurs) : */
/* */
/* --> SYSTEME_APC_LinuxDebian_GCC, */
/* --> SYSTEME_APC_LinuxMandrake_GCC, */
/* --> SYSTEME_APC_LinuxRedHat_GCC, */
/* --> SYSTEME_APC_LinuxUbuntu_GCC, */
/* --> SYSTEME_CRAY2_UNICOS_SCC, */
/* --> SYSTEME_CRAYC98_UNICOS_SCC, */
/* --> SYSTEME_CRAYC916_UNICOS_SCC, */
/* --> SYSTEME_CRAYYMP1_UNICOS_SCC, */
/* --> SYSTEME_CRAYYMP2_UNICOS_SCC, */
/* --> SYSTEME_CRAYYMP4_UNICOS_SCC, */
/* --> SYSTEME_DECALPHA340_OSF1_CC, */
/* --> SYSTEME_DECALPHA340_OSF1_GCC, */
/* --> SYSTEME_DECALPHA340_OSF1_CC, */
/* --> SYSTEME_DECALPHA340_OSF1_GCC, */
/* --> SYSTEME_DPX5000_SPIX_CC, */
/* --> SYSTEME_ES9000_AIX_CC, */
/* SYSTEME_FX2800_CONCENTRIX_FXC, */
/* --> SYSTEME_FX2800_CONCENTRIX_SCC, */
/* --> SYSTEME_HP705_HPUX_CC, */
/* --> SYSTEME_HP710_HPUX_CC, */
/* --> SYSTEME_HP720_HPUX_CC, */
/* --> SYSTEME_HP750_HPUX_CC, */
/* --> SYSTEME_HP755_HPUX_CC, */
/* --> SYSTEME_HP819_HPUX_CC, */
/* SYSTEME_NWS3000_NEWSOS_CC, */
/* --> SYSTEME_NWS3000_NEWSOS_2CC, */
/* --> SYSTEME_RS6000_AIX_CC, */
/* --> SYSTEME_SG4D20G_IRIX_CC, */
/* --> SYSTEME_SG4D25TG_IRIX_CC, */
/* --> SYSTEME_SG4D310VGX_IRIX_CC, */
/* --> SYSTEME_SG4D35TG_IRIX_CC, */
/* --> SYSTEME_SG4D85GT_IRIX_CC, */
/* --> SYSTEME_SGIND308_IRIX_CC, */
/* --> SYSTEME_SGIND324_IRIX_CC, */
/* --> SYSTEME_SGIND3GA_IRIX_CC, */
/* --> SYSTEME_SGIND408_IRIX_CC, */
/* --> SYSTEME_SGIND424_IRIX_CC, */
/* --> SYSTEME_SGIND4GA_IRIX_CC, */
/* --> SYSTEME_SGIND508_IRIX_CC, */
/* --> SYSTEME_SGIND524_IRIX_CC, */
/* --> SYSTEME_SGIND5GA_IRIX_CC, */
/* --> SYSTEME_SGIND808_IRIX_CC, */
/* --> SYSTEME_SGIND824_IRIX_CC, */
/* --> SYSTEME_SGIND8GA_IRIX_CC, */
/* --> SYSTEME_SGINDA08_IRIX_CC, */
/* --> SYSTEME_SGINDA24_IRIX_CC, */
/* --> SYSTEME_SGINDAGA_IRIX_CC, */
/* --> SYSTEME_SGO200A1_IRIX_CC, */
/* --> SYSTEME_SGO200A2_IRIX_CC, */
/* --> SYSTEME_SGO200A4_IRIX_CC, */
/* --> SYSTEME_SGO25224_IRIX_CC, */
/* --> SYSTEME_SGO252VA_IRIX_CC, */
/* --> SYSTEME_SGO252VN_IRIX_CC, */
/* --> SYSTEME_SGPCM801_IRIX_CC, */
/* --> SYSTEME_SGPCMA01_IRIX_CC, */
/* SYSTEME_SPS9_ROS_CC, */
/* --> SYSTEME_SPS9_ROS_RC, */
/* --> SYSTEME_SUN3_SUNOS_CC, */
/* --> SYSTEME_SUN4_SUNOS_CC, */
/* --> SYSTEME_SUN4NCUBE2S_SUNOS_CC, */
/* --> SYSTEME_SUN4NCUBE2S_SUNOS_NCC, */
/* --> SYSTEME_VAX9000_ULTRIX_GCC. */
/* */
/* et avec une bonne probabilite de reussite */
/* pour : */
/* */
/* SYSTEME_CRAY2_UNICOS_CC, */
/* SYSTEME_CRAYC98_UNICOS_CC, */
/* SYSTEME_CRAYC916_UNICOS_CC, */
/* SYSTEME_CRAYYMP1_UNICOS_CC, */
/* SYSTEME_CRAYYMP2_UNICOS_CC, */
/* SYSTEME_CRAYYMP4_UNICOS_CC, */
/* SYSTEME_FX40_CONCENTRIX_CC, */
/* SYSTEME_FX40_CONCENTRIX_FXC, */
/* SYSTEME_VAX8600_ULTRIX_CC, */
/* SYSTEME_VAX9000_ULTRIX_CC. */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R E N T H E S A G E : */
/* */
/*************************************************************************************************************************************/
/* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */
/* definitions soient faites avant d'autres ; en particulier 'PARE(...)' doit etre definie */
/* avant tout '-define ...'. */
#define PARE(x) \
(x) \
/* Parenthesage d'un argument. Pour des raisons liees a la derivation d'ordre superieur a */ \
/* 1 lors de l'utilisation de fonctions du type 'INTE(...)' ou 'INTE(...)', la fonction */ \
/* 'PARE(...)' a ete transferee de '$xil/defi_K1$vv$DEF' a '$xil/defi_c1$vv$DEF', puis */ \
/* a '$xil/defi_c3$vv$DEF' le 20040417150812... */
-define NEUT(x) \
-_-_-_- PARE(x)
/* Le 20050822173929, a cause de l'usage 'v $xrs/Mobius2D.11$I NEUD', la definition */
/* anterieure de 'NEUT(...)' : */
/* */
/* #define NEUT(x) \ */
/* SE11(x) */
/* */
/* a donc ete simplifiee et deplacee de '$xil/defi_K1$vv$DEF' a '$xil/defi_c3$vv$DEF'. En */
/* effet, le passage de '$PASSE_1' a '$PASSE_D' des definitions suivantes (en chaine...) : */
/* */
/* NEUT */
/* SE11 */
/* gSE11 */
/* PARE */
/* LIS2 a cause de 'v $xil/defi_c1$vv$DEF MdTb1', ce qui */
/* sinon cree des structures du type'PARE(...,...)'. */
/* */
/* ne suffisaient pas car, en effet, apparaisaient alors dans les '$c' de type derivables */
/* des ecritures du type (d_(VARIABLE)) (ou "VARIABLE" designe une variable quelconque et */
/* et derivable), d'ou pour simplifier (et la, j'ai honte...), cette nouvelle definition */
/* et son demenagement... */
#define ndNEUT(x) \
PARE(x) \
/* Introduit le 20130330190521 pour 'v $xci/valeurs_Arbre.01$K ndNEUT'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* G A R A N T I E C O N C E R N A N T L ' O R D R E D E S Q U A T R E O P E R A T I O N S */
/* D E B A S E A V E C T Y P A G E ' Float ' S I M U L T A N E : */
/* */
/* */
/* Nota : */
/* */
/* On donne donc le choix entre l'operateur */
/* de base {+,-,*,/} et la fonction 'Float' qui */
/* est associee a chacun d'eux soit respectivement */
/* {sfADD2(...),sfSOUS(...),sfMUL2(...),sfDIVI(...)}. */
/* */
/* On notera qu'il est malheureusement impossible */
/* d'ecrire : */
/* */
/* #define gDIVI(a,b) \ */
/* _____ifdef(++D++GooF++F++ \ */
/* ,sfDIVI(a,b) \ */
/* ,PARE(PARE(a) / PARE(b)) \ */
/* ) */
/* */
/* car cela equivaut a ecrire : */
/* */
/* #define gDIVI(a,b) */
/* _____ifdef(++D++GooF++F++ ,sfDIVI(a,b) ,...) */
/* . . */
/* /|\ /|\ */
/* | | */
/* | | */
/* */
/* avec un blanc (au moins) devant les virgules ; cela */
/* rend faux le test '_____ifdef(...)' lorsque le symbole */
/* 'GooF' existe (il est alors declare inexistant...). */
/* */
/* */
/* L'activation du dispositif se fera par : */
/* */
/* ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* */
/* et sa desactivation ensuite par : */
/* */
/* DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* */
/* (a la facon de couples de parentheses) */
/* et cela autant de fois que necessaire... */
/* */
/* */
/* Mais ATTENTION, des experiences menees a l'aide de */
/* 'v $xrs/sphere.11$K' ont montre que cette garantie ne */
/* peut porter globalement sur un tel programme, mais */
/* uniquement sur de petits modules (par exemple, le */
/* calcul des trois fonctions {Fx(u,v),Fy(u,v),Fz(u,v)} de */
/* ce programme. En effet, des operateurs tels : */
/* */
/* #define IdTb1(vecteur,index,dimension) \ */
/* PINDIRECT(ADD2(vecteur,ITb1c(index,dimension))) */
/* */
/* ne peuvent etre modifies selon : */
/* */
/* #define IdTb1(vecteur,index,dimension) \ */
/* PINDIRECT(INTE(ADD2(vecteur,ITb1c(index,dimension)))) */
/* */
/* l'operateur d'indirection "*" n'acceptant pas le "cast" */
/* 'Int' non plus evidemment que le type 'Float' */
/* resultant de 'sfADD2(...)' via 'ADD2(...)'. Le 20040419084011 */
/* ont ete introduits les quatre operateurs "Basiques" (et en */
/* particulier 'bADD(...)') destines a resoudre ce probleme. */
/* Mais cela n'etait pas suffisant ; il a fallu aussi faire la */
/* modification 'v $xil/defi_c1$vv$DEF 20040423155513'... */
/* */
/* D'autre part, l'utilisation generalisee du mode 'GooF' */
/* pourrait creer des problemes dans de nombreux formats */
/* d'entrees-sorties de type "%d" qui attendent donc des */
/* nombres de type 'Int' et qui seraient alors de type 'Float'... */
/* */
/* Le 20040419112422, j'ai remplace 'GarantirOrdreOperations_AvecTypeFloat' */
/* par 'GooF' (une abbreviation...) afin de reduire la longueur des */
/* chaines traitees par '$xcc/xpp$X' (message "actuals too long"). */
/* */
/* Le 20040419123740, il a fallu substituer {+-D-+,+-F-+} de */
/* substitution des quotes de '$M4' par {++D++,++F++} dans */
/* 'v $xccp/GarOrdre$vv$m4 _____changequote' a cause des */
/* options '-c$PASSE_D ... -k$Us' lors d'un '$xcp/cpp$X' */
/* de "Derivations d'ordre superieur". Au passage, il etait */
/* essentiel de remplacer "-" par un caractere non alpha-numerique */
/* (tel "+") afin de ne pas provoquer de concatenation avec un */
/* nom de symbole (de ce point de vue-la, '_SYMBOLE_' et '-SYMBOLE-' */
/* sont bien differents...). Rappelons qu'a cette date, la */
/* valeur de '$PASSE_D' est precisemment "-"... */
/* */
/* Le 20040504142248 je suis passe de {_____define,_____undefine} */
/* a {_____pushdef,_____popdef} qui est beaucoup plus asticieux et */
/* beaucoup plus prudent. Cela permet ainsi d'imbriquer volontairement */
/* ou involontairement (par exemple via des 'include's) ces activations */
/* et desactivations de 'GooF' et ce sans risque, par exemple, de desactiver */
/* (a cause donc d'un '_____undefine(...)' imbrique lui-meme a l'interieur */
/* d'un {_____define,_____undefine}) le dispositif... */
/* */
/* Du cote des performances, l'experience montre qu'il */
/* vaut mieux eviter d'appliquer 'GooF' globalement a tout */
/* un programme. A titre d'exemple le calcul de 'v $xiirs/MOB3.11' */
/* (a la base du probleme 'v $xiirs/$Fnota 20040330115702'), qui */
/* en temps normal prend environ une minute sur '$LACT15' ), n'etait */
/* pas termine au bout de 24 heures en mode 'GooF' global... */
/* */
/* */
/* Enfin, on notera que lorsque le mode 'GooF' est active, */
/* alors il resoud simultanement le probleme ennuyeux decrit */
/* dans 'v $Fcompilers 20040220103647'. */
/* */
/* */
/* ATTENTION : */
/* */
/* En resume donc, d'une part l'activation et la */
/* desactivation du mode 'GooF' se fait respectivement */
/* par : */
/* */
/* #define PRAGMA_CPP_____AUTORISER_LE_GooF */
/* */
/* avant tout include (et en particulier avant l'include */
/* "DEFINITIONS.I") pour autoriser le processus ; puis */
/* pour l'activer la ou cela est necessaire : */
/* */
/* ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* */
/* et : */
/* */
/* DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* */
/* (a la facon de couples de parentheses). D'autre */
/* part, lors de problemes ponctuels survenant lorsque */
/* le mode 'GooF' est active, on pourra remplacer */
/* localement l'un des operateurs {ADD2(...),SOUS(...),MUL2(...),DIVI(...)} */
/* par sa version "Basique" {bADD(...),bSOU(...),bMUL(...),bDIV(...)}. */
/* Cela sera, par exemple le cas d'entrees-sorties en format "%d"... */
/* */
/* Enfin, l'utilsation du mode 'GooF' n'est conseille que */
/* que sur de petis modules afin de reduire la duree du */
/* travail de '$xcc/cpp$Z' et de ne pas trop penaliser les */
/* performances du '$X' ainsi genere... */
/* */
/* Une experience effectuee le 20070125160322 sur */
/* 'v $xcg/ADD3.01$K GooF' ont montre que les appels a */
/* {ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF,DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF} */
/* pouvaient se trouver eux-memes dans une procedure. Ainsi, */
/* il sera possible d'ecrire : */
/* */
/* #define PROCEDURE(arguments) \ */
/* Bblock \ */
/* BLOC(SEQUENCE1;); \ */
/* ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF \ */
/* BLOC(SEQUENCE2;); \ */
/* DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF \ */
/* BLOC(SEQUENCE3;); \ */
/* Eblock */
/* */
/* puis : */
/* */
/* PROCEDURE(arguments); */
/* */
/* Dans cet exemple les blocs {SEQUENCE1,SEQUENCE3} */
/* s'executeront en mode "normal", alors que le bloc */
/* {SEQUENCE2} s'executera en mode 'GooF'. */
/* */
/* Une application de cela est de definir des fonctions */
/* qui pourraient s'executer en mode "normal" ou en mode */
/* 'GooF' en definissant leur "contenu" via une procedure */
/* telle 'PROCEDURE(...)' ci-apres : */
/* */
/* #define PROCEDURE(arguments) \ */
/* Bblock \ */
/* BLOC(SEQUENCE;); \ */
/* Eblock */
/* */
/* et en programmant ainsi le corps de la fonction : */
/* */
/* Bblock */
/* Test(IL_FAUT(executer_la_fonction_en_mode_normal)) */
/* Bblock */
/* PROCEDURE(arguments); */
/* Eblock */
/* ATes */
/* Bblock */
/* ACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* PROCEDURE(arguments); */
/* DESACTIVER__S_IL_EST_ACTIVABLE__ET__SI_UTILE__GooF */
/* Eblock */
/* ETes */
/* Eblock */
/* */
/* et ainsi la fonction a bien deux modes possibles d'execution */
/* controles par l'indicateur 'executer_la_fonction_en_mode_normal'. */
/* Voir 'v $xil/defi_K2$vv$DEF US._GooF' a ce propos... */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* O P E R A T I O N S A R I T H M E T I Q U E S D ' A D D I T I O N : */
/* */
/*************************************************************************************************************************************/
#define bADD(a,b) \
PARE(PARE(a) + PARE(b)) \
/* Addition des deux nombres 'a' et 'b'. */
/* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */
/* definitions soient faites avant d'autres ; en particulier 'bADD(...)' doit etre definie */
/* avant tout '-define ...' qui l'utilise... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* O P E R A T I O N S A R I T H M E T I Q U E S D E S O U S T R A C T I O N : */
/* */
/*************************************************************************************************************************************/
#define bSOU(a,b) \
PARE(PARE(a) - PARE(b)) \
/* Soustraction des deux nombres 'a' et 'b'. */ \
/* */ \
/* Le 20061030121314 je note, qu'etant donne la notion d'arithmetique etendue, il est */ \
/* possible qu'il soit preferable de definir la soustraction a partir de l'addition */ \
/* suivant : */ \
/* */ \
/* a - b = a + (-b) */ \
/* */ \
/* de facon a ce qu'en modifiant les ponderations 'ponderation_de_*_dans_FfxADD2' (qui */ \
/* modifient le comportement de la fonction 'FfxADD2(...)') on modifie simultanement le */ \
/* comportement de la fonction 'FfxSOUS(....)'... */ \
/* */ \
/* Cela fut fait le 20061030152833 : 'v $xig/fonct$vv$FON FfxxSOUS'... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* O P E R A T I O N S A R I T H M E T I Q U E S D E M U L T I P L I C A T I O N : */
/* */
/*************************************************************************************************************************************/
#define bMUL(a,b) \
PARE(PARE(a) * PARE(b)) \
/* Multiplication des deux nombres 'a' et 'b'. */
#define bDOU(a) \
bMUL(DEUX,a) \
/* Double d'un nombre 'a' (introduit le 20100319085921 pour 'v $xil/defi_K2$vv$DEF NBITOC'). */
/* ATTENTION : depuis qu'a ete introduite la '$PASSE_D', il est imperatif que certaines */
/* definitions soient faites avant d'autres ; en particulier 'bMUL(...)' doit etre definie */
/* avant tout '-define ...' qui l'utilise... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* O P E R A T I O N S A R I T H M E T I Q U E S D E D I V I S I O N : */
/* */
/*************************************************************************************************************************************/
#define bDIV(a,b) \
PARE(PARE(a) / PARE(b)) \
/* Division des deux nombres 'a' et 'b'. */ \
/* */ \
/* Le 20061030121314 je note, qu'etant donne la notion d'arithmetique etendue, il est */ \
/* possible qu'il soit preferable de definir la division a partir de la multiplication */ \
/* suivant : */ \
/* */ \
/* a / b = a * (1/b) */ \
/* */ \
/* de facon a ce qu'en modifiant les ponderations 'ponderation_de_*_dans_FfxMUL2' (qui */ \
/* modifient le comportement de la fonction 'FfxMUL2(...)') on modifie simultanement le */ \
/* comportement de la fonction 'FfxDIVZ(....)'... */ \
/* */ \
/* Cela fut fait le 20061030152833 : 'v $xig/fonct$vv$FON FfxxDIVZ'... */
#define bMOI(a) \
bDIV(a,DEUX) \
/* Moitie d'un nombre 'a' (introduit le 20100319085921 pour 'v $xil/defi_K2$vv$DEF NOCHW'). */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H O I X E N T R E S A N S E T A V E C */
/* G A R A N T I E C O N C E R N A N T L ' O R D R E D E S Q U A T R E O P E R A T I O N S */
/* D E B A S E A V E C T Y P A G E ' Float ' S I M U L T A N E : */
/* */
/*************************************************************************************************************************************/
#ifdef PRAGMA_CPP_____AUTORISER_LE_GooF
# ifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
/* Cas de l'arithmetique etendue des nombres flottants : */
/* */
/* cette possibilite a ete introduite le 20050305211855... */
/* */
/* On notera le 20061018120223 que cette option a vu apparaitre une certaine forme de */
/* "concurrence" avec 'v $xig/fonct$vv$FON 20061018104520' ; cette nouvelle possibilite */
/* possede un avantage sur cette option : celle de l'aspect dynamique, puisque cette */
/* nouvelle possibilite peut etre activee/desactivee a l'execution... */
# include DEFINIT_cC_DEF
/* Definition des quatre fonctions arithmetiques de base {sfADD2,sfSOUS,sfMUL2,sfDIVI} */
/* lorsque l'extension de cette derniere est demandee... */
# define GENERER_LES_GET_ARGUMENTS_DE_CONTROLE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS \
/* A priori... */
# Aifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
/* Cas de l'arithmetique traditionnelle des nombres flottants : */
# include DEFINIT_cD_DEF
/* Definition des quatre fonctions arithmetiques de base {sfADD2,sfSOUS,sfMUL2,sfDIVI} */
/* lorsque l'extension de cette derniere n'est pas demandee. */
/* */
/* Ces quatre fonctions ont ete deplacees depuis 'v $xig/fonct$vv$DEF' le 20040423150108 */
/* afin que tout fonctionne correctement avec les operateurs derivables... */
# Eifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
@ define PRAGMA_CPP_____LE_GooF_EST_ACTIVABLE
/* Introduit le 20040425104638 pour 'v $xcc/cpp$Z 20040425104801'... */
# include DEFINIT_cA_DEF
/* Cas ou le 'GooF' est autorise ; il suffit de l'activer la ou il est necessaire... */
#Aifdef PRAGMA_CPP_____AUTORISER_LE_GooF
# ifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
# message "ATTENTION : l'extension de l'arithmetique est demandee alors que l'option 'GooF' n'est pas activable."
# Aifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
# Eifdef PRAGMA_CPP_____SI_LE_GooF_EST_ACTIVABLE_ALORS_FAIRE_DE_L_ARITHMETIQUE_ETENDUE_DES_NOMBRES_FLOTTANTS
# include DEFINIT_cB_DEF
/* Cas ou le 'GooF' est inhibe. */
#Eifdef PRAGMA_CPP_____AUTORISER_LE_GooF
/* ATTENTION : on notera le passage par des fichiers d'include alors qu'il pourrait */
/* sembler etre plus simple de rendre conditionnelles les quatre definitions des operateurs */
/* de base {ADD2(...),SOUS(...),MUL2(...),DIVI(...)}. En fait, cela est impossible a cause */
/* de la derivation formelle (lorsque cela est demandee...). En effet, les operateurs qui */
/* sont derivables ne peuvent pas (est-ce bien sur ?) etre conditionnels... */
/* */
/* Le 20040420174339, 'PRAGMA_CPP_____PAS_DE_GooF' fut change en */
/* 'PRAGMA_CPP_____AUTORISER_LE_GooF' et donc inverse les conventions. En effet, il est */
/* evident que ce dispositif sera assez peu utilise ; or il est assez penalisant au niveau */
/* de '$xcc/cpp$Z' et pour certains '$K' (tels 'v $xbmcf/$xbmcf/conformes$K', */
/* 'v $xrk/rdn_walk.52$K',...) il est meme impossible (par manque de ressources...). Il vaut */
/* mieux donc pouvoir l'autoriser si besoin est et l'inhiber par defaut... */