Percentile and Quantile Calculation

Compute percentiles and quantiles with linear interpolation on a copied sorted array, validating bounds and numeric input.

TypescriptData Integrity

Code

snippet
export function percentile(values: readonly number[], p: number): number {
  if (!Array.isArray(values) || values.length === 0) {
    throw new RangeError("values must be a non-empty array");
  }
  if (!Number.isFinite(p) || p < 0 || p > 100) {
    throw new RangeError("p must be between 0 and 100");
  }
  if (!values.every(Number.isFinite)) {
    throw new TypeError("values must be finite numbers");
  }
  const sorted = [...values].sort((a, b) => a - b);
  const index = (sorted.length - 1) * (p / 100);
  const lower = Math.floor(index);
  const upper = Math.ceil(index);
  if (lower === upper) return sorted[lower];
  return sorted[lower] + (sorted[upper] - sorted[lower]) * (index - lower);
}

export function quantile(values: readonly number[], q: number): number {
  if (!Number.isFinite(q) || q < 0 || q > 1) {
    throw new RangeError("q must be between 0 and 1");
  }
  return percentile(values, q * 100);
}