#![cfg_attr(feature = "cargo-clippy", allow(float_cmp, map_clone))] extern crate average; #[cfg(feature = "serde")] extern crate serde_json; extern crate quantiles; use average::{Estimate, Quantile}; use quantiles::ckms::CKMS; #[test] fn few_observations() { let mut q = Quantile::new(0.5); assert_eq!(q.len(), 0); assert_eq!(q.quantile(), 0.); q.add(1.); assert_eq!(q.len(), 1); assert_eq!(q.quantile(), 1.); q.add(2.); assert_eq!(q.len(), 2); assert_eq!(q.quantile(), 1.5); q.add(3.); assert_eq!(q.len(), 3); assert_eq!(q.quantile(), 2.); q.add(4.); assert_eq!(q.len(), 4); assert_eq!(q.quantile(), 2.5); } #[cfg(feature = "serde")] #[test] fn few_observations_serde() { let mut q = Quantile::new(0.5); q.add(1.); q.add(2.); q.add(3.); q.add(4.); let b = serde_json::to_string(&q).unwrap(); assert_eq!(&b, "{\"q\":[1.0,2.0,3.0,4.0,0.0],\"n\":[1,2,3,4,4],\"m\":[1.0,2.0,3.0,4.0,5.0],\"dm\":[0.0,0.25,0.5,0.75,1.0]}"); let c: Quantile = serde_json::from_str(&b).unwrap(); assert_eq!(c.len(), 4); assert_eq!(c.quantile(), 2.5); } #[test] fn percentile_99_9() { let observations = [ 20., 20., 27., 28., 28., 34., 32., 32., 34., 33., 32., 30., 32., 30., 35., 27., 33., 26., 33., 26., 35., 32., 37., 30., 38., 26., 39., 37., 42., 29., 45., 27., 51., 33., 46., 38., 48., 31., 42., 35., 40., 29., 43., 30., 40., 29., 35., 34., 40., 24., 48., 32., 51., 33., 32., 32., 30., 28., 29., 31., 29., 29., 27., 2., 35., 3., 34., 28., 1., 25., 29., 28., 30., 27., 28., 3., 16., 31., 18., 28., 22., 30., 16., 27., 21., 6., 20., 28., 20., 6., 13., 20., 20., 30., 30., 28., 29., 29., 28., 27., 35., 25., 36., 25., 33., 27., 38., 34., 36., 33., 33., 41., 35., 34., 34., 37., 5., 31., 39., 34., 35., 41., 29., 39., 30., 37., 33., 33., 36., 33., 42., 32., 45., 33., 48., 31., 44., 30., 43., 29., 33., 29., 34., 33., 35., 33., 43., 24., 36., 29., 34., 26., 35., 6., 43., 28., 35., 28., 36., 4., 40., 25., 45., 20., 20., 30., 21., 28., 25., 36., 30., 37., 29., 40., 27., 40., 29., 37., 30., 40., 32., 45., 30., 42., 35., 44., 35., 38., 36., 37., 32., 35., 37., 39., 35., 36., 32., 35., 34., 36., 32., 37., 30., 27., 27., 42., 26., 39., 24., 42., 28., 43., 24., 44., 27., 40., 31., 29., 21., 28., 21., 38., 22., 35., 27., 25., 21., 30., 1., 30., 17., 26., 18., 28., 18., 2., 18., 30., 17., 30., 16., 28., 16., 28., 22., 26., 21., 23., 20., 20., 30., 21., 38., 23., 37., 28., 34., 27., 33., 29., 34., 26., 39., 26., 44., 25., 44., 26., 50., 25., 55., 24., 56., 31., 48., 35., 49., 36., 45., 40., 49., 30., 48., 29., 1., 35., 47., 35., 5., 27., 47., 22., 41., 26., 43., 26., 51., 1., 46., 1., 40., 1., 40., 0., 20., 20., 30., 22., 28., 25., 34., 27., 36., 29., 33., 35., 34., 32., 35., 29., 35., 3., 29., 31., 22., 38., 23., 4., 28., 32., 31., 31., 29., 4., 28., 2., 33., 3., 27., 4., 32., 29., 34., 27., 32., 2., 32., 26., 38., 1., 37., 2., 39., 38., 35., 41., 32., 0., 20., 20., 21., 28., 26., 30., 26., 36., 30., 37., 32., 40., 37., 41., 40., 36., 40., 38., 42., 42., 42., 46., 39., 43., 38., 48., 36., 51., 36., 48., 41., 46., 42., 46., 40., 40., 45., 37., 37., 40., 40., 36., 44., 42., 37., 37., 37., 39., 40., 37., 37., 28., 31., 28., 27., 33., 32., 4., 26., 34., 20., 20., 31., 28., 29., 47., 32., 31., 30., 32., 37., 33., 44., 35., 48., 33., 43., 28., 36., 30., 40., 33., 41., 33., 20., 20., 30., 30., 33., 28., 36., 36., 30., 7., 31., 5., 29., 35., 33., 33., 35., 34., 10., 38., 46., 44., 40., 39., 38., 43., 32., 39., 41., 40., 41., 39., 44., 44., 41., 43., 30., 27., 40., 26., 37., 27., 36., 29., 35., 27., 40., 28., 39., 28., 38., 29., 28., 23., 33., 23., 33., 23., 35., 25., 36., 24., 34., 20., 32., 18., 29., 21., 6., 15., 20., 8., 20., 5., 6., 6., 17., 4., 2., 7., 5., 7., 17., 3., 19., 6., 19., 5., 12., 4., 13., 2., 29., 3., 31., 0., 20., 20., 22., 19., 30., 26., 24., 26., 23., 26., 20., 27., 35., 3., 34., 33., 35., 29., 43., 28., 53., 29., 51., 0., 20., 20., 31., 28., 29., 47., 32., 39., 33., 39., 36., 42., 33., 43., 34., 45., 32., 48., 32., 47., 33., 49., 29., 50., 30., 48., 33., 45., 40., 43., 36., 43., 36., 42., 36., 47., 40., 46., 40., 46., 39., 41., 38., 37., 47., 4., 49., 40., 39., 3., 41., 1., 37., 3., 41., 6., 41., 36., 36., 40., 41., 39., 40., 45., 34., 30., 25., 31., 27., 29., 23., 26., 18., 25., 18., 20., 20., 30., 20., 31., 29., 29., 33., 37., 34., 37., 37., 33., 35., 37., 39., 35., 31., 29., 33., 34., 32., 37., 31., 36., 37., 35., 42., 36., 40., 29., 29., 27., 30., 29., 30., 4., 33., 24., 37., 28., 32., 25., 30., 27., 5., 29., 24., 21., 27., 25., 5., 20., 20., 11., 22., 15., 21., 22., 19., 20., 17., 20., 23., 24., 5., 26., 14., 24., 16., 20., 18., 4., 18., 14., 4., 20., 20., 20., 28., 24., 29., 30., 29., 35., 27., 36., 32., 34., 34., 31., 33., 31., 38., 31., 36., 30., 38., 31., 37., 36., 31., 36., 36., 38., 38., 40., 36., 43., 28., 49., 35., 35., 37., 40., 38., 5., 41., 38., 41., 39., 39., 40., 31., 38., 29., 39., 31., 37., 33., 37., 32., 33., 34., 3., 28., 27., 29., 30., 32., 29., 26., 28., 25., 27., 21., 33., 19., 26., 16., 27., 15., 26., 16., 24., 17., 27., 18., 22., 11., 18., 4., 22., 12., 19., 10., 22., 8., 24., 8., 20., 9., 18., 7., 23., 9., 19., 8., 21., 8., 21., 8., 22., 5., 22., 5., 25., 5., 24., 5., 26., 5., 20., 20., 29., 29., 31., 27., 33., 29., 31., 28., 42., 36., 38., 37., 30., 43., 31., 41., 29., 34., 25., 35., 30., 37., 32., 39., 32., 36., 31., 39., 33., 36., 36., 31., 43., 34., 41., 2., 45., 2., 38., 30., 45., 37., 42., 39., 39., 41., 40., 39., 39., 41., 39., 36., 41., 40., 40., 39., 40., 37., 47., 1., 30., 26., 29., 27., 35., 3., 32., 22., 26., 22., 29., 20., 28., 2., 33., 2., 33., 21., 36., 2., 34., 20., 31., 21., 29., 23., 6., 22., 24., 20., 23., 20., 22., 15., 27., 14., 20., 20., 27., 27., 26., 33., 25., 31., 29., 32., 32., 30., 34., 32., 39., 37., 34., 38., 35., 35., 40., 3., 33., 40., 39., 3., 28., 41., 34., 39., 28., 30., 28., 26., 18., 34., 17., 33., 22., 39., 19., 37., 30., 28., 33., 33., 31., 38., 29., 33., 29., 31., 37., 22., 38., 21., 3., 28., 38., 33., 30., 28., 32., 25., 27., 23., 23., 23., 20., 23., 22., 20., 24., 22., 22., 22., 22., 20., 18., 25., 21., 26., 21., 24., 20., 22., 12., 29., 12., 29., 16., 23., 10., 19., 13., 8., 18., 20., 19., 22., 3., 30., 4., 30., 22., 5., 25., 29., 6., 27., 8., 18., 8., 17., 6., 16., 7., 16., 3., 14., 3., 9., 8., 20., 20., 27., 28., 30., 30., 33., 35., 38., 37., 41., 1., 28., 29., 4., 27., 29., 24., 31., 30., 35., 30., 43., 38., 50., 8., 51., 4., 55., 40., 7., 45., 51., 42., 52., 44., 5., 38., 41., 40., 45., 42., 37., 34., 7., 34., 42., 2., 34., 26., 36., 17., 29., 16., 30., 15., 26., 7., 27., 7., 27., 20., 20., 29., 29., 33., 38., 37., 41., 40., 40., 43., 36., 39., 28., 46., 28., 38., 29., 39., 36., 40., 31., 38., 32., 37., 30., 36., 32., 37., 34., 36., 39., 35., 34., 33., 33., 25., 30., 5., 25., 6., 25., 24., 23., 28., 20., 31., 6., 23., 24., 22., 22., 22., 23., 26., 21., 24., 21., 27., 17., 28., 20., 28., 21., 26., 26., 22., 25., 22., 21., 4., 17., 21., 6., 20., 18., 12., 3., 13., 10., 14., 12., 14., 3., 12., 7., 14., 11., 17., 15., 16., 11., 15., 6., 15., 6., 31., 4., 20., 20., 30., 21., 33., 30., 31., 29., 26., 31., 26., 34., 33., 40., 32., 44., 32., 47., 29., 44., 28., 46., 28., 51., 35., 51., 34., 45., 31., 48., 37., 43., 32., 41., 32., 34., 33., 31., 31., 33., 37., 38., 33., 25., 29., 34., 25., 24., 21., 31., 21., 29., 24., 24., 17., 20., 17., 16., 22., 16., 23., 19., 24., 15., 20., 17., 20., 20., 19., 16., 20., 19., 17., 18., 19., 20., 18., 22., 17., 23., 17., 20., 15., 6., 16., 4., 15., 16., 1., 16., 0., 20., 20., 29., 29., 27., 30., 32., 24., 25., 35., 33., 34., 30., 30., 24., 31., 26., 32., 27., 32., 26., 28., 26., 30., 38., 30., 36., 35., 38., 33., 34., 34., 37., 34., 35., 35., 37., 32., 34., 30., 5., 37., 32., 39., 29., 38., 33., 35., 35., 38., 30., 39., 27., 34., 31., 39., 30., 31., 21., 30., 22., 27., 24., 28., 26., 32., 29., 32., 33., 29., 34., 27., 34., 25., 34., 20., 42., 20., 41., 19., 42., 21., 44., 24., 43., 21., 42., 14., 40., 4., 41., 21., 40., 20., 42., 12., 36., 16., 34., 15., 20., 20., 30., 22., 28., 27., 37., 25., 41., 34., 40., 35., 40., 33., 7., 34., 41., 33., 48., 31., 47., 39., 51., 32., 47., 30., 44., 30., 34., 29., 43., 34., 41., 44., 41., 46., 32., 40., 34., 40., 34., 41., 32., 41., 32., 37., 35., 32., 29., 30., 26., 22., 26., 25., 15., 19., 15., 19., 14., 17., 16., 17., 17., 22., 1., 39., 3., 33., 20., 20., 28., 21., 38., 23., 40., 21., 39., 22., 34., 27., 35., 24., 38., 24., 39., 25., 36., 25., 34., 27., 33., 34., 33., 25., 24., 26., 26., 24., 25., 24., 1., 22., 36., 22., 37., 22., 38., 17., 40., 16., 33., 17., 33., 16., 37., 16., 35., 15., 36., 19., 29., 21., 30., 16., 30., 3., 39., 9., 3., 5., 35., 5., 38., 0., 20., 20., 20., 21., 21., 27., 26., 26., 36., 30., 37., 27., 37., 28., 37., 28., 41., 34., 38., 36., 44., 38., 44., 31., 38., 29., 39., 35., 41., 40., 40., 42., 40., 38., 35., 40., 40., 39., 32., 41., 34., 38., 30., 37., 34., 44., 33., 41., 36., 40., 38., 38., 40., 45., 39., 48., 38., 47., 36., 43., 34., 40., 39., 36., 35., 38., 38., 2., 39., 1., 23., 33., 1., 20., 20., 30., 22., 28., 30., 37., 28., 42., 31., 43., 30., 42., 30., 43., 29., 45., 31., 41., 32., 42., 29., 40., 33., 41., 30., 37., 32., 47., 35., 43., 34., 45., 32., 36., 38., 33., 37., 34., 39., 38., 35., 38., 1., 37., 38., 33., 36., 38., 40., 42., 2., 44., 4., 39., 3., 20., 20., 29., 29., 28., 38., 27., 48., 30., 42., 32., 43., 33., 36., 40., 42., 38., 46., 38., 38., 41., 38., 47., 3., 47., 41., 47., 44., 2., 44., 48., 42., 50., 42., 49., 42., 54., 52., 50., 51., 34., 49., 28., 55., 2., 48., 3., 42., 2., 37., 12., 44., 12., 38., 12., 37., 2., 37., 0., 20., 20., 30., 19., 38., 29., 36., 30., 37., 29., 33., 31., 33., 29., 38., 36., 36., 33., 30., 30., 38., 35., 30., 35., 33., 36., 36., 37., 40., 33., 37., 27., 37., 27., 37., 33., 44., 39., 45., 40., 44., 41., 49., 40., 48., 3., 43., 0., 20., 20., 27., 28., 30., 34., 5., 37., 30., 37., 26., 45., 6., 38., 36., 37., 34., 31., 34., 31., 37., 32., 33., 28., 40., 29., 42., 38., 38., 42., 37., 40., 39., 36., 40., 32., 43., 31., 41., 36., 36., 39., 37., 39., 4., 33., 39., 31., 38., 32., 45., 38., 29., 27., 30., 28., 30., 32., 28., 37., 28., 30., 27., 31., 28., 20., 20., 30., 27., 34., 28., 42., 28., 38., 31., 26., 32., 33., 32., 31., 31., 32., 26., 33., 35., 28., 43., 27., 39., 3., 45., 3., 44., 20., 20., 30., 19., 39., 22., 40., 20., 41., 26., 36., 35., 43., 33., 40., 29., 38., 28., 31., 28., 4., 23., 35., 28., 35., 34., 33., 42., 34., 40., 36., 42., 28., 43., 37., 42., 38., 40., 34., 39., 35., 36., 33., 39., 34., 33., 33., 34., 33., 34., 31., 29., 15., 30., 14., 25., 14., 21., 19., 22., 19., 17., 23., 1., 23., 14., 17., 13., 17., 10., 17., 8., 16., 9., 17., 12., 17., 12., 17., 11., 20., 14., 19., 5., 19., 20., 20., 30., 22., 28., 29., 32., 31., 33., 29., 34., 31., 31., 32., 34., 35., 33., 36., 32., 36., 32., 36., 31., 30., 30., 34., 34., 35., 44., 36., 47., 41., 42., 38., 38., 33., 37., 35., 37., 36., 2., 45., 39., 47., 38., 41., 43., 42., 41., 43., 33., 3., 32., 42., 32., 45., 28., 4., 39., 40., 31., 47., 20., 39., 14., 27., 17., 27., 18., 26., 17., 32., 3., 32., 17., 20., 20., 29., 29., 27., 31., 33., 36., 36., 32., 40., 32., 41., 37., 43., 38., 46., 33., 41., 31., 41., 36., 43., 32., 42., 37., 41., 34., 36., 55., 31., 49., 32., 43., 33., 42., 30., 43., 32., 42., 4., 47., 3., 46., 38., 2., 37., 44., 38., 43., 4., 41., 35., 41., 23., 25., 17., 25., 23., 29., 29., 25., 26., 28., 26., 26., 25., 26., 29., 5., 29., 28., 27., 32., 25., 33., 25., 35., 20., 34., 22., 36., 20., 23., 13., 25., 16., 22., 12., 4., 15., 19., 15., 21., 11., 19., 12., 20., 20., 29., 29., 33., 32., 33., 33., 34., 28., 41., 28., 37., 29., 45., 28., 41., 30., 37., 30., 31., 36., 30., 35., 36., 27., 36., 25., 38., 20., 20., 20., 30., 22., 28., 30., 36., 32., 8., 39., 34., 45., 35., 49., 37., 51., 32., 46., 39., 4., 51., 30., 33., 28., 32., 23., 41., 3., 37., 24., 34., 24., 33., 25., 27., 25., 31., 23., 30., 26., 27., 32., 28., 31., 29., 33., 29., 37., 29., 37., 25., 44., 26., 41., 20., 32., 17., 32., 22., 30., 23., 26., 24., 5., 23., 18., 29., 17., 5., 22., 6., 22., 27., 26., 24., 21., 28., 22., 30., 5., 31., 20., 22., 20., 32., 13., 27., 15., 29., 13., 5., 19., 24., 14., 28., 14., 28., 2., 28., 16., 6., 16., 3., 16., 6., 16., 18., 14., 2., 21., 17., 21., 24., 20., 18., 18., 4., 18., 7., 18., 20., 20., 28., 22., 32., 33., 33., 42., 34., 40., 35., 35., 29., 3., 30., 36., 26., 35., 30., 39., 28., 36., 24., 4., 20., 20., 21., 28., 26., 30., 26., 31., 37., 33., 38., 31., 38., 32., 38., 29., 44., 30., 42., 28., 39., 32., 40., 32., 45., 37., 41., 28., 49., 31., 47., 35., 45., 33., 49., 32., 43., 34., 44., 32., 46., 40., 48., 39., 6., 31., 39., 25., 39., 23., 39., 20., 36., 22., 37., 18., 31., 19., 37., 1., 35., 20., 37., 27., 35., 34., 33., 33., 38., 30., 26., 39., 28., 32., 33., 30., 29., 36., 16., 27., 20., 20., 29., 29., 27., 31., 28., 29., 34., 2., 26., 4., 31., 27., 34., 36., 34., 49., 40., 33., 26., 31., 29., 32., 20., 35., 22., 32., 25., 36., 30., 32., 36., 5., 36., 26., 31., 34., 3., 29., 28., 29., 22., 33., 24., 29., 25., 5., 22., 19., 26., 19., 24., 18., 27., 17., 4., 23., 24., 16., 31., 14., 29., 1., 30., 15., 5., 14., 6., 14., 20., 13., 4., 18., 23., 13., 22., 16., 9., 21., 13., 20., 5., 7., 12., 11., 12., 11., 12., 9., 10., 9., 10., 9., 10., 10., 9., 9., 8., 6., 10., 6., 26., 6., 27., 5., 30., 8., 29., 3., 31., 7., 20., 20., 27., 27., 33., 30., 37., 26., 20., 20., 29., 29., 32., 31., 33., 29., 32., 32., 31., 32., 31., 32., 31., 33., 27., 32., 29., 32., 28., 31., 29., 31., 32., 32., 31., 32., 33., 30., 33., 33., 36., 33., 36., 33., 35., 34., 31., 36., 35., 34., 3., 30., 27., 33., 28., 41., 26., 41., 26., 44., 27., 43., 30., 40., 28., 37., 30., 33., 30., 34., 33., 36., 34., 1., 35., 3., 36., 20., 20., 30., 22., 28., 24., 37., 28., 39., 26., 37., 33., 40., 36., 43., 38., 44., 35., 41., 32., 45., 29., 46., 28., 49., 29., 46., 32., 52., 33., 45., 35., 42., 35., 42., 35., 37., 36., 41., 32., 38., 30., 43., 29., 39., 30., 43., 5., 42., 33., 42., 7., 46., 4., 45., 27., 40., 1., 20., 20., 21., 30., 25., 33., 27., 34., 29., 33., 35., 33., 33., 33., 33., 32., 41., 33., 38., 33., 42., 31., 44., 33., 35., 40., 35., 33., 39., 35., 39., 35., 6., 35., 33., 39., 36., 34., 50., 30., 53., 38., 38., 39., 3., 33., 38., 33., 34., 32., 33., 24., 33., 20., 20., 30., 21., 38., 25., 39., 32., 43., 33., 40., 32., 42., 29., 39., 29., 42., 30., 38., 30., 38., 28., 37., 31., 40., 37., 36., 32., 38., 35., 42., 35., 40., 33., 42., 29., 45., 31., 38., 3., 43., 2., 46., 35., 41., 34., 45., 40., 48., 3., 51., 2., 43., 2., 54., 25., 58., 2., 53., 1., 51., 0., 20., 20., 21., 27., 21., 37., 30., 37., 34., 37., 31., 40., 32., 42., 33., 46., 30., 38., 28., 35., 26., 31., 26., 36., 27., 34., 30., 35., 25., 31., 23., 34., 1., 35., 26., 32., 38., 39., 33., 38., 40., 32., 2., 34., 1., 32., 0., 20., 20., 28., 22., 30., 23., 33., 26., 40., 34., 37., 36., 35., 30., 37., 28., 40., 29., 39., 28., 43., 28., 41., 27., 41., 29., 38., 34., 40., 38., 33., 40., 33., 46., 35., 44., 35., 43., 33., 41., 32., 37., 34., 43., 32., 41., 34., 43., 36., 41., 32., 45., 30., 46., 37., 6., 41., 2., 43., 5., 23., 32., 3., 28., 23., 25., 1., 19., 13., 15., 24., 15., 20., 20., 28., 27., 31., 33., 33., 1., 25., 32., 4., 35., 24., 35., 26., 38., 29., 3., 28., 38., 1., 40., 25., 42., 26., 34., 31., 40., 28., 41., 20., 20., 30., 30., 38., 32., 37., 5., 40., 29., 41., 31., 35., 28., 32., 23., 29., 28., 28., 30., 30., 35., 41., 33., 41., 33., 40., 28., 45., 32., 42., 33., 38., 34., 39., 26., 38., 32., 38., 36., 32., 36., 31., 39., 32., 32., 32., 33., 32., 34., 24., 2., 20., 33., 2., 28., 5., 35., 3., 29., 5., 33., 3., 35., 2., 41., 20., 20., 29., 29., 39., 31., 44., 39., 37., 37., 44., 41., 45., 34., 46., 40., 43., 46., 38., 44., 42., 42., 40., 43., 43., 46., 32., 20., 20., 31., 28., 29., 47., 5., 43., 20., 45., 27., 41., 34., 38., 41., 34., 42., 36., 42., 24., 35., 25., 36., 27., 34., 31., 33., 33., 34., 36., 38., 34., 37., 33., 31., 28., 32., 33., 32., 37., 30., 40., 34., 38., 2., 31., 38., 0., 20., 20., 29., 29., 31., 25., 42., 26., 45., 30., 45., 31., 45., 31., 38., 32., 40., 27., 41., 27., 43., 26., 40., 22., 39., 28., 36., 37., 34., 38., 32., 30., 32., 30., 31., 31., 30., 33., 31., 33., 34., 39., 32., 1., 31., 32., 30., 29., 24., 25., 22., 34., 4., 34., 28., 29., 4., 35., 30., 25., 21., 19., 21., 17., 19., 16., 17., 15., 14., 19., 15., 18., 14., 21., 5., 27., 10., 25., 11., 24., 16., 1., 13., 35., 4., 42., 0., 20., 20., 21., 27., 27., 28., 37., 25., 31., 27., 31., 29., 38., 33., 38., 32., 36., 34., 33., 33., 33., 36., 30., 32., 34., 36., 33., 40., 38., 43., 35., 36., 40., 31., 35., 47., 35., 44., 34., 42., 32., 40., 30., 38., 32., 36., 33., 39., 18., 34., 21., 34., 3., 34., 21., 33., 20., 20., 30., 22., 28., 29., 30., 33., 38., 31., 43., 34., 48., 31., 44., 31., 44., 34., 45., 37., 52., 36., 49., 34., 46., 38., 48., 39., 43., 43., 40., 27., 31., 35., 33., 36., 22., 34., 31., 33., 34., 24., 30., 25., 34., 23., 23., 23., 24., 32., 21., 32., 18., 32., 24., 31., 23., 31., 3., 20., 20., 30., 21., 38., 23., 39., 25., 32., 26., 30., 29., 28., 31., 34., 29., 36., 36., 32., 35., 34., 33., 32., 36., 40., 38., 33., 42., 37., 38., 42., 37., 45., 38., 42., 39., 43., 41., 36., 45., 26., 20., 20., 31., 28., 29., 47., 32., 39., 33., 42., 39., 42., 35., 43., 37., 33., 39., 30., 37., 36., 38., 35., 37., 37., 38., 46., 36., 41., 36., 50., 33., 42., 41., 20., 20., 22., 29., 24., 32., 24., 25., 32., 35., 33., 46., 26., 27., 27., 30., 21., 23., 21., 29., 22., 28., 26., 26., 24., 25., 24., 23., 23., 22., 26., 27., 28., 24., 32., 26., 32., 26., 26., 27., 25., 30., 25., 7., 28., 30., 31., 31., 31., 31., 29., 32., 29., 37., 5., 38., 2., 37., 2., 37., 35., 37., 34., 35., 38., 38., 34., 2., 42., 29., 2., 27., 42., 21., 45., 3., 39., 4., 42., 17., 43., 2., 41., 15., 7., 13., 4., 20., 20., 29., 30., 38., 31., 37., 30., 37., 31., 38., 28., 32., 31., 31., 32., 31., 25., 32., 27., 29., 25., 28., 28., 33., 25., 34., 27., 29., 33., 28., 27., 26., 32., 31., 33., 33., 36., 32., 36., 34., 35., 35., 33., 32., 38., 30., 41., 22., 41., 4., 39., 23., 28., 17., 32., 3., 37., 18., 36., 21., 42., 5., 43., 22., 41., 17., 24., 4., 26., 14., 23., 17., 20., 17., 21., 20., 24., 24., 23., 23., 6., 24., 16., 20., 20., 20., 33., 5., 31., 1., 20., 20., 29., 30., 38., 30., 37., 28., 43., 34., 38., 37., 35., 30., 43., 26., 45., 27., 49., 30., 48., 24., 41., 21., 43., 21., 43., 19., 41., 20., 39., 18., 42., 29., 36., 32., 37., 32., 41., 28., 47., 23., 45., 22., 48., 21., 43., 22., 36., 29., 36., 25., 33., 1., 26., 1., 31., 21., 1., 19., 27., 21., 26., 28., 27., 28., 27., 30., 4., 26., 4., 28., 22., 26., 3., 28., 5., 27., 5., 29., 5., 23., 2., 24., 4., 26., 2., 24., 4., 26., 22., 24., 18., 3., 27., 25., 4., 27., 7., 24., 7., 24., 6., 27., 4., 26., 27., 24., 3., 23., 4., 20., 3., 16., 4., 24., 3., 16., 4., 24., 3., 16., 20., 20., 27., 28., 30., 34., 33., 32., 38., 37., 33., 32., 33., 27., 33., 24., 37., 25., 44., 27., 45., 26., 45., 27., 42., 26., 41., 32., 38., 32., 41., 32., 41., 42., 50., 20., 20., 29., 30., 29., 30., 36., 29., 43., 30., 54., 34., 54., 33., 48., 31., 48., 39., 48., 45., 48., 3., 55., 20., 20., 28., 30., 30., 34., 24., 32., 31., 33., 27., 30., 37., 29., 38., 31., 34., 33., 41., 36., 41., 39., 1., 30., 34., 30., 26., 34., 30., 33., 5., 33., 29., 34., 33., 39., 2., 33., 8., 39., 25., 39., 3., 32., 13., 21., 17., 21., 17., 22., 17., 25., 17., 20., 9., 23., 10., 23., 11., 24., 8., 27., 2., 26., 7., 24., 10., 24., 8., 24., 7., 26., 7., 23., 5., 24., 6., 26., 6., 27., 3., 24., 6., 25., 8., 25., 5., 7., 4., 21., 7., 26., 8., 27., 7., 31., 2., 44., 5., 39., 7., 41., 4., 41., 3., 39., 0., 20., 20., 28., 30., 38., 32., 36., 34., 37., 24., 36., 38., 35., 37., 34., 32., 30., 34., 33., 31., 35., 29., 34., 36., 27., 33., 27., 37., 29., 45., 35., 42., 33., 40., 33., 39., 37., 37., 36., 34., 37., 33., 34., 38., 37., 33., 34., 38., 40., 34., 37., 38., 32., 37., 27., 28., 3., 33., 30., 3., 25., 3., 27., 6., 25., 25., 2., 27., 2., 24., 2., 26., 27., 2., 30., 4., 32., 3., 30., 2., 30., 3., 22., 5., 27., 33., 18., 29., 20., 28., 2., 21., 3., 27., 19., 28., 21., 39., 1., 29., 0., 20., 20., 30., 30., 38., 31., 39., 35., 40., 33., 40., 34., 40., 38., 43., 37., 38., 33., 34., 30., 43., 28., 47., 29., 42., 28., 40., 30., 40., 26., 37., 33., 36., 32., 2., 26., 36., 31., 40., 36., 38., 33., 36., 31., 35., 31., 42., 30., 40., 26., 35., 27., 35., 27., 39., 26., 36., 26., 33., 26., 29., 28., 29., 33., 28., 32., 29., 32., 30., 31., 29., 32., 27., 38., 25., 38., 27., 38., 30., 39., 28., 37., 36., 41., 35., 37., 35., 30., 34., 34., 27., 24., 27., 22., 24., 20., 22., 24., 26., 8., 29., 21., 27., 20., 20., 30., 30., 38., 31., 36., 35., 34., 34., 35., 31., 32., 34., 33., 36., 34., 36., 37., 28., 36., 30., 33., 26., 32., 25., 32., 26., 28., 28., 34., 25., 34., 29., 37., 23., 49., 1., 48., 1., 45., 4., 46., 3., 38., 20., 39., 23., 39., 3., 42., 29., 41., 2., 41., 28., 43., 32., 36., 5., 35., 35., 31., 6., 32., 4., 29., 43., 26., 45., 4., 50., 3., 43., 27., 40., 28., 4., 28., 38., 25., 34., 27., 33., 28., 3., 21., 27., 28., 4., 28., 25., 25., 23., 28., 27., 29., 18., 24., 26., 27., 5., 21., 24., 24., 27., 21., 26., 19., 3., 17., 6., 19., 19., 1., 30., 2., 36., 1., 31., 1., 29., 2., 20., 20., 21., 30., 27., 33., 28., 32., 32., 33., 32., 34., 30., 36., 32., 35., 35., 37., 29., 40., 6., 46., 32., 51., 7., 53., 45., 47., 43., 44., 39., 0., 20., 20., 29., 29., 27., 27., 29., 29., 37., 29., 36., 36., 30., 47., 28., 40., 36., 43., 37., 40., 36., 36., 35., 37., 36., 34., 35., 41., 42., 38., 39., 34., 44., 34., 38., 45., 43., 35., 44., 42., 44., 42., 43., 45., 36., 45., 34., 43., 35., 38., 38., 33., 42., 28., 27., 1., 29., 27., 28., 29., 20., 26., 13., 41., 18., 33., 3., 37., 17., 29., 2., 23., 14., 26., 14., 30., 15., 29., 14., 27., 10., 27., 14., 26., 12., 3., 12., 21., 2., 24., 13., 26., 12., 23., 14., 19., 1., 9., 5., 8., 6., 9., 6., 9., 5., 7., 3., 8., 3., 9., 4., 9., 6., 10., 3., 28., 1., 27., 3., 29., 3., 27., 3., 30., 2., 41., 2., 44., 1., 39., 0., 20., 20., 30., 22., 28., 28., 33., 30., 36., 30., 43., 31., 37., 29., 41., 33., 44., 31., 46., 29., 44., 34., 39., 33., 36., 34., 40., 29., 38., 22., 30., 33., 29., 42., 29., 35., 28., 31., 33., 14., 16., 15., 23., 14., 28., 17., 26., 16., 27., 17., 31., 18., 30., 17., 29., 2., 33., 13., 32., 19., 32., 2., 30., 16., 28., 16., 26., 20., 23., 19., 22., 20., 14., 12., 15., 9., 17., 10., 20., 10., 14., 9., 9., 12., 10., 12., 9., 13., 8., 10., 9., 9., 9., 9., 12., 9., 29., 3., 34., 2., 24., 7., 23., 5., 21., 4., 21., 2., 28., 2., 28., 1., 28., 2., 28., 1., 26., 0., 20., 20., 27., 28., 30., 30., 33., 33., 31., 30., 37., 32., 37., 27., 39., 30., 40., 32., 41., 36., 40., 36., 44., 41., 44., 41., 34., 43., 40., 40., 40., 40., 42., 42., 52., 36., 48., 33., 45., 36., 47., 35., 43., 38., 35., 33., 41., 35., 41., 33., 3., 38., 39., 35., 38., 37., 40., 33., 20., 20., 28., 21., 34., 25., 33., 26., 37., 34., 35., 35., 34., 31., 35., 31., 34., 32., 34., 34., 42., 39., 33., 38., 33., 37., 32., 41., 29., 42., 30., 42., 24., 41., 26., 30., 23., 37., 19., 23., 27., 23., 23., 24., 25., 23., 26., 22., 28., 23., 27., 18., 22., 19., 19., 18., 22., 18., 22., 22., 21., 17., 20., 20., 17., 19., 21., 18., 21., 26., 20., 21., 19., 15., 18., 14., 18., 4., 16., 12., 16., 20., 20., 30., 22., 30., 26., 30., 33., 36., 4., 29., 33., 27., 31., 26., 32., 30., 37., 32., 36., 33., 42., 30., 42., 32., 36., 36., 38., 48., 36., 47., 37., 44., 39., 43., 37., 37., 38., 35., 43., 41., 41., 37., 34., 31., 23., 19., 26., 19., 26., 16., 29., 23., 30., 2., 28., 18., 28., 17., 23., 3., 20., 12., 11., 7., 10., 7., 11., 7., 12., 7., 11., 7., 9., 7., 8., 9., 7., 7., 8., 6., 7., 7., 11., 8., 10., 6., 25., 4., 23., 4., 20., 20., 30., 30., 38., 35., 36., 36., 38., 39., 33., 32., 45., 30., 45., 36., 40., 31., 46., 30., 54., 34., 52., 30., 51., 31., 45., 36., 41., 39., 43., 38., 41., 32., 36., 37., 40., 37., 33., 38., 36., 31., 35., 6., 30., 5., 21., 22., 25., 21., 23., 20., 21., 26., 21., 22., 23., 23., 24., 24., 20., 24., 21., 31., 20., 31., 20., 32., 24., 27., 23., 25., 20., 19., 22., 21., 6., 21., 5., 20., 19., 18., 5., 22., 16., 18., 14., 13., 4., 17., 20., 16., 14., 15., 13., 12., 4., 16., 4., 18., 17., 13., 14., 18., 3., 20., 9., 20., 13., 20., 12., 21., 12., 21., 11., 18., 1., 22., 16., 15., 2., 21., 3., 19., 7., 13., 24., 5., 26., 6., 25., 4., 26., 5., 27., 16., 7., 18., 4., 15., 2., 18., 4., 15., 4., 20., 25., 5., 27., 5., 26., 3., 30., 2., 29., 13., 7., 12., 5., 12., 4., 17., 23., 3., 25., 4., 6., 5., 22., 15., 4., 16., 19., 4., 21., 3., 21., 11., 6., 12., 25., 12., 26., 11., 22., 2., 26., 3., 30., 6., 20., 20., 30., 30., 33., 35., 31., 37., 26., 35., 33., 41., 35., 43., 36., 39., 35., 42., 39., 44., 41., 45., 36., 44., 33., 47., 33., 48., 33., 46., 32., 48., 30., 48., 20., 20., 27., 27., 28., 31., 32., 32., 32., 29., 28., 24., 31., 23., 32., 31., 35., 32., 42., 32., 43., 4., 49., 2., 49., 28., 52., 34., 47., 34., 38., 30., 39., 33., 46., 6., 38., 24., 32., 36., 35., 20., 20., 29., 29., 27., 24., 34., 27., 31., 28., 30., 24., 29., 24., 24., 25., 28., 29., 28., 28., 29., 31., 28., 39., 34., 42., 37., 47., 3., 51., 35., 46., 38., 42., 45., 3., 41., 0., 20., 20., 28., 30., 30., 28., 32., 32., 31., 34., 30., 35., 31., 41., 37., 40., 29., 47., 36., 47., 37., 45., 37., 37., 31., 33., 31., 31., 32., 35., 34., 4., 38., 25., 40., 6., 32., 30., 35., 5., 44., 30., 39., 37., 42., 39., 49., 37., 55., 31., 47., 38., 35., 38., 41., 37., 44., 25., 42., 23., 41., 34., 38., 31., 3., 31., 4., 33., 43., 3., 47., 1., 51., 1., 50., 0., 20., 20., 27., 27., 31., 29., 34., 31., 39., 6., 45., 27., 45., 29., 41., 35., 41., 35., 38., 33., 40., 35., 34., 32., 39., 42., 37., 40., 33., 40., 39., 34., 31., 33., 31., 31., 36., 38., 34., 33., 35., 41., 38., 42., 34., 35., 34., 27., 22., 24., 26., 23., 32., 25., 28., 24., 26., 28., 31., 27., 29., 25., 26., 29., 25., 3., 12., 20., 20., 30., 23., 38., 23., 34., 21., 41., 22., 41., 29., 43., 28., 42., 33., 44., 34., 43., 32., 39., 36., 43., 35., 40., 39., 38., 38., 47., 41., 48., 41., 47., 40., 47., 41., 44., 36., 37., 36., 35., 32., 30., 41., 34., 43., 38., 40., 36., 39., 35., 41., 36., 35., 4., 37., 25., 41., 6., 39., 17., 22., 17., 20., 14., 21., 11., 22., 15., 22., 13., 20., 20., 30., 22., 38., 33., 38., 37., 39., 38., 38., 45., 35., 41., 38., 37., 37., 38., 38., 39., 40., 35., 43., 34., 45., 29., 48., 28., 47., 26., 39., 33., 47., 27., 43., 29., 44., 31., 46., 28., 42., 34., 34., 38., 4., 35., 38., 34., 39., 36., 38., 39., 39., 40., 37., 43., 32., 49., 28., 53., 3., 45., 31., 37., 30., 36., 4., 30., 3., 29., 3., 28., 0., 20., 20., 28., 21., 34., 25., 37., 26., 37., 27., 38., 30., 35., 26., 42., 29., 45., 27., 43., 31., 45., 32., 39., 29., 35., 33., 31., 33., 33., 37., 31., 38., 35., 34., 31., 37., 28., 34., 29., 28., 32., 28., 1., 20., 28., 19., 28., 17., 26., 19., 26., 21., 25., 16., 25., 22., 24., 24., 24., 27., 25., 6., 26., 27., 25., 25., 18., 32., 20., 33., 21., 27., 3., 24., 20., 24., 5., 26., 22., 18., 13., 19., 5., 22., 14., 17., 13., 19., 13., 17., 7., 18., 5., 17., 11., 3., 19., 19., 14., 19., 5., 20., 20., 21., 21., 27., 29., 28., 31., 33., 32., 32., 35., 38., 42., 39., 46., 41., 43., 39., 43., 31., 42., 31., 35., 31., 36., 31., 34., 37., 34., 35., 33., 37., 34., 37., 41., 38., 35., 36., 34., 38., 35., 40., 4., 43., 3., 39., 35., 37., 2., 27., 1., 30., 2., 20., 20., 28., 21., 38., 25., 36., 30., 37., 28., 42., 26., 42., 26., 37., 27., 34., 32., 35., 33., 35., 36., 39., 37., 34., 38., 36., 37., 39., 38., 43., 39., 32., 35., 40., 31., 34., 32., 30., 26., 31., 32., 32., 33., 37., 34., 33., 33., 34., 34., 28., 30., 3., 34., 28., 27., 2., 19., 5., 24., 17., 24., 18., 25., 20., 18., 21., 18., 22., 21., 17., 21., 15., 20., 15., 26., 25., 17., 25., 18., 14., 26., 16., 26., 6., 28., 3., 23., 17., 23., 24., 20., 19., 21., 19., 18., 19., 17., 14., 16., 11., 16., 10., 15., 13., 13., 13., 19., 13., 22., 11., 23., 10., 21., 15., 22., 14., 19., 11., 19., 7., 11., 5., 7., 5., 8., 5., 10., 5., 7., 5., 10., 5., 10., 3., 10., 3., 8., 1., 10., 0., 20., 20., 22., 21., 30., 26., 32., 36., 29., 34., 31., 35., 28., 33., 29., 31., 30., 30., 26., 29., 27., 31., 26., 31., 27., 26., 27., 27., 31., 29., 31., 35., 37., 38., 20., 20., 29., 29., 27., 27., 33., 29., 36., 36., 39., 3., 33., 7., 34., 31., 44., 4., 42., 30., 40., 39., 35., 37., 39., 3., 32., 3., 20., 20., 22., 27., 28., 29., 36., 31., 39., 30., 36., 5., 42., 34., 39., 33., 35., 30., 37., 31., 38., 28., 43., 33., 36., 32., 39., 36., 48., 41., 50., 39., 45., 5., 46., 2., 40., 35., 44., 34., 44., 3., 42., 4., 44., 33., 43., 2., 36., 36., 44., 30., 41., 32., 29., 42., 1., 28., 4., 36., 19., 33., 18., 34., 2., 33., 11., 20., 20., 28., 22., 31., 29., 34., 32., 38., 30., 49., 31., 40., 32., 45., 38., 39., 30., 47., 34., 44., 31., 43., 33., 41., 34., 39., 32., 36., 37., 42., 37., 41., 43., 38., 40., 38., 39., 35., 38., 37., 40., 36., 38., 2., 38., 38., 32., 20., 20., 31., 27., 29., 28., 26., 29., 32., 31., 35., 38., 32., 38., 32., 31., 27., 37., 27., 38., 29., 39., 30., 35., 32., 33., 32., 34., 39., 37., 47., 37., 52., 41., 46., 36., 44., 42., 40., 44., 34., 44., 39., 36., 40., 37., 39., 5., 20., 20., 29., 29., 31., 33., 32., 29., 32., 33., 27., 33., 34., 32., 35., 37., 33., 34., 37., 39., 5., 31., 33., 30., 33., 30., 34., 31., 35., 4., 38., 30., 35., 29., 34., 28., 42., 30., 34., 26., 36., 26., 30., 32., 33., 2., 32., 24., 30., 30., 33., 24., 34., 22., 30., 20., 32., 22., 35., 25., 32., 28., 34., 27., 32., 27., 2., 27., 3., 12., 35., 13., 35., 9., 37., 20., 20., 29., 29., 27., 28., 28., 28., 29., 32., 38., 28., 40., 27., 45., 31., 40., 34., 42., 31., 35., 42., 37., 39., 38., 38., 42., 39., 39., 38., 42., 36., 41., 43., 34., 26., 41., 25., 43., 26., 44., 33., 39., 31., 39., 28., 38., 6., 44., 0., 20., 20., 31., 28., 29., 47., 5., 43., 20., 45., 23., 45., 32., 37., 2., 22., 34., 23., 32., 26., 31., 29., 29., 32., 30., 30., 26., 25., 4., 33., 26., 31., 30., 35., 30., 35., 4., 35., 29., 38., 35., 30., 31., 36., 32., 36., 31., 39., 19., 32., 16., 31., 16., 32., 16., 32., 17., 32., 4., 32., 15., 31., 16., 32., 14., 35., 14., 33., 13., 29., 13., 7., 19., 26., 16., 27., 12., 27., 13., 25., 4., 32., 10., 5., 13., 24., 10., 23., 15., 21., 13., 22., 6., 27., 12., 20., 20., 29., 29., 27., 33., 37., 31., 39., 31., 42., 31., 34., 29., 33., 42., 34., 38., 40., 6., 33., 6., 38., 35., 40., 38., 37., 36., 45., 35., 48., 40., 46., 43., 43., 41., 52., 5., 38., 27., 29., 21., 27., 24., 36., 3., 24., 19., 0., 20., 20., 27., 27., 33., 28., 33., 34., 8., 37., 34., 37., 35., 40., 34., 37.]; const TOL: f64 = 0.0001; const P: f64 = 0.999; let mut quantile = Quantile::new(P); let mut ckms = CKMS::new(TOL); for &o in observations.iter() { quantile.add(o); ckms.insert(o); } let q1 = quantile.quantile(); let (_, q2) = ckms.query(P).unwrap(); assert!((q1 - q2).abs() < 0.3, "{} vs. {}", q1, q2); } #[test] fn percentile_99() { const TOL: f64 = 0.0001; let mut q = Quantile::new(0.99); for _ in 0..100 { for i in 0..10 { let f = f64::from(i); q.add(f); } } assert!((q.quantile() - 9.).abs() < TOL); }