use crate::error::StatsResult;
use crate::prob::variance::{variance_population, variance_sample};
use num_traits::ToPrimitive;
use std::fmt::Debug;
#[inline]
pub fn std_dev_population<T>(data: &[T]) -> StatsResult<f64>
where
T: ToPrimitive + Debug,
{
variance_population(data).map(f64::sqrt)
}
#[inline]
pub fn std_dev_sample<T>(data: &[T]) -> StatsResult<f64>
where
T: ToPrimitive + Debug,
{
variance_sample(data).map(f64::sqrt)
}
#[inline]
pub fn std_dev<T>(data: &[T]) -> StatsResult<f64>
where
T: ToPrimitive + Debug,
{
std_dev_population(data)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn population_matches_alias() {
let data = [1.0, 2.5, 3.0, 4.5, 5.0];
assert_eq!(std_dev(&data).unwrap(), std_dev_population(&data).unwrap());
}
#[test]
fn population_known_value() {
let data = [1.0, 2.0, 3.0, 4.0, 5.0];
assert!((std_dev_population(&data).unwrap() - 2.0_f64.sqrt()).abs() < 1e-12);
}
#[test]
fn sample_known_value() {
let data = [1.0, 2.0, 3.0, 4.0, 5.0];
assert!((std_dev_sample(&data).unwrap() - 2.5_f64.sqrt()).abs() < 1e-12);
}
}