diff --git a/src/benchmark/measurement.rs b/src/benchmark/measurement.rs index 16067a0..8dc109d 100644 --- a/src/benchmark/measurement.rs +++ b/src/benchmark/measurement.rs @@ -78,7 +78,7 @@ impl Measurements { if times.len() < 2 { None } else { - Some(standard_deviation(×)) + Some(standard_deviation(times)) } } diff --git a/src/quantity/statistics.rs b/src/quantity/statistics.rs index 311eca5..ae21811 100644 --- a/src/quantity/statistics.rs +++ b/src/quantity/statistics.rs @@ -85,23 +85,23 @@ where } } -fn standard_deviation_f64(values: &[f64]) -> f64 { - let mean_value = mean(values.iter().copied()); +fn standard_deviation_f64(values: impl IntoIterator + Clone) -> f64 { + let mean_value = mean(values.clone()); let mut squared_deviations = 0.; - let mut count = 0; + let mut n = 0; for value in values { let deviation = value - mean_value; squared_deviations += deviation * deviation; - count += 1; + n += 1; } - (1. / ((count - 1) as f64) * squared_deviations).sqrt() + (1. / ((n - 1) as f64) * squared_deviations).sqrt() } -pub fn standard_deviation(values: &[Q]) -> Q { - let values: Vec<_> = values.iter().map(|q| q.unsafe_raw_value()).collect(); - let result = standard_deviation_f64(&values); +pub fn standard_deviation(values: impl IntoIterator + Clone) -> Q { + let values: Vec<_> = values.into_iter().map(|q| q.unsafe_raw_value()).collect(); + let result = standard_deviation_f64(values); Q::unsafe_from_raw_value(result) } @@ -218,7 +218,7 @@ mod tests { Time::new::(200.0), Time::new::(300_000.0), ]; - let result = standard_deviation(&values); + let result = standard_deviation(values); assert_relative_eq!(result.get::(), 100.0); } }