Program: 69330
Project: 69330
Buggy source:
private void computeLinearMinMax(boolean bAlignZero){
  final double dMinReal, dMaxReal;
  final double dMinValue, dMaxValue;
  double dMargin=0;
  if (bMargin) {
    dMargin=Math.abs(asDouble(oMaxAuto).doubleValue() - asDouble(oMinAuto).doubleValue()) * iMarginPercent / 100;
  }
  dMinReal=asDouble(oMinAuto).doubleValue() - dMargin;
  dMaxReal=asDouble(oMaxAuto).doubleValue() + dMargin;
  dMinValue=bMinimumFixed ? asDouble(oMinFixed).doubleValue() : dMinReal;
  dMaxValue=bMaximumFixed ? asDouble(oMaxFixed).doubleValue() : dMaxReal;
  double dMinAxis=dMinValue;
  double dMaxAxis=dMaxValue;
  double dStep=0;
  if (bStepFixed && oStepNumber != null) {
    oStep=new Double(Math.abs(dMaxValue - dMinValue) / (oStepNumber.intValue()));
    dStep=asDouble(oStep).doubleValue();
  }
 else {
    dStep=asDouble(oStep).doubleValue();
    if (bMargin) {
      dMinAxis=((dStep >= 1) ? Math.floor(dMinAxis / dStep) : Math.round(dMinAxis / dStep)) * dStep;
      dMaxAxis=(((dStep >= 1) ? Math.floor(dMaxAxis / dStep) : Math.round(dMaxAxis / dStep)) + 1) * dStep;
      if (dMaxAxis - dMaxValue >= dStep) {
        dMaxAxis-=dStep;
      }
    }
 else     if (!bExpandMinmax) {
      double dMinAxis1=((dStep >= 1) ? Math.floor(dMinAxis / dStep) : Math.round(dMinAxis / dStep)) * dStep;
      dMinAxis=dMinAxis < dMinAxis1 ? dMinAxis1 - dStep : dMinAxis1;
      double dMaxAxis1=((dStep >= 1) ? Math.floor(dMaxAxis / dStep) : Math.round(dMaxAxis / dStep)) * dStep;
      dMaxAxis=dMaxAxis > dMaxAxis1 ? dMaxAxis1 + dStep : dMaxAxis1;
    }
 else {
      final double dAbsMax=Math.abs(dMaxValue);
      final double dAbsMin=Math.abs(dMinValue);
      dMinAxis=((dStep >= 1) ? Math.floor(dAbsMin / dStep) : Math.round(dAbsMin / dStep)) * dStep;
      dMaxAxis=((dStep >= 1) ? Math.floor(dAbsMax / dStep) : Math.round(dAbsMax / dStep)) * dStep;
      if (dMinAxis == dAbsMin) {
        dMinAxis+=dStep;
        if (dMinValue < 0) {
          dMinAxis=-dMinAxis;
        }
 else         if (dMinValue == 0) {
          dMinAxis=0;
        }
      }
 else {
        if (dMinValue < 0) {
          dMinAxis=-(dMinAxis + dStep);
        }
 else         if (dMinAxis >= dMinValue && dMinAxis != 0) {
          dMinAxis-=dStep;
        }
      }
      if (dMaxAxis == dAbsMax) {
        dMaxAxis+=dStep;
        if (dMaxValue < 0) {
          dMaxAxis=-dMaxAxis;
        }
 else         if (dMaxValue == 0) {
          dMaxAxis=0;
        }
      }
 else       if (dMinAxis != dMaxValue) {
        if (dMaxValue < 0) {
          dMaxAxis=-(dMaxAxis - dStep);
        }
 else         if (dMaxValue > 0) {
          if (dMaxAxis < dMaxValue) {
            dMaxAxis+=dStep;
          }
        }
      }
      if (dMinValue < 0 && dMaxValue < 0) {
        if (dMaxAxis <= dMaxValue - dStep) {
          dMaxAxis+=2 * dStep;
        }
      }
      if (dMinValue > 0 && dMaxValue > 0) {
        if (dMinAxis >= dMinValue + dStep) {
          dMinAxis-=2 * dStep;
        }
      }
    }
  }
  if (dMinValue == 0 && dMaxValue == 0) {
    if (dMinAxis >= 0) {
      dMinAxis=-1;
    }
    if (dMaxAxis <= 0) {
      dMaxAxis=1;
    }
  }
  if ((iType & PERCENT) == PERCENT) {
    if (dMaxAxis > 0) {
      dMaxAxis=100;
    }
    if (dMinAxis < 0) {
      dMinAxis=-100;
    }
  }
  if (bAlignZero && dMinAxis < 0 && dMaxAxis > 0) {
    double abs=Math.max(Math.abs(dMinAxis),Math.abs(dMaxAxis));
    dMinAxis=-abs;
    dMaxAxis=abs;
  }
  if (!bMaximumFixed) {
    oMax=new Double(dMaxAxis);
  }
  if (!bMinimumFixed) {
    oMin=new Double(dMinAxis);
  }
  if (bMargin) {
    if (bMinimumFixed && dMinValue > dMinReal) {
      oMinAuto=new Double(dMinReal);
    }
 else {
      oMinAuto=null;
    }
    if (bMaximumFixed && dMaxValue < dMaxReal) {
      oMaxAuto=new Double(dMaxReal);
    }
 else {
      oMaxAuto=null;
    }
  }
 else {
    oMinAuto=null;
    oMaxAuto=null;
  }
}

