Skip to main content

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, 即使变量 lrVar1lrVar2 两者都返回“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;

输出在 留言 看法:

  • sa_icon_message.png SA0054:REAL/LREAL 相等/不相等的比较