Skip to main content

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