Fix a typo and a numerically unstable test
This commit is contained in:
parent
3178edcde6
commit
c740a60bf4
11
src/lib.rs
11
src/lib.rs
@ -102,7 +102,7 @@ impl Average {
|
|||||||
//
|
//
|
||||||
// self.avg += delta * len_other / len_total;
|
// self.avg += delta * len_other / len_total;
|
||||||
//
|
//
|
||||||
// instead but this results in cancellation if the number of samples are similar.
|
// instead but this results in cancelation if the number of samples are similar.
|
||||||
self.v += other.v + delta*delta * len_self * len_other / len_total;
|
self.v += other.v + delta*delta * len_self * len_other / len_total;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,6 +163,15 @@ mod tests {
|
|||||||
assert_almost_eq!(a.err(), f64::sqrt(0.5), 1e-16);
|
assert_almost_eq!(a.err(), f64::sqrt(0.5), 1e-16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn average_numerically_unstable() {
|
||||||
|
// The naive algorithm fails for this example due to cancelation.
|
||||||
|
let big = 1e9;
|
||||||
|
let sample = &[big + 4., big + 7., big + 13., big + 16.];
|
||||||
|
let a: Average = sample.iter().map(|x| *x).collect();
|
||||||
|
assert_eq!(a.sample_variance(), 30.);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn average_normal_distribution() {
|
fn average_normal_distribution() {
|
||||||
use rand::distributions::{Normal, IndependentSample};
|
use rand::distributions::{Normal, IndependentSample};
|
||||||
|
Loading…
Reference in New Issue
Block a user