SA0054: Confronto REALE/LREALE per uguaglianza/disuguaglianzaPermalink

Rileva se gli operatori di confronto ‎=‎ (uguaglianza) e ‎<>‎ (disuguaglianza) confrontano o meno gli operandi del tipo ‎REAL‎ o ‎LREAL‎

Giustificazione: ‎REAL‎/ I valori di‎LREAL‎ sono implementati come numeri in virgola mobile, secondo lo standard IEEE 754. Questo standard implica che determinati numeri decimali, apparentemente semplici, non possono essere rappresentati con precisione. Di conseguenza, per lo stesso numero decimale possono esistere diverse rappresentazioni come ‎LREAL‎.

Considerate le seguenti righe di codice:

lr11 := 1.1;
lr33 := 3.3;
lrVar1 := lr11 + lr11;
lrVar2 := lr33 - lr11;
botest := lrVar1 = lrVar2;

In questo caso, ‎botest‎ restituisce ‎FALSE‎, anche se le variabili ‎lrVar1‎ e ‎lrVar2‎ restituiscono entrambe il valore di monitoraggio 2,2. Non si tratta di un errore del compilatore, ma di una proprietà delle unità in virgola mobile di tutti i processori convenzionali. Si può evitare questo problema specificando un valore minimo di cui i valori possono differire: ‎botest := ABS(lrVar1 - lrVar2) < 0.1;‎

Eccezione: Il confronto con ‎0.0‎ non è riportato in questa analisi. Per lo 0, esiste una rappresentazione esatta nello standard IEEE 754 e quindi il confronto funziona normalmente come previsto. Pertanto, per migliorare le prestazioni, è opportuno consentire un confronto diretto in questa sede.

Importanza: Alto

Regola PLCopen: CP54

Esempio

PROGRAM PLC_PRG
VAR
	rTest1 : REAL;
	rTest2 : REAL;
	lrTest3 : LREAL;
	lrTest4 : LREAL;
	xResult : BOOL;
END_VAR

//the following lines each will cause an  SA0054:
xResult := rTest1 = rTest1; 
xResult := rTest1 = rTest2;
xResult := rTest1 <> rTest2;
xResult := lrTest3 = lrTest3;
xResult := lrTest3 = lrTest4;
xResult := lrTest3 <> lrTest4;
//the following lines each will not cause an  SA0054:
xResult := rTest1 > rTest2;
xResult := lrTest3 < lrTest4;

--> SA0054: Comparisons of REAL/LREAL for equality / inequality