numeric_statistics/f32/
average.rs1pub fn average<T: AsRef<[f32]>>(values: T) -> f32 {
13 let values = values.as_ref();
14 if values.is_empty() { return f32::NAN; }
15 let mut sum: f32 = 0.0;
16 let mut len: usize = 0;
17 values.iter().for_each(|x|
18 if !x.is_nan() {
19 sum += *x;
20 len += 1;
21 }
22 );
23 sum / len as f32
24}
25
26#[cfg(test)]
27mod test {
28 use super::*;
29
30 #[test]
31 fn test_empty() {
32 let x: &[f32] = &[];
33 assert!(average(x).is_nan());
34 }
35
36 #[test]
37 fn test_nan() {
38 let x: &[f32] = &[f32::NAN];
39 assert!(average(x).is_nan());
40 }
41
42 #[test]
43 fn test_value() {
44 let x: &[f32] = &[1.0];
45 assert_eq_float!(average(x), 1.0);
46 }
47
48 #[test]
49 fn test_values_ascending() {
50 let x = &[1.0, 2.0, 4.0];
51 assert_eq_float!(average(x), 2.3333333);
52 }
53
54 #[test]
55 fn test_values_ascending_and_nans() {
56 let x = &[1.0, f32::NAN, 2.0, f32::NAN, 4.0];
57 assert_eq_float!(average(x), 2.3333333);
58 }
59
60 #[test]
61 fn test_values_descending() {
62 let x = &[4.0, 2.0, 1.0];
63 assert_eq_float!(average(x), 2.3333333);
64 }
65
66 #[test]
67 fn test_values_descending_and_nans() {
68 let x = &[4.0, f32::NAN, 2.0, f32::NAN, 1.0];
69 assert_eq_float!(average(x), 2.3333333);
70 }
71
72}
73