Skip to main content

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

Esempio 64. 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;

Uscita in Messaggi vista:

  • sa_icon_message.png SA0054: Confronti REAL/LREAL per uguaglianza/disuguaglianza