@Override
  protected void computeAxisValues(float min, float max) {
    float yMin = min;
    float yMax = max;

    int labelCount = mYAxis.getLabelCount();
    double range = Math.abs(yMax - yMin);

    if (labelCount == 0 || range <= 0) {
      mYAxis.mEntries = new float[] {};
      mYAxis.mEntryCount = 0;
      return;
    }

    double rawInterval = range / labelCount;
    double interval = Utils.roundToNextSignificant(rawInterval);
    double intervalMagnitude = Math.pow(10, (int) Math.log10(interval));
    int intervalSigDigit = (int) (interval / intervalMagnitude);
    if (intervalSigDigit > 5) {
      // Use one order of magnitude higher, to avoid intervals like 0.9 or
      // 90
      interval = Math.floor(10 * intervalMagnitude);
    }

    // force label count
    if (mYAxis.isForceLabelsEnabled()) {

      float step = (float) range / (float) (labelCount - 1);
      mYAxis.mEntryCount = labelCount;

      if (mYAxis.mEntries.length < labelCount) {
        // Ensure stops contains at least numStops elements.
        mYAxis.mEntries = new float[labelCount];
      }

      float v = min;

      for (int i = 0; i < labelCount; i++) {
        mYAxis.mEntries[i] = v;
        v += step;
      }

      // no forced count
    } else {

      // if the labels should only show min and max
      if (mYAxis.isShowOnlyMinMaxEnabled()) {

        mYAxis.mEntryCount = 2;
        mYAxis.mEntries = new float[2];
        mYAxis.mEntries[0] = yMin;
        mYAxis.mEntries[1] = yMax;

      } else {

        final double rawCount = yMin / interval;
        double first =
            rawCount < 0.0 ? Math.floor(rawCount) * interval : Math.ceil(rawCount) * interval;

        if (first < yMin && mYAxis.isStartAtZeroEnabled()) {
          // Force the first label to be at the 0 (or smallest negative value)
          first = yMin;
        }

        if (first == 0.0) // Fix for IEEE negative zero case (Where value == -0.0, and 0.0 == -0.0)
        first = 0.0;

        double last = Utils.nextUp(Math.floor(yMax / interval) * interval);

        double f;
        int i;
        int n = 0;
        for (f = first; f <= last; f += interval) {
          ++n;
        }

        if (Float.isNaN(mYAxis.getAxisMaxValue())) n += 1;

        mYAxis.mEntryCount = n;

        if (mYAxis.mEntries.length < n) {
          // Ensure stops contains at least numStops elements.
          mYAxis.mEntries = new float[n];
        }

        for (f = first, i = 0; i < n; f += interval, ++i) {
          mYAxis.mEntries[i] = (float) f;
        }
      }
    }

    if (interval < 1) {
      mYAxis.mDecimals = (int) Math.ceil(-Math.log10(interval));
    } else {
      mYAxis.mDecimals = 0;
    }

    if (!mYAxis.isStartAtZeroEnabled() && mYAxis.mEntries[0] < yMin) {
      // If startAtZero is disabled, and the first label is lower that the axis minimum,
      // Then adjust the axis minimum
      mYAxis.mAxisMinimum = mYAxis.mEntries[0];
    }

    mYAxis.mAxisMaximum = mYAxis.mEntries[mYAxis.mEntryCount - 1];
    mYAxis.mAxisRange = Math.abs(mYAxis.mAxisMaximum - mYAxis.mAxisMinimum);
  }