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