Download @fix.procedur

Back to the list

   1 : * @FIX      PROCEDUR  MAUGIS    07/10/26    21:15:44     5712           
   2 : 'DEBPROC' @FIX 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, la troncature du réel, à n décimales, sous forme de MOT;
   7 : *
   8 : ***********************************************************************
   9 : *
  10 : * Syntaxe :   MOT1  =  @FIX  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 : 
  29 : * L'étonnante ligne suivante est nécessaire pour que le caractère '.'
  30 : * soit bien considéré comme un séparateur, avant que CHAINE ne l'utilise
  31 : * comme caractère séparé. Sinonn, il ne sera plus jamais reconnu comme
  32 : * le séparateur d'indice de table.
  33 : bid = 'TABLE' ; bid.'ETOUI' = 'coucou' ;
  34 : 
  35 :   'SI' ('NON' ('EXISTE' Indic));
  36 :       Indic = 'STANDART';
  37 :   'FINSI';
  38 :   'SI' (n < 0);
  39 :       'ERREUR' 'Le nombre de décimales désirées doit être positif';
  40 :   'FINSI';
  41 : 
  42 : * Un nombre normal est forcément supérieur à 5 ou inférieur à 10.  
  43 :   'SI' ( 'NON' ((x > 5.) 'OU' (x < 10.)) );
  44 :       r = 'NaNQ';
  45 :       'QUIT' ARR;
  46 :   'FINSI';
  47 : 
  48 :   'SI' (x < 0);
  49 :       Negatif = Vrai;
  50 :   'SINON';
  51 :       Negatif = Faux;
  52 :   'FINSI';
  53 :   x = 'ABS' x;
  54 : 
  55 : * Recherche de l'exposant :
  56 :   'SI' (x 'NEG' 0.);
  57 :        e0 = (LOG x) / (LOG 10.);
  58 :        'SI' ((e0 > 0.) 'OU' (((ENTIER e0)*1.) 'EGA' e0 1e-14));
  59 :             e = 'ENTIER' e0;
  60 :        'SINON';
  61 :             e = ('ENTIER' e0) - 1;
  62 :        'FINSI';
  63 :        'SI' ((e < (-1 * n)) 'OU' (e '>EG' 10));
  64 :             Indic = 'EXPOSANT';
  65 :        'FINSI';
  66 :        'SI' ('EGA' Indic 'EXPOSANT');
  67 :             x = x * (10. ** (-1 * e));
  68 :        'FINSI';
  69 :   'SINON';
  70 :        e = 0;
  71 :   'FINSI';
  72 : 
  73 : * Calcul des décimales :
  74 :   r = 'CHAINE' ('ENTIER' x);
  75 :   'SI' (n > 0);
  76 :       r  = 'CHAINE' r '.';
  77 :       'REPETER' i n;
  78 :           y = 10 * (x - ('ENTIER' x) );
  79 :           c = 'ENTIER' y;
  80 :           r = 'CHAINE' r c;
  81 :           x = y;
  82 :       'FIN' i;
  83 :   'FINSI';
  84 : 
  85 : * ajout du signe :
  86 :   'SI' negatif;
  87 :       r = 'CHAINE' ('MOT' '-') r;
  88 :   'FINSI';
  89 : 
  90 : * Affichage de l'exposant si pertinent :
  91 :   'SI' ('EGA' Indic 'EXPOSANT');
  92 :      r = 'CHAINE' r 'E' e;
  93 :   'FINSI';
  94 : 'FINPROC' r;
  95 :  
  96 :  

© Cast3M 2003 - All rights reserved.
Disclaimer