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}