_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S T R I G O N O M E T R I Q U E S C I R C U L A I R E S : */ /* */ /* */ /* Definition : */ /* */ /* Dans ce fichier se trouvent toutes */ /* les fonctions de base de la trigo- */ /* nometrie circulaire en simple */ /* precision. */ /* */ /* */ /* Nota : */ /* */ /* Malgre tout, le resultat est */ /* renvoye en double-precision, */ /* mais on a applique la fonction */ /* 'PETI' qui evitera les underflows... */ /* */ /* */ /* Author of '$ximf/trigoc$FON' : */ /* */ /* Jean-Francois Colonna (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O S I N U S : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,Fcosinus(angle_en_radians))) DEFV(Argument,DEFV(Double,angle_en_radians)); /* Angle argument exprime en radians. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Double,INIT(cosinus,COSD(angle_en_radians))); /* Pour memoriser la valeur du cosinus en double-precision. */ /*..............................................................................................................................*/ RETU(PETI(cosinus)); Eblock EFonctionF _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S I N U S : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,Fsinus(angle_en_radians))) DEFV(Argument,DEFV(Double,angle_en_radians)); /* Angle argument exprime en radians. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Double,INIT(sinus,SIND(angle_en_radians))); /* Pour memoriser la valeur du sinus en double-precision. */ /*..............................................................................................................................*/ RETU(PETI(sinus)); Eblock EFonctionF _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A R C - T A N G E N T E : */ /* */ /*************************************************************************************************************************************/ BFonctionF DEFV(Common,DEFV(FonctionF,Farc_tangente(y,x))) /* Cela fut introduit le 20161202134801 pour 'v $xrs/huit.11$I ATAN' afin de simplificatier */ /* la definition de 'ATAN(...)' et donc accelerer la compilation... */ DEFV(Argument,DEFV(Float,y)); DEFV(Argument,DEFV(Float,x)); /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock /*..............................................................................................................................*/ RETU(gATAN(y,x)); Eblock EFonctionF _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O S I N U S A C C E L E R E : */ /* */ /*************************************************************************************************************************************/ #define GENERATION_DE_L_ACCELERATEUR__COSINUS_ACCELERE \ GENERATION_DE_L_ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \ (S_ACCELERATEUR__COSINUS_ACCELERE \ /* On notera que l'on utilise le nom 'S_ACCELERATEUR__COSINUS_ACCELERE' pour */ \ /* les donnees de l'accelerateur et non pas 'ACCELERATEUR__COSINUS_ACCELERE' */ \ /* car, en effet, ce dernier nom est aussi celui de la procedure d'acceleration et donc */ \ /* si ce nom etait utilise, il y aurait substitution par la definition de l'accelerateur */ \ /* a suivre... */ \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ,DEFV(Local,DEFV(Float,DdTb1(POINTERf \ ,S_ACCELERATEUR__COSINUS_ACCELERE_____Argument \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ) \ ); \ /* Donne les trois arguments de l'entree courante (si elle est valide...). */ \ ) \ /* Donnees de l'accelerateur a trois arguments... */ #define ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ MILLE #define ACCELERATEUR__COSINUS_ACCELERE__PREMIERE_ENTREE \ ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PREMIERE_ENTREE #define ACCELERATEUR__COSINUS_ACCELERE__DERNIERE_ENTREE \ LSTX(ACCELERATEUR__COSINUS_ACCELERE__PREMIERE_ENTREE \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ) /* Parametres fondamentaux. */ #define ACCELERATEUR__COSINUS_ACCELERE(valeur_fonction,calcul_fonction,Argument,fonction,objet) \ Bblock \ ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \ (S_ACCELERATEUR__COSINUS_ACCELERE \ ,S_ACCELERATEUR__COSINUS_ACCELERE_____utiliser_l_accelerateur \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ,ACCELERATEUR__COSINUS_ACCELERE__PREMIERE_ENTREE \ ,ACCELERATEUR__COSINUS_ACCELERE__DERNIERE_ENTREE \ ,BLOC( \ Bblock \ MdTb1(S_ACCELERATEUR__COSINUS_ACCELERE_____Argument \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ,Float,ADRESSE_NON_ENCORE_DEFINIE \ ); \ /* Allocation de la memoire des listes d'Arguments. */ \ Eblock \ ) \ ,BLOC( \ Bblock \ EGAL(IdTb1(S_ACCELERATEUR__COSINUS_ACCELERE_____Argument \ ,INDX(index_d_initialisation,ACCELERATEUR__COSINUS_ACCELERE__PREMIERE_ENTREE) \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ) \ ,FLOT__UNDEF \ ); \ /* Initialisation des listes d'Arguments. */ \ Eblock \ ) \ ,NEUT(Argument) \ /* Calcul d'une fonction de l'Argument. */ \ ,IFEQ(IdTb1(S_ACCELERATEUR__COSINUS_ACCELERE_____Argument \ ,index_d_acceleration \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ) \ ,Argument \ ) \ /* Est-ce la liste {Argument} memorisee ? */ \ ,BLOC( \ Bblock \ EGAL(IdTb1(S_ACCELERATEUR__COSINUS_ACCELERE_____Argument \ ,index_d_acceleration \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ) \ ,Argument \ ); \ Eblock \ ) \ ,BLOC( \ Bblock \ FdTb1(S_ACCELERATEUR__COSINUS_ACCELERE_____Argument \ ,ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES \ ,Float,ADRESSE_NON_ENCORE_DEFINIE \ ); \ /* Desallocation de la memoire des listes d'Arguments. */ \ /* */ \ /* On notera qu'a priori on n'utilisera jamais cette sequence puisqu'en effet, on ne sait */ \ /* jamais que c'est la derniere fois. C'est introduit malgre tout par "symetrie"... */ \ Eblock \ ) \ ,valeur_fonction \ ,BLOC(calcul_fonction) \ ,fonction \ ,objet \ ) \ Eblock DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__COSINUS_ACCELERE_____utiliser_l_accelerateur,VRAI))); /* Indique si l'accelerateur doit etre utilise ou pas. */ DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__COSINUS_ACCELERE_____fermer_l_accelerateur,FAUX))); /* Indique si l'accelerateur doit etre ferme. */ GENERATION_DE_L_ACCELERATEUR__COSINUS_ACCELERE; /* Generation des donnees utiles a l'accelerateur. */ #define COSINUS_ACCELERE(angle_en_radians) \ Bblock \ ACCELERATEUR__COSINUS_ACCELERE(cosinus \ ,BLOC( \ EGAL(cosinus,COSD(angle_en_radians)); \ ) \ ,angle_en_radians \ ,NomDeLaFonctionCourante QD@@__ \ ,ADRESSE_UNDEF \ ); \ Eblock \ /* Procedure referencant l'accelerateur utilisant du "hash-coding"... */ BFonctionF DEFV(Common,DEFV(FonctionF,Fcosinus_accelere(angle_en_radians))) /* Fonction introduite le 20120319120317... */ DEFV(Argument,DEFV(Double,angle_en_radians)); /* Angle argument exprime en radians. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Double,INIT(cosinus,FLOT__UNDEF)); /* Pour memoriser la valeur du cosinus en double-precision. */ /*..............................................................................................................................*/ COSINUS_ACCELERE(angle_en_radians); RETU(cosinus); Eblock EFonctionF #undef COSINUS_ACCELERE #undef ACCELERATEUR__COSINUS_ACCELERE #undef ACCELERATEUR__COSINUS_ACCELERE__DERNIERE_ENTREE #undef ACCELERATEUR__COSINUS_ACCELERE__PREMIERE_ENTREE #undef ACCELERATEUR__COSINUS_ACCELERE__NOMBRE_D_ENTREES #undef GENERATION_DE_L_ACCELERATEUR__COSINUS_ACCELERE _______________________________________________________________________________________________________________________________________ _______________________________________________________________________________________________________________________________________ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S I N U S A C C E L E R E : */ /* */ /*************************************************************************************************************************************/ #define GENERATION_DE_L_ACCELERATEUR__SINUS_ACCELERE \ GENERATION_DE_L_ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \ (S_ACCELERATEUR__SINUS_ACCELERE \ /* On notera que l'on utilise le nom 'S_ACCELERATEUR__SINUS_ACCELERE' pour */ \ /* les donnees de l'accelerateur et non pas 'ACCELERATEUR__SINUS_ACCELERE' */ \ /* car, en effet, ce dernier nom est aussi celui de la procedure d'acceleration et donc */ \ /* si ce nom etait utilise, il y aurait substitution par la definition de l'accelerateur */ \ /* a suivre... */ \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ,DEFV(Local,DEFV(Float,DdTb1(POINTERf \ ,S_ACCELERATEUR__SINUS_ACCELERE_____Argument \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ,ADRESSE_NON_ENCORE_DEFINIE \ ) \ ) \ ); \ /* Donne les trois arguments de l'entree courante (si elle est valide...). */ \ ) \ /* Donnees de l'accelerateur a trois arguments... */ #define ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ MILLE #define ACCELERATEUR__SINUS_ACCELERE__PREMIERE_ENTREE \ ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS__PREMIERE_ENTREE #define ACCELERATEUR__SINUS_ACCELERE__DERNIERE_ENTREE \ LSTX(ACCELERATEUR__SINUS_ACCELERE__PREMIERE_ENTREE \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ) /* Parametres fondamentaux. */ #define ACCELERATEUR__SINUS_ACCELERE(valeur_fonction,calcul_fonction,Argument,fonction,objet) \ Bblock \ ACCELERATEUR_DE_FONCTIONS_A_N_ARGUMENTS \ (S_ACCELERATEUR__SINUS_ACCELERE \ ,S_ACCELERATEUR__SINUS_ACCELERE_____utiliser_l_accelerateur \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ,ACCELERATEUR__SINUS_ACCELERE__PREMIERE_ENTREE \ ,ACCELERATEUR__SINUS_ACCELERE__DERNIERE_ENTREE \ ,BLOC( \ Bblock \ MdTb1(S_ACCELERATEUR__SINUS_ACCELERE_____Argument \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ,Float,ADRESSE_NON_ENCORE_DEFINIE \ ); \ /* Allocation de la memoire des listes d'Arguments. */ \ Eblock \ ) \ ,BLOC( \ Bblock \ EGAL(IdTb1(S_ACCELERATEUR__SINUS_ACCELERE_____Argument \ ,INDX(index_d_initialisation,ACCELERATEUR__SINUS_ACCELERE__PREMIERE_ENTREE) \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ) \ ,FLOT__UNDEF \ ); \ /* Initialisation des listes d'Arguments. */ \ Eblock \ ) \ ,NEUT(Argument) \ /* Calcul d'une fonction de l'Argument. */ \ ,IFEQ(IdTb1(S_ACCELERATEUR__SINUS_ACCELERE_____Argument \ ,index_d_acceleration \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ) \ ,Argument \ ) \ /* Est-ce la liste {Argument} memorisee ? */ \ ,BLOC( \ Bblock \ EGAL(IdTb1(S_ACCELERATEUR__SINUS_ACCELERE_____Argument \ ,index_d_acceleration \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ) \ ,Argument \ ); \ Eblock \ ) \ ,BLOC( \ Bblock \ FdTb1(S_ACCELERATEUR__SINUS_ACCELERE_____Argument \ ,ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES \ ,Float,ADRESSE_NON_ENCORE_DEFINIE \ ); \ /* Desallocation de la memoire des listes d'Arguments. */ \ /* */ \ /* On notera qu'a priori on n'utilisera jamais cette sequence puisqu'en effet, on ne sait */ \ /* jamais que c'est la derniere fois. C'est introduit malgre tout par "symetrie"... */ \ Eblock \ ) \ ,valeur_fonction \ ,BLOC(calcul_fonction) \ ,fonction \ ,objet \ ) \ Eblock DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__SINUS_ACCELERE_____utiliser_l_accelerateur,VRAI))); /* Indique si l'accelerateur doit etre utilise ou pas. */ DEFV(Common,DEFV(Logical,PINT(S_ACCELERATEUR__SINUS_ACCELERE_____fermer_l_accelerateur,FAUX))); /* Indique si l'accelerateur doit etre ferme. */ GENERATION_DE_L_ACCELERATEUR__SINUS_ACCELERE; /* Generation des donnees utiles a l'accelerateur. */ #define SINUS_ACCELERE(angle_en_radians) \ Bblock \ ACCELERATEUR__SINUS_ACCELERE(sinus \ ,BLOC( \ EGAL(sinus,SIND(angle_en_radians)); \ ) \ ,angle_en_radians \ ,NomDeLaFonctionCourante QD@@__ \ ,ADRESSE_UNDEF \ ); \ Eblock \ /* Procedure referencant l'accelerateur utilisant du "hash-coding"... */ BFonctionF DEFV(Common,DEFV(FonctionF,Fsinus_accelere(angle_en_radians))) /* Fonction introduite le 20120319113349... */ DEFV(Argument,DEFV(Double,angle_en_radians)); /* Angle argument exprime en radians. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(Double,INIT(sinus,FLOT__UNDEF)); /* Pour memoriser la valeur du sinus en double-precision. */ /*..............................................................................................................................*/ SINUS_ACCELERE(angle_en_radians); RETU(sinus); Eblock EFonctionF #undef SINUS_ACCELERE #undef ACCELERATEUR__SINUS_ACCELERE #undef ACCELERATEUR__SINUS_ACCELERE__DERNIERE_ENTREE #undef ACCELERATEUR__SINUS_ACCELERE__PREMIERE_ENTREE #undef ACCELERATEUR__SINUS_ACCELERE__NOMBRE_D_ENTREES #undef GENERATION_DE_L_ACCELERATEUR__SINUS_ACCELERE _______________________________________________________________________________________________________________________________________