Fixed version (ground truth):
private void computeLinearMinMax(boolean bAlignZero){
  final double dMinReal, dMaxReal;
  final double dMinValue, dMaxValue;
  double dMargin=0;
  if (bMargin) {
    dMargin=Math.abs(asDouble(oMaxAuto).doubleValue() - asDouble(oMinAuto).doubleValue()) * iMarginPercent / 100;
  }
  dMinReal=asDouble(oMinAuto).doubleValue() - dMargin;
  dMaxReal=asDouble(oMaxAuto).doubleValue() + dMargin;
  dMinValue=bMinimumFixed ? asDouble(oMinFixed).doubleValue() : dMinReal;
  dMaxValue=bMaximumFixed ? asDouble(oMaxFixed).doubleValue() : dMaxReal;
  double dMinAxis=dMinValue;
  double dMaxAxis=dMaxValue;
  double dStep=0;
  if (bStepFixed && oStepNumber != null) {
    oStep=new Double(Math.abs(dMaxValue - dMinValue) / (oStepNumber.intValue()));
    dStep=asDouble(oStep).doubleValue();
  }
 else {
    dStep=asDouble(oStep).doubleValue();
    if (bMargin) {
      dMinAxis=((dStep >= 1) ? Math.floor(dMinAxis / dStep) : Math.round(dMinAxis / dStep)) * dStep;
      dMaxAxis=(((dStep >= 1) ? Math.floor(dMaxAxis / dStep) : Math.round(dMaxAxis / dStep)) + 1) * dStep;
      if (dMaxAxis - dMaxValue >= dStep) {
        dMaxAxis-=dStep;
      }
    }
 else     if (!bExpandMinmax) {
      double dMinAxis1=((dStep >= 1) ? Math.floor(dMinAxis / dStep) : Math.round(dMinAxis / dStep)) * dStep;
      dMinAxis=dMinAxis < dMinAxis1 ? dMinAxis1 - dStep : dMinAxis1;
      double dMaxAxis1=((dStep >= 1) ? Math.floor(dMaxAxis / dStep) : Math.round(dMaxAxis / dStep)) * dStep;
      dMaxAxis=dMaxAxis > dMaxAxis1 ? dMaxAxis1 + dStep : dMaxAxis1;
    }
 else {
      final double dAbsMax=Math.abs(dMaxValue);
      final double dAbsMin=Math.abs(dMinValue);
      dMinAxis=((dStep >= 1) ? Math.floor(dAbsMin / dStep) : Math.round(dAbsMin / dStep)) * dStep;
      dMaxAxis=((dStep >= 1) ? Math.floor(dAbsMax / dStep) : Math.round(dAbsMax / dStep)) * dStep;
      if (ChartUtil.mathEqual(dMinAxis,dAbsMin)) {
        dMinAxis+=dStep;
        if (dMinValue < 0) {
          dMinAxis=-dMinAxis;
        }
 else         if (dMinValue == 0) {
          dMinAxis=0;
        }
      }
 else {
        if (dMinValue < 0) {
          dMinAxis=-(dMinAxis + dStep);
        }
 else         if (dMinAxis >= dMinValue && dMinAxis != 0) {
          dMinAxis-=dStep;
        }
      }
      if (ChartUtil.mathEqual(dMaxAxis,dAbsMax)) {
        dMaxAxis+=dStep;
        if (dMaxValue < 0) {
          dMaxAxis=-dMaxAxis;
        }
 else         if (dMaxValue == 0) {
          dMaxAxis=0;
        }
      }
 else       if (!ChartUtil.mathEqual(dMinAxis,dMaxValue)) {
        if (dMaxValue < 0) {
          dMaxAxis=-(dMaxAxis - dStep);
        }
 else         if (dMaxValue > 0) {
          if (dMaxAxis < dMaxValue) {
            dMaxAxis+=dStep;
          }
        }
      }
      if (dMinValue < 0 && dMaxValue < 0) {
        if (dMaxAxis <= dMaxValue - dStep) {
          dMaxAxis+=2 * dStep;
        }
      }
      if (dMinValue > 0 && dMaxValue > 0) {
        if (dMinAxis >= dMinValue + dStep) {
          dMinAxis-=2 * dStep;
        }
      }
    }
  }
  if (dMinValue == 0 && dMaxValue == 0) {
    if (dMinAxis >= 0) {
      dMinAxis=-1;
    }
    if (dMaxAxis <= 0) {
      dMaxAxis=1;
    }
  }
  if ((iType & PERCENT) == PERCENT) {
    if (dMaxAxis > 0) {
      dMaxAxis=100;
    }
    if (dMinAxis < 0) {
      dMinAxis=-100;
    }
  }
  if (bAlignZero && dMinAxis < 0 && dMaxAxis > 0) {
    double abs=Math.max(Math.abs(dMinAxis),Math.abs(dMaxAxis));
    dMinAxis=-abs;
    dMaxAxis=abs;
  }
  if (!bMaximumFixed) {
    oMax=new Double(dMaxAxis);
  }
  if (!bMinimumFixed) {
    oMin=new Double(dMinAxis);
  }
  if (bMargin) {
    if (bMinimumFixed && dMinValue > dMinReal) {
      oMinAuto=new Double(dMinReal);
    }
 else {
      oMinAuto=null;
    }
    if (bMaximumFixed && dMaxValue < dMaxReal) {
      oMaxAuto=new Double(dMaxReal);
    }
 else {
      oMaxAuto=null;
    }
  }
 else {
    oMinAuto=null;
    oMaxAuto=null;
  }
}