Skip to main content

numeric_statistics/f32/
standard_deviation.rs

1use super::variance;
2
3/// Calculate statistical standard deviation for values.
4///
5/// Return NaN if the values are empty.
6///
7/// Filter NaN values in the stream.
8/// 
9/// # Example
10///
11/// ```rust
12/// #[macro_use]
13/// use numeric_statistics::assert_eq_f32;
14/// use numeric_statistics::f32::standard_deviation::*;
15/// let values = &[1.0, 2.0, 4.0];
16/// let standard_deviation = standard_deviation(values);
17/// assert_eq_f32!(standard_deviation, 1.5275253 as f32);
18/// ```
19/// 
20pub fn standard_deviation<T: AsRef<[f32]>>(values: T) -> f32 {
21    standard_deviation_with_variance(variance(&values))
22}
23
24/// Calculate statistical standard deviation for values, 
25/// given a pre-calculated variance value.
26///
27/// Return NaN if the values are empty.
28///
29/// Filter NaN values in the stream.
30/// 
31/// # Example
32///
33/// ```rust
34/// #[macro_use]
35/// use numeric_statistics::assert_eq_f32;
36/// use numeric_statistics::f32::{variance::*, standard_deviation::*};
37/// let values = &[1.0, 2.0, 4.0];
38/// let variance = variance(values);
39/// let standard_deviation = standard_deviation_with_variance(variance);
40/// assert_eq_f32!(standard_deviation, 1.5275253 as f32);
41/// ```
42/// 
43pub fn standard_deviation_with_variance(variance: f32) -> f32 {
44    variance.sqrt()
45}
46
47#[cfg(test)]
48mod test {
49    use super::*;
50    use crate::assert_eq_f32;
51
52    #[test]
53    fn test_empty() {
54        let x: &[f32] = &[];
55        assert!(standard_deviation(x).is_nan());
56    }
57
58    #[test]
59    fn test_nan() {
60        let x: &[f32] = &[f32::NAN];
61        assert!(standard_deviation(x).is_nan());
62    }
63
64    #[test]
65    fn test_value() {
66        let x: &[f32] = &[1.0];
67        assert_eq_f32!(standard_deviation(x), 0.0);
68    }
69
70    #[test]
71    fn test_values_ascending() {
72        let x = &[1.0, 2.0, 4.0];
73        assert_eq_f32!(standard_deviation(x), 1.5275253);
74    }
75
76    #[test]
77    fn test_values_ascending_and_nans() {
78        let x = &[1.0, f32::NAN, 2.0, f32::NAN, 4.0];
79        assert_eq_f32!(standard_deviation(x), 1.5275253);
80    }
81
82}