Télécharger @arr.procedur

Retour à la liste

Numérotation des lignes :

  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.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales