| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- (* ******************************************
- Дополнительные функции к модулю Math.
- Функции округления.
- Вадим Исаев, 2020
- -------------------------------------
- Additional functions to the module Math.
- Rounding functions.
- Vadim Isaev, 2020
- ********************************************* *)
- MODULE MathRound;
- IMPORT Math;
- (* Возвращается целая часть числа x.
- Returns the integer part of a argument x.*)
- PROCEDURE trunc* (x: REAL): REAL;
- VAR
- a: REAL;
- BEGIN
- a := FLT(FLOOR(x));
- IF (x < 0.0) & (x # a) THEN
- a := a + 1.0
- END
- RETURN a
- END trunc;
- (* Возвращается дробная часть числа x.
- Returns the fractional part of the argument x *)
- PROCEDURE frac* (x: REAL): REAL;
- RETURN x - trunc(x)
- END frac;
- (* Округление к ближайшему целому.
- Rounding to the nearest integer. *)
- PROCEDURE round* (x: REAL): REAL;
- VAR
- a: REAL;
- BEGIN
- a := trunc(x);
- IF ABS(frac(x)) >= 0.5 THEN
- a := a + FLT(Math.sgn(x))
- END
- RETURN a
- END round;
- (* Округление к бОльшему целому.
- Rounding to a largest integer *)
- PROCEDURE ceil* (x: REAL): REAL;
- VAR
- a: REAL;
- BEGIN
- a := FLT(FLOOR(x));
- IF x # a THEN
- a := a + 1.0
- END
- RETURN a
- END ceil;
- (* Округление к меньшему целому.
- Rounding to a smallest integer *)
- PROCEDURE floor* (x: REAL): REAL;
- RETURN FLT(FLOOR(x))
- END floor;
- (* Округление до определённого количества знаков:
- - если Digits отрицательное, то округление
- в знаках после десятичной запятой;
- - если Digits положительное, то округление
- в знаках до запятой *)
- PROCEDURE SimpleRoundTo* (AValue: REAL; Digits: INTEGER): REAL;
- VAR
- RV, a : REAL;
- BEGIN
- RV := Math.ipower(10.0, -Digits);
- IF AValue < 0.0 THEN
- a := trunc((AValue * RV) - 0.5)
- ELSE
- a := trunc((AValue * RV) + 0.5)
- END
- RETURN a / RV
- END SimpleRoundTo;
- END MathRound.
|