Fix error calculation for tests.
Change sample generation to rand.NormFloat64 to expose previous problem.
diff --git a/quantile/stream_test.go b/quantile/stream_test.go
index 24f2eaa..1b1b4ed 100644
--- a/quantile/stream_test.go
+++ b/quantile/stream_test.go
@@ -1,7 +1,6 @@
package quantile
import (
- "math"
"math/rand"
"sort"
"testing"
@@ -12,26 +11,23 @@
a := make([]float64, 0, 1e5)
rand.Seed(42)
for i := 0; i < cap(a); i++ {
- v := float64(rand.Int63())
+ v := rand.NormFloat64()
s.Insert(v)
a = append(a, v)
}
t.Logf("len: %d", s.Count())
sort.Float64s(a)
- w := getPerc(a, 0.50)
- if g := s.Query(0.50); math.Abs(w-g)/w > 0.03 {
- t.Errorf("perc50: want %v, got %v", w, g)
- t.Logf("e: %f", math.Abs(w-g)/w)
+ w, min, max := getPerc(a, 0.50)
+ if g := s.Query(0.50); g < min || g > max {
+ t.Errorf("perc50: want %v [%f,%f], got %v", w, min, max, g)
}
- w = getPerc(a, 0.90)
- if g := s.Query(0.90); math.Abs(w-g)/w > 0.03 {
- t.Errorf("perc90: want %v, got %v", w, g)
- t.Logf("e: %f", math.Abs(w-g)/w)
+ w, min, max = getPerc(a, 0.90)
+ if g := s.Query(0.90); g < min || g > max {
+ t.Errorf("perc90: want %v [%f,%f], got %v", w, min, max, g)
}
- w = getPerc(a, 0.99)
- if g := s.Query(0.99); math.Abs(w-g)/w > 0.03 {
- t.Errorf("perc99: want %v, got %v", w, g)
- t.Logf("e: %f", math.Abs(w-g)/w)
+ w, min, max = getPerc(a, 0.99)
+ if g := s.Query(0.99); g < min || g > max {
+ t.Errorf("perc99: want %v [%f,%f], got %v", w, min, max, g)
}
}
@@ -51,7 +47,7 @@
rand.Seed(42)
a := make([]float64, 0, 1e6)
for i := 0; i < cap(a); i++ {
- v := float64(rand.Int63())
+ v := rand.NormFloat64()
a = append(a, v)
ch <- v
}
@@ -63,20 +59,17 @@
t.Logf("len: %d", s.Count())
sort.Float64s(a)
- w := getPerc(a, 0.50)
- if g := s.Query(0.50); math.Abs(w-g)/w > 0.03 {
- t.Errorf("perc50: want %v, got %v", w, g)
- t.Logf("e: %f", math.Abs(w-g)/w)
+ w, min, max := getPerc(a, 0.50)
+ if g := s.Query(0.50); g < min || g > max {
+ t.Errorf("perc50: want %v [%f,%f], got %v", w, min, max, g)
}
- w = getPerc(a, 0.90)
- if g := s.Query(0.90); math.Abs(w-g)/w > 0.03 {
- t.Errorf("perc90: want %v, got %v", w, g)
- t.Logf("e: %f", math.Abs(w-g)/w)
+ w, min, max = getPerc(a, 0.90)
+ if g := s.Query(0.90); g < min || g > max {
+ t.Errorf("perc90: want %v [%f,%f], got %v", w, min, max, g)
}
- w = getPerc(a, 0.99)
- if g := s.Query(0.99); math.Abs(w-g)/w > 0.03 {
- t.Errorf("perc99: want %v, got %v", w, g)
- t.Logf("e: %f", math.Abs(w-g)/w)
+ w, min, max = getPerc(a, 0.99)
+ if g := s.Query(0.99); g < min || g > max {
+ t.Errorf("perc99: want %v [%f,%f], got %v", w, min, max, g)
}
}
@@ -122,7 +115,15 @@
}
}
-func getPerc(x []float64, p float64) float64 {
+func getPerc(x []float64, p float64) (want, min, max float64) {
k := int(float64(len(x)) * p)
- return x[k]
+ lower := int(float64(len(x)) * (p - 0.04))
+ if lower < 0 {
+ lower = 0
+ }
+ upper := int(float64(len(x))*(p+0.04)) + 1
+ if upper >= len(x) {
+ upper = len(x) - 1
+ }
+ return x[k], x[lower], x[upper]
}