Quando si opera con numeri float si utilizza sempre nei calcoli la massima risoluzione possibile, ecco perchè nel set di funzioni disponibili non esiste una funzione per l’arrotondamento dei numeri. Il valore viene troncato solo in visualizzazione per migliorarne la leggibilità, le funzioni SysVfprintf e SysVsnprintf permettono di definire quante cifre visualizzare (Segnaposti del formato printf).
In LogicLab esistono le funzioni CEIL e FLOOR per arrotondare un numero float ad numero intero più vicino.
- La funzione CEIL (Dalla parola inglese ceiling che significa “soffitto”) ritorna il numero intero maggiore o uguale al numero reale. Viene utilizzata per arrotondare un numero fino al numero intero precedente.
- La funzione FLOOR (Dalla parola inglese floor che significa “pavimento”) ritorna il numero intero minore o uguale al numero reale. Viene utilizzata per arrotondare un numero fino al numero intero successivo.
Esempi
RVar:=CEIL(1.95); //RVar=2.0 RVar:=CEIL(-1.27); //RVar-1.0 RVar:=FLOOR(1.95); //RVar=1.0 RVar:=FLOOR(-1.27); //RVar-2.0
Funzione eRound
Quindi se l’arrotondamento dei numeri float serve solo in visualizzazione non viene fornita nessuna funzione adatta allo scopo. In generale però alcuni linguaggi rendono disponibile la funzione ROUND che permette l’arrotondamento. Vediamo come è possibile con LogicLab scrivere la nostra funzione eRound.
FUNCTION eRound: REAL
VAR
Divisor : REAL; (* Divisor number *)
END_VAR
VAR_INPUT
Number : REAL; (* Number to round *)
Digits : USINT; (* Number of digits *)
END_VAR
// *****************************************************************************
// FUNCTION "REAL eRound(REAL Number, USINT Digits)"
// *****************************************************************************
// Rounds a number to a specified number of digits.
// -----------------------------------------------------------------------------
Divisor:=POW(10.0, TO_REAL(Digits));
eRound:=TO_REAL(TO_LINT(Number*Divisor))/Divisor;
// [End of file]
Esempi di utilizzo
Di seguito alcuni esempi di utilizzo della funzione.
PROGRAM ST_eRound
VAR
RVar : ARRAY[0..5] OF REAL; (* Rounded variable *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_eRound"
// *****************************************************************************
// Some eRound examples.
// -----------------------------------------------------------------------------
RVar[0]:=eRound(12.1234, 0); //RVar=12.0
RVar[1]:=eRound(12.1234, 1); //RVar=12.1
RVar[2]:=eRound(12.1234, 2); //RVar=12.12
RVar[3]:=eRound(-12.1234, 0); //RVar=-12.0
RVar[4]:=eRound(-12.1234, 1); //RVar=-12.1
RVar[5]:=eRound(-12.1234, 2); //RVar=-12.12
// [End of file]