Program: 79315
Project: 79315
Buggy source:
/** 
 * @param oMinValue
 * @param oMaxValue
 */
final void updateAxisMinMax(Object oMinValue,Object oMaxValue){
  if ((iType & LOGARITHMIC) == LOGARITHMIC) {
    if ((iType & PERCENT) == PERCENT) {
      oMaximum=new Double(100);
      oMinimum=new Double(1);
      oStep=new Double(10);
      bMaximumFixed=true;
      bMinimumFixed=true;
      bStepFixed=true;
      return;
    }
    final double dMinValue=asDouble(oMinValue).doubleValue();
    final double dMaxValue=asDouble(oMaxValue).doubleValue();
    final double dAbsMax=Math.abs(dMaxValue);
    final double dAbsMin=Math.abs(dMinValue);
    final double dStep=asDouble(oStep).doubleValue();
    final double dStepLog=Math.log(dStep);
    int iPow=(int)Math.floor(Math.log(dAbsMax) / dStepLog) + 1;
    double dMaxAxis=Math.pow(dStep,iPow);
    iPow=(int)Math.floor(Math.log(dAbsMin) / dStepLog) - 1;
    double dMinAxis=Math.pow(dStep,iPow - 1);
    if (!bMaximumFixed) {
      oMaximum=new Double(dMaxAxis);
    }
    if (!bMinimumFixed) {
      oMinimum=new Double(dMinAxis);
    }
  }
 else   if ((iType & DATE_TIME) == DATE_TIME) {
    int iUnit=asInteger(oUnit);
    int iStep=asInteger(oStep);
    CDateTime cdtMinValue=asDateTime(oMinValue);
    CDateTime cdtMaxValue=asDateTime(oMaxValue);
    if (!bMinimumFixed) {
      oMinimum=cdtMinValue.backward(iUnit,iStep);
    }
    ((CDateTime)oMinimum).clearBelow(iUnit);
    if (!bMaximumFixed) {
      oMaximum=cdtMaxValue.forward(iUnit,iStep);
    }
    ((CDateTime)oMaximum).clearBelow(iUnit);
  }
 else {
    final double dMinValue=asDouble(oMinValue).doubleValue();
    final double dMaxValue=asDouble(oMaxValue).doubleValue();
    final double dAbsMax=Math.abs(dMaxValue);
    final double dAbsMin=Math.abs(dMinValue);
    final double dStep=asDouble(oStep).doubleValue();
    double dMinAxis=(dStep > 1) ? Math.floor(dAbsMin / dStep) : Math.round(dAbsMin / dStep);
    dMinAxis*=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;
      }
    }
    double dMaxAxis=(dStep > 1) ? Math.floor(dAbsMax / dStep) : Math.round(dAbsMax / dStep);
    dMaxAxis*=dStep;
    if (dMaxAxis == dAbsMax) {
      dMaxAxis+=dStep;
      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)     dMaxAxis=0;
    if (dMinValue > 0 && dMaxValue > 0)     dMinAxis=0;
    if (!bMaximumFixed) {
      oMaximum=new Double(dMaxAxis);
    }
    if (!bMinimumFixed) {
      oMinimum=new Double(dMinAxis);
    }
  }
}

Fixed version (ground truth):
/** 
 * @param oMinValue
 * @param oMaxValue
 */
final void updateAxisMinMax(Object oMinValue,Object oMaxValue){
  if ((iType & LOGARITHMIC) == LOGARITHMIC) {
    if ((iType & PERCENT) == PERCENT) {
      oMaximum=new Double(100);
      oMinimum=new Double(1);
      oStep=new Double(10);
      bMaximumFixed=true;
      bMinimumFixed=true;
      bStepFixed=true;
      return;
    }
    final double dMinValue=asDouble(oMinValue).doubleValue();
    final double dMaxValue=asDouble(oMaxValue).doubleValue();
    final double dAbsMax=Math.abs(dMaxValue);
    final double dAbsMin=Math.abs(dMinValue);
    final double dStep=asDouble(oStep).doubleValue();
    final double dStepLog=Math.log(dStep);
    int iPow=(int)Math.floor(Math.log(dAbsMax) / dStepLog) + 1;
    double dMaxAxis=Math.pow(dStep,iPow);
    iPow=(int)Math.floor(Math.log(dAbsMin) / dStepLog) - 1;
    double dMinAxis=Math.pow(dStep,iPow + 1);
    if (!bMaximumFixed) {
      oMaximum=new Double(dMaxAxis);
    }
    if (!bMinimumFixed) {
      oMinimum=new Double(dMinAxis);
    }
  }
 else   if ((iType & DATE_TIME) == DATE_TIME) {
    int iUnit=asInteger(oUnit);
    int iStep=asInteger(oStep);
    CDateTime cdtMinValue=asDateTime(oMinValue);
    CDateTime cdtMaxValue=asDateTime(oMaxValue);
    if (!bMinimumFixed) {
      oMinimum=cdtMinValue.backward(iUnit,iStep);
    }
    ((CDateTime)oMinimum).clearBelow(iUnit);
    if (!bMaximumFixed) {
      oMaximum=cdtMaxValue.forward(iUnit,iStep);
    }
    ((CDateTime)oMaximum).clearBelow(iUnit);
  }
 else {
    final double dMinValue=asDouble(oMinValue).doubleValue();
    final double dMaxValue=asDouble(oMaxValue).doubleValue();
    final double dAbsMax=Math.abs(dMaxValue);
    final double dAbsMin=Math.abs(dMinValue);
    final double dStep=asDouble(oStep).doubleValue();
    double dMinAxis=(dStep > 1) ? Math.floor(dAbsMin / dStep) : Math.round(dAbsMin / dStep);
    dMinAxis*=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;
      }
    }
    double dMaxAxis=(dStep > 1) ? Math.floor(dAbsMax / dStep) : Math.round(dAbsMax / dStep);
    dMaxAxis*=dStep;
    if (dMaxAxis == dAbsMax) {
      dMaxAxis+=dStep;
      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)     dMaxAxis=0;
    if (dMinValue > 0 && dMaxValue > 0)     dMinAxis=0;
    if (!bMaximumFixed) {
      oMaximum=new Double(dMaxAxis);
    }
    if (!bMinimumFixed) {
      oMinimum=new Double(dMinAxis);
    }
  }
}