use crate::error::StatsResult;
use crate::prob::std_dev;
use num_traits::ToPrimitive;
#[inline]
pub fn std_err<T>(data: &[T]) -> StatsResult<f64>
where
T: ToPrimitive + std::fmt::Debug,
{
std_dev(data).map(|std| std / (data.len() as f64).sqrt())
}
#[cfg(test)]
mod tests {
use super::*;
const EPSILON: f64 = 1e-9;
#[test]
fn test_std_err_integers() {
let data = vec![1, 2, 3, 4, 5];
let result = std_err(&data).unwrap();
let expected = 0.632455532; assert!(
(result - expected).abs() < EPSILON,
"Standard error should be approximately 0.632455532"
);
}
#[test]
fn test_std_err_floats() {
let data = vec![1.0, 2.0, 3.0, 4.0, 5.0];
let result = std_err(&data).unwrap();
let expected = 0.632455532;
assert!(
(result - expected).abs() < EPSILON,
"Standard error for floats should be approximately 0.632455532"
);
}
#[test]
fn test_std_err_single_element() {
let data = vec![5];
let result = std_err(&data).unwrap();
let expected = 0.0;
assert_eq!(
result, expected,
"Standard error for a single element should be 0.0"
);
}
#[test]
fn test_std_err_empty() {
let data: Vec<i32> = vec![];
let result = std_err(&data);
assert!(result.is_err());
assert!(matches!(
result.unwrap_err(),
crate::error::StatsError::EmptyData { .. }
));
}
}