检测比较运算符=
(相等)和<>
(不等式)是否对REAL
或 LREAL
理由:REAL
/LREAL
值根据 IEEE 754 标准以浮点数形式实现。这一标准意味着具体的、看似简单的十进制数无法精确表示。因此,同一个十进制数可能有不同的表示方法,LREAL
。
请看下面几行代码:
lr11 := 1.1; lr33 := 3.3; lrVar1 := lr11 + lr11; lrVar2 := lr33 - lr11; botest := lrVar1 = lrVar2;
在这种情况下,即使变量lrVar1
和 lrVar2
都返回监测值 2.2,botest
也会返回FALSE
。这不是编译器的错误,而是所有传统处理器浮点运算单元的特性。可以通过指定一个最小值来避免这种情况: botest := ABS(lrVar1 - lrVar2) < 0.1;
例外情况:本分析报告未将其与0.0
进行比较。对于 0,IEEE 754 标准中有精确的表示方法,因此比较功能与预期的一样正常。因此,为了提高性能,在这里进行直接比较是合理的。
重要性:高
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; --> SA0054: Comparisons of REAL/LREAL for equality / inequality