SA0054:REAL / LREALを比較して等式/不等式
比較演算子かどうかを決定します =
(平等)と <>
(不等式)タイプのオペランド REAL
また LREAL
比べる。
理由: REAL
/LREAL
値は、IEEE 754 標準に従って浮動小数点数として実装されます。この標準は、特定の一見単純な 10 進数を正確に表現できないことを意味します。その結果、以下のように異なる表現が存在する可能性があります。 LREAL
同じ 10 進数の場合。
次のコード行を考えてみましょう。
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;
例外: との比較 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 の等価/不等価の比較