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