Download @arr.procedur

Back to the list

   1 : * @ARR      PROCEDUR  MAUGIS    07/10/26    21:15:13     5712           
   2 : 'DEBPROC' @ARR x*'FLOTTANT' n*'ENTIER' Indic/'MOT' ;
   3 : ***********************************************************************
   4 : *
   5 : * Petite procédure renvoyant, à partir d'un réel x et d'un nombre de
   6 : * décimales n, l'arrondi du réel, à n décimales, sous forme de MOT;
   7 : *
   8 : ***********************************************************************
   9 : *
  10 : * Syntaxe :   MOT1  =  @ARR  FLOT1  ENT1  ('EXPOSANT') ;
  11 : *
  12 : ***********************************************************************
  13 : *
  14 : * On peut demander la forme x = a E b ; mettre alors le mot 'EXPOSANT'.
  15 : *
  16 : * On passe automatiquement en notation EXPOSANT si l'affichage ne
  17 : * contiendrait autrement que des 0 .
  18 : *
  19 : * Passage à l'exposant si x dépasse 1.D10.
  20 : *
  21 : ***********************************************************************
  22 : *
  23 : * N.B. : ENTIER renvoie la troncature et non pas la partie entière.
  24 : * N.B. : ne marche pas avec de grands nombres.
  25 : * N.B. : résultat lié à la précision machine
  26 : *
  27 : ***********************************************************************
  28 :   'SI' ('NON' ('EXISTE' Indic));
  29 :       Indic = 'STANDART';
  30 :   'FINSI';
  31 :   'SI' (n < 0);
  32 :       'ERREUR' 'Le nombre de décimales désirées doit être positif';
  33 :   'FINSI';
  34 : 
  35 : * Un nombre normal est forcément supérieur à 5 ou inférieur à 10.  
  36 :   'SI' ( 'NON' ((x > 5.) 'OU' (x < 10.)) );
  37 :       r = 'NaNQ';
  38 :       'QUIT' ARR;
  39 :   'FINSI';
  40 : 
  41 :   'SI' (x < 0);
  42 :       Negatif = Vrai;
  43 :   'SINON';
  44 :       Negatif = Faux;
  45 :   'FINSI';
  46 :   x = 'ABS' x;
  47 : 
  48 : * Recherche de l'exposant :
  49 :   'SI' (x 'NEG' 0.);
  50 :        e0 = (LOG x) / (LOG 10.);
  51 :        'SI' ((e0 > 0.) 'OU' (((ENTIER e0)*1.) 'EGA' e0 1e-14));
  52 :             e = 'ENTIER' e0;
  53 :        'SINON';
  54 :             e = ('ENTIER' e0) - 1;
  55 :        'FINSI';
  56 :        'SI' ((e < (-1 * n)) 'OU' (e '>EG' 10));
  57 :             Indic = 'EXPOSANT';
  58 :        'FINSI';
  59 :        'SI' ('EGA' Indic 'EXPOSANT');
  60 :             x = x * (10. ** (-1 * e));
  61 :        'FINSI';
  62 :   'SINON';
  63 :        e = 0;
  64 :   'FINSI';
  65 : 
  66 : * Calcul des décimales :
  67 :   p   = 'TABLE';
  68 :   p.0 = ENTIER x;
  69 :   z   = x;
  70 :   'REPETER' i (n + 1);
  71 :        y     = 10 * (z - ('ENTIER' z) );
  72 :        p. &i = 'ENTIER' y;
  73 :        z     = y;
  74 :   'FIN' i;
  75 : 
  76 : * Execution de l'arrondi :
  77 :   c   = 0;
  78 :   id = n + 1;
  79 :   'SI' (p.id > 5);
  80 :        c = 1;
  81 :   'FINSI';
  82 :   'REPETER' i (n + 1);
  83 :        id   = n + 1 - &i;
  84 :        p.id = p.id + c;
  85 :        'SI' (('EGA' p.id 10) 'ET' ('NEG' Id 0));
  86 :             p.id = 0;
  87 :             c = 1;
  88 :        'SINON';
  89 :             c = 0;
  90 :        'FINSI';
  91 :        'SI' (('EGA' id 0) 'ET' (n > 0));
  92 :             r = 'CHAINE' '.' r;
  93 :        'FINSI';
  94 :        'SI' (&i 'EGA' 1);
  95 :             r = 'CHAINE' (p.id);
  96 :        'SINON';
  97 :             r = 'CHAINE' (p.id) r;
  98 :        'FINSI';
  99 :   'FIN' i;
 100 :  
 101 : * ajout du signe :
 102 :   'SI' negatif;
 103 :       r = 'CHAINE' ('MOT' '-') r;
 104 :   'FINSI';
 105 : 
 106 : * Affichage de l'exposant si pertinent :
 107 :   'SI' ('EGA' Indic 'EXPOSANT');
 108 :      r = 'CHAINE' r 'E' e;
 109 :   'FINSI';
 110 : 'FINPROC' r;
 111 :  
 112 :  

© Cast3M 2003 - All rights reserved.
Disclaimer