Skip to main content

SA0054: Comparaciones de REAL/LREAL para igualdad/desigualdad

Detecta si los operadores de comparación = (igualdad) y <> (desigualdad) comparar los operandos de tipo REAL o LREAL.

Justificación: REAL/LREAL Los valores se implementan como números de punto flotante según el estándar IEEE 754. Este estándar implica que números decimales específicos, aparentemente simples, no pueden representarse con precisión. Como resultado, puede haber diferentes representaciones como LREAL para el mismo número decimal.

Considere las siguientes líneas de código:

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

En este caso, botest devoluciones FALSE, incluso si las variables lrVar1 y lrVar2 ambos devuelven el valor de monitoreo de "2.2". Esto no es un error del compilador, sino una propiedad de las unidades de coma flotante de todos los procesadores convencionales. Puede evitar esto especificando un valor mínimo por el cual los valores pueden diferir:

botest := ABS(lrVar1 - lrVar2) < 0.1;

Excepción: Una comparación con 0.0 este análisis no informa. Para el 0, existe una representación exacta en el estándar IEEE 754 y, por lo tanto, la comparación funciona normalmente como se esperaba. Como resultado, para obtener un mejor rendimiento, tiene sentido permitir aquí una comparación directa.

Importancia: Alta

Regla PLCopen: CP54

ejemplo 64. Ejemplo
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;

Salida en el Mensajes vista:

  • sa_icon_message.png SA0054: Comparaciones de REAL/LREAL para igualdad/desigualdad