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
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:
SA0054: Comparaciones de REAL/LREAL para igualdad/desigualdad