truecalc-core 3.3.0

Formula engine with exact Google Sheets semantics — stateless, embeddable evaluator
Documentation
use crate::types::{ErrorKind, Value};
use super::stat_helpers::collect_nums_direct;

/// `KURT(value1, ...)` — excess kurtosis.
/// Array text/Bool → skip (errors propagate); too few numeric values → DivByZero.
pub fn kurt_fn(args: &[Value]) -> Value {
    if args.is_empty() { return Value::Error(ErrorKind::NA); }
    let nums = match collect_nums_direct(args) { Ok(v) => v, Err(e) => return e };
    let n = nums.len();
    if n < 4 { return Value::Error(ErrorKind::DivByZero); }
    let mean = nums.iter().sum::<f64>() / n as f64;
    let variance = nums.iter().map(|&x| (x - mean).powi(2)).sum::<f64>() / (n - 1) as f64;
    let s = libm::sqrt(variance);
    if s == 0.0 { return Value::Error(ErrorKind::DivByZero); }
    let nf = n as f64;
    let sum4 = nums.iter().map(|&x| ((x - mean) / s).powi(4)).sum::<f64>();
    let result = (nf * (nf + 1.0) / ((nf - 1.0) * (nf - 2.0) * (nf - 3.0))) * sum4
        - 3.0 * (nf - 1.0).powi(2) / ((nf - 2.0) * (nf - 3.0));
    if result.is_finite() { Value::Number(result) } else { Value::Error(ErrorKind::Num) }
}

#[cfg(test)]
mod tests;