SA0054: Confronta REAL / LREAL per uguaglianza/disuguaglianza
Determina se gli operatori di confronto = (uguaglianza) e <> (disuguaglianza) Operandi di tipo REAL o LREAL per confrontare.
Giustificazione: REAL/LREAL i valori sono implementati come numeri in virgola mobile secondo lo standard IEEE 754. Questo standard implica che numeri decimali specifici, apparentemente semplici, non possano essere rappresentati con precisione. Di conseguenza, potrebbero esserci rappresentazioni diverse come LREAL per lo stesso numero decimale.
Consideriamo le seguenti righe di codice:
lr11 := 1.1; lr33 := 3.3; lrVar1 := lr11 + lr11; lrVar2 := lr33 - lr11; botest := lrVar1 = lrVar2;
In questo caso, botest ritorna FALSE, anche se le variabili lrVar1 E lrVar2 entrambi restituiscono il valore di monitoraggio di "2.2". Questo non è un errore del compilatore, ma una proprietà delle unità in virgola mobile di tutti i processori convenzionali. Puoi evitarlo specificando un valore minimo in base al quale i valori possono differire:
botest := ABS(lrVar1 - lrVar2) < 0.1;Eccezione: un 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 ottenere prestazioni migliori, è opportuno consentire qui un confronto diretto.
Importanza: Alta
Regola PLCopen: CP54
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;
Uscita in Messaggi vista:
SA0054: Confronti REAL/LREAL per uguaglianza/disuguaglianza