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