EN JP CN

CMPF.FLOAT

CMPF.FLOAT

2 つの float 値または double 値が equals 演算子 (==) を使用して比較されている場合にエラーが出力されます。

脆弱性とリスク

浮動小数点計算は精度に問題を生じる可能性があるため、浮動小数点型に対する等価チェックは避けてください。下記の例では、計算精度の問題で x1 + 700 * ((x2 - x1) / 700) が x2 にならない (* は乗算記号) ため、無限ループを生じる可能性があります。

軽減と防止

大きいか等しい、小さいか等しい、絶対値の差が指定の値より小さいかどうかなどのチェックを使用してください。たとえば、(Math.abs(x1-x2) < MIN_DIFF) などとします。

例 1

9      /**
10      * Calculates define integral
11      */
12     public static double integral(MyFunction f, double x1,
13                                   double x2) {
14         double x = x1;
15         double result = 0;
16         double step = (x2 - x1) / 700;
17         while (x != x2) { // should use (x <= x2)
18             result = result + f.valueFor(x) * step;
19             x = x + step;
20         }
21         return result;
22     }

CMPF.FLOAT が 17 行目に対して報告されています。浮動小数点型に対する等価チェックは避ける必要があります。