Detecta si los operadores de comparación = (igualdad) y <> (desigualdad) comparan o no los operandos de tipo REAL o LREAL
Justificación: REAL/LREAL valores se implementan como números de punto flotante de acuerdo con el estándar
IEEE 754. Esta norma implica que determinados números decimales aparentemente sencillos
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 devuelve FALSE, aunque las variables lrVar1 y lrVar2 devuelvan ambas el valor de control 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 evitarlo especificando un valor mínimo por el que puedan diferir los valores:
botest := ABS(lrVar1 - lrVar2) < 0.1;
Excepción: Este análisis no incluye una comparación con 0.0. Para el 0, existe una representación exacta en la norma IEEE 754, por lo que la
comparación funciona normalmente como se espera. Por lo tanto, para un mejor rendimiento,
tiene sentido permitir aquí una comparación directa.
Importancia: Alta
Regla PLCopen: CP54
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; --> SA0054: Comparisons of REAL/LREAL for equality / inequality