Rileva se gli operatori di confronto = (uguaglianza) e <> (disuguaglianza) confrontano o meno gli operandi del tipo REAL o LREAL
Giustificazione: REAL/ I valori diLREAL 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