Skip to main content

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;

での出力 メッセージ ビュー:

  • sa_icon_message.png SA0054: REAL/LREAL の等価/不等価の比較