$$$$ @ARR * @ARR PROCEDUR MAUGIS 07/10/26 21:15:13 5712 'DEBPROC' @ARR x*'FLOTTANT' n*'ENTIER' Indic/'MOT' ; *********************************************************************** * * Petite procédure renvoyant, à partir d'un réel x et d'un nombre de * décimales n, l'arrondi du réel, à n décimales, sous forme de MOT; * *********************************************************************** * * Syntaxe : MOT1 = @ARR FLOT1 ENT1 ('EXPOSANT') ; * *********************************************************************** * * On peut demander la forme x = a E b ; mettre alors le mot 'EXPOSANT'. * * On passe automatiquement en notation EXPOSANT si l'affichage ne * contiendrait autrement que des 0 . * * Passage à l'exposant si x dépasse 1.D10. * *********************************************************************** * * N.B. : ENTIER renvoie la troncature et non pas la partie entière. * N.B. : ne marche pas avec de grands nombres. * N.B. : résultat lié à la précision machine * *********************************************************************** 'SI' ('NON' ('EXISTE' Indic)); Indic = 'STANDART'; 'FINSI'; 'SI' (n < 0); 'ERREUR' 'Le nombre de décimales désirées doit être positif'; 'FINSI'; * Un nombre normal est forcément supérieur à 5 ou inférieur à 10. 'SI' ( 'NON' ((x > 5.) 'OU' (x < 10.)) ); r = 'NaNQ'; 'QUIT' ARR; 'FINSI'; 'SI' (x < 0); Negatif = Vrai; 'SINON'; Negatif = Faux; 'FINSI'; x = 'ABS' x; * Recherche de l'exposant : 'SI' (x 'NEG' 0.); e0 = (LOG x) / (LOG 10.); 'SI' ((e0 > 0.) 'OU' (((ENTIER e0)*1.) 'EGA' e0 1e-14)); e = 'ENTIER' e0; 'SINON'; e = ('ENTIER' e0) - 1; 'FINSI'; 'SI' ((e < (-1 * n)) 'OU' (e '>EG' 10)); Indic = 'EXPOSANT'; 'FINSI'; 'SI' ('EGA' Indic 'EXPOSANT'); x = x * (10. ** (-1 * e)); 'FINSI'; 'SINON'; e = 0; 'FINSI'; * Calcul des décimales : p = 'TABLE'; p.0 = ENTIER x; z = x; 'REPETER' i (n + 1); y = 10 * (z - ('ENTIER' z) ); p. &i = 'ENTIER' y; z = y; 'FIN' i; * Execution de l'arrondi : c = 0; id = n + 1; 'SI' (p.id > 5); c = 1; 'FINSI'; 'REPETER' i (n + 1); id = n + 1 - &i; p.id = p.id + c; 'SI' (('EGA' p.id 10) 'ET' ('NEG' Id 0)); p.id = 0; c = 1; 'SINON'; c = 0; 'FINSI'; 'SI' (('EGA' id 0) 'ET' (n > 0)); r = 'CHAINE' '.' r; 'FINSI'; 'SI' (&i 'EGA' 1); r = 'CHAINE' (p.id); 'SINON'; r = 'CHAINE' (p.id) r; 'FINSI'; 'FIN' i; * ajout du signe : 'SI' negatif; r = 'CHAINE' ('MOT' '-') r; 'FINSI'; * Affichage de l'exposant si pertinent : 'SI' ('EGA' Indic 'EXPOSANT'); r = 'CHAINE' r 'E' e; 'FINSI'; 'FINPROC' r;