MathRound.ob07 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. (* ******************************************
  2. Дополнительные функции к модулю Math.
  3. Функции округления.
  4. Вадим Исаев, 2020
  5. -------------------------------------
  6. Additional functions to the module Math.
  7. Rounding functions.
  8. Vadim Isaev, 2020
  9. ********************************************* *)
  10. MODULE MathRound;
  11. IMPORT Math;
  12. (* Возвращается целая часть числа x.
  13. Returns the integer part of a argument x.*)
  14. PROCEDURE trunc* (x: REAL): REAL;
  15. VAR
  16. a: REAL;
  17. BEGIN
  18. a := FLT(FLOOR(x));
  19. IF (x < 0.0) & (x # a) THEN
  20. a := a + 1.0
  21. END
  22. RETURN a
  23. END trunc;
  24. (* Возвращается дробная часть числа x.
  25. Returns the fractional part of the argument x *)
  26. PROCEDURE frac* (x: REAL): REAL;
  27. RETURN x - trunc(x)
  28. END frac;
  29. (* Округление к ближайшему целому.
  30. Rounding to the nearest integer. *)
  31. PROCEDURE round* (x: REAL): REAL;
  32. VAR
  33. a: REAL;
  34. BEGIN
  35. a := trunc(x);
  36. IF ABS(frac(x)) >= 0.5 THEN
  37. a := a + FLT(Math.sgn(x))
  38. END
  39. RETURN a
  40. END round;
  41. (* Округление к бОльшему целому.
  42. Rounding to a largest integer *)
  43. PROCEDURE ceil* (x: REAL): REAL;
  44. VAR
  45. a: REAL;
  46. BEGIN
  47. a := FLT(FLOOR(x));
  48. IF x # a THEN
  49. a := a + 1.0
  50. END
  51. RETURN a
  52. END ceil;
  53. (* Округление к меньшему целому.
  54. Rounding to a smallest integer *)
  55. PROCEDURE floor* (x: REAL): REAL;
  56. RETURN FLT(FLOOR(x))
  57. END floor;
  58. (* Округление до определённого количества знаков:
  59. - если Digits отрицательное, то округление
  60. в знаках после десятичной запятой;
  61. - если Digits положительное, то округление
  62. в знаках до запятой *)
  63. PROCEDURE SimpleRoundTo* (AValue: REAL; Digits: INTEGER): REAL;
  64. VAR
  65. RV, a : REAL;
  66. BEGIN
  67. RV := Math.ipower(10.0, -Digits);
  68. IF AValue < 0.0 THEN
  69. a := trunc((AValue * RV) - 0.5)
  70. ELSE
  71. a := trunc((AValue * RV) + 0.5)
  72. END
  73. RETURN a / RV
  74. END SimpleRoundTo;
  75. END MathRound.