use crate::error::StatsResult;
use crate::prob::variance;
use num_traits::ToPrimitive;
use std::fmt::Debug;
#[inline]
pub fn std_dev<T>(data: &[T]) -> StatsResult<f64>
where
T: ToPrimitive + Debug,
{
variance(data).map(|x| x.sqrt())
}
#[cfg(test)]
mod tests {
use super::*;
const EPSILON: f64 = 1e-9;
#[test]
fn test_population_std_dev_integers() {
let data = vec![1, 2, 3, 4, 5];
let result = std_dev(&data).unwrap();
let expected = 2.0_f64.sqrt(); assert!(
(result - expected).abs() < EPSILON,
"Population std_dev for integers should be sqrt(2.0)"
);
}
#[test]
fn test_population_std_dev_floats() {
let data = vec![1.0, 2.0, 3.0, 4.0, 5.0];
let result = std_dev(&data).unwrap();
let expected = 2.0_f64.sqrt(); assert!(
(result - expected).abs() < EPSILON,
"Population std_dev for floats should be sqrt(2.0)"
);
}
#[test]
fn test_population_std_dev_mixed_floats() {
let data = vec![1.5, 2.5, 3.5, 4.5, 5.5];
let result = std_dev(&data).unwrap();
let expected = 2.0_f64.sqrt(); assert!(
(result - expected).abs() < EPSILON,
"Population std_dev for mixed floats should be sqrt(2.0)"
);
}
}