CS.FLOAT.EQCHECK

Two float or double values are compared using equality operators (==, !=).

Vulnerability and risk

Avoid equality checks on floating point types because of the possible inaccuracy of floating point calculations. The example below can lead to an infinite loop because x1 + 700 times ((x2 - x1) / 700) is not equal to x2, due to inaccuracy.

Example 1

Copy
  class Math {
      public static double integral(MyFunction f, double x1, double x2) {
          double x = x1;
          double result = 0;
          double step = (x2 - x1) / 700;
          while (x != x2) {                   // defect, (x <= x2) should be used instead
              result = result + f.valueFor(x) * step;
              x = x + step;
          }
         return result;
     }
 }