SA0054:REAL/LREAL 的相等/不等比较
检测比较运算符是否 =
(平等)和 <>
(不等式)比较类型的操作数 REAL
或者 LREAL
.
理由: REAL
/LREAL
根据 IEEE 754 标准,值被实现为浮点数。该标准意味着特定的、看似简单的十进制数无法精确表示。因此,可能会有不同的表示形式: LREAL
对于相同的十进制数。
考虑以下代码行:
lr11 := 1.1; lr33 := 3.3; lrVar1 := lr11 + lr11; lrVar2 := lr33 - lr11; botest := lrVar1 = lrVar2;
在这种情况下, botest
返回 FALSE
, 即使变量 lrVar1
和 lrVar2
两者都返回“2.2”的监控值。这不是编译器的错误,而是所有常规处理器的浮点单元的属性。您可以通过指定值可能不同的最小值来避免这种情况: botest := ABS(lrVar1 - lrVar2) < 0.1;
botest := ABS(lrVar1 - lrVar2) < 0.1;
例外:与 0.0
本分析未报告。对于 0,IEEE 754 标准中有精确的表示,因此比较函数通常符合预期。因此,为了获得更好的性能,允许在这里进行直接比较是有意义的。
重要性:高
PLCopen规则:CP54
例 64. 例子
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:REAL/LREAL 相等/不相等的比较