Shared Rust kernels
ported/percentile_common
All modules · quoted at commit 9e1884369a67 of DnaCalc/DnaCalc. Comments are the source's own.
percentile_inc_kernel · 14 lines · calc-func/src/ported/percentile_common.rs on GitHubpub fn percentile_inc_kernel(values: &mut [f64], k: f64) -> Result<f64, WorksheetErrorCode> {
if values.is_empty() {
return Err(WorksheetErrorCode::Num);
}
if !(0.0..=1.0).contains(&k) {
return Err(WorksheetErrorCode::Num);
}
values.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal));
if values.len() == 1 {
return Ok(values[0]);
}
let rank = 1.0 + k * (values.len() as f64 - 1.0);
interpolate_sorted(values, rank)
}
Used by 7 functions.
percentile_exc_kernel · 11 lines · calc-func/src/ported/percentile_common.rs on GitHubpub fn percentile_exc_kernel(values: &mut [f64], k: f64) -> Result<f64, WorksheetErrorCode> {
if values.is_empty() {
return Err(WorksheetErrorCode::Num);
}
values.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal));
let rank = k * (values.len() as f64 + 1.0);
if rank < 1.0 || rank > values.len() as f64 {
return Err(WorksheetErrorCode::Num);
}
interpolate_sorted(values, rank)
}
Used by 7 functions.
interpolate_sorted · 17 lines · calc-func/src/ported/percentile_common.rs on GitHubfn interpolate_sorted(values: &[f64], rank: f64) -> Result<f64, WorksheetErrorCode> {
let lower_index = rank.floor() as usize;
let upper_index = rank.ceil() as usize;
if lower_index == 0
|| upper_index == 0
|| lower_index > values.len()
|| upper_index > values.len()
{
return Err(WorksheetErrorCode::Num);
}
if lower_index == upper_index {
return Ok(values[lower_index - 1]);
}
let lower = values[lower_index - 1];
let upper = values[upper_index - 1];
Ok(lower + (rank - lower_index as f64) * (upper - lower))
}
Used by 7 functions.