* GAUSS * HARMEAN * KURT * MAXA * MEDIAN * MINA * RANK.EQ * RANK.AVG * SKEW * SKEW.P * SMALL * LARGE
40 lines
1.2 KiB
Rust
40 lines
1.2 KiB
Rust
use statrs::distribution::{ContinuousCDF, Normal};
|
|
|
|
use crate::expressions::token::Error;
|
|
use crate::expressions::types::CellReferenceIndex;
|
|
use crate::{calc_result::CalcResult, expressions::parser::Node, model::Model};
|
|
|
|
impl Model {
|
|
pub(crate) fn fn_gauss(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult {
|
|
if args.len() != 1 {
|
|
return CalcResult::new_args_number_error(cell);
|
|
}
|
|
let z = match self.get_number_no_bools(&args[0], cell) {
|
|
Ok(f) => f,
|
|
Err(s) => return s,
|
|
};
|
|
let dist = match Normal::new(0.0, 1.0) {
|
|
Ok(d) => d,
|
|
Err(_) => {
|
|
return CalcResult::Error {
|
|
error: Error::ERROR,
|
|
origin: cell,
|
|
message: "Failed to construct standard normal distribution".to_string(),
|
|
}
|
|
}
|
|
};
|
|
|
|
let result = dist.cdf(z) - 0.5;
|
|
|
|
if !result.is_finite() {
|
|
return CalcResult::Error {
|
|
error: Error::NUM,
|
|
origin: cell,
|
|
message: "Invalid result for GAUSS".to_string(),
|
|
};
|
|
}
|
|
|
|
CalcResult::Number(result)
|
|
}
|
|
}
|