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}