private int ComputePercentile(double percent)
{
// Some just-in-case edge cases
if (length <= 0)
{
return 0;
}
else if (percent <= 0.0)
{
return data[0];
}
else if (percent >= 100.0)
{
return data[length - 1];
}
// ranking (http://en.wikipedia.org/wiki/Percentile#Alternative_methods)
double rank = (percent / 100.0) * length;
// linear interpolation between closest ranks
int iLow = (int)Math.Floor(rank);
int iHigh = (int)Math.Ceiling(rank);
if (iHigh >= length)
{
// Another edge case
return data[length - 1];
}
else if (iLow == iHigh)
{
return data[iLow];
}
else
{
// Interpolate between the two bounding values
return (int)(data[iLow] + (rank - iLow) * (data[iHigh] - data[iLow]));
}
}
}