lib/protoparser/datadogsketches: use math.RoundToEven() for calculating the rank

The original code uses this function - see 48d52eeea6/pkg/quantile/sparse.go (L138)

Updates https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5775
This commit is contained in:
Aliaksandr Valialkin 2024-02-07 21:43:24 +02:00
parent 093798375e
commit bf9ea249a3
No known key found for this signature in database
GPG key ID: 52C003EE2BCDB9EB
2 changed files with 11 additions and 9 deletions

View file

@ -303,7 +303,7 @@ func (d *Dogsketch) quantile(q float64) float64 {
return 0 return 0
} }
rank := q * float64(d.Cnt-1) rank := math.RoundToEven(q * float64(d.Cnt-1))
cnt := float64(0) cnt := float64(0)
for i, n := range ns { for i, n := range ns {
cnt += float64(n) cnt += float64(n)

View file

@ -9,21 +9,23 @@ func TestDogsketchQuantile(t *testing.T) {
f := func(d *Dogsketch, q float64, vExpected float64) { f := func(d *Dogsketch, q float64, vExpected float64) {
t.Helper() t.Helper()
v := d.quantile(q) v := d.quantile(q)
if math.Abs(v-vExpected) > 0.4 { if math.Abs(v-vExpected) > 0.01 {
t.Fatalf("unexpected value; got %v; want %v", v, vExpected) t.Fatalf("unexpected value; got %v; want %v", v, vExpected)
} }
} }
sketches := &Dogsketch{ sketches := &Dogsketch{
Min: 8.0, Min: 8.0,
Max: 20.0, Max: 21.0,
Cnt: 17, Cnt: 17,
N: []uint32{0x0, 0x0, 0x1, 0x0, 0x1, 0x4, 0x6, 0x1, 0x2, 0x0, 0x1, 0x0, 0x1}, N: []uint32{0x0, 0x0, 0x1, 0x0, 0x1, 0x4, 0x6, 0x1, 0x2, 0x0, 0x1, 0x0, 0x1},
K: []int32{0, 1472, 1473, 1479, 1480, 1503, 1504, 1512, 1513, 1514, 1515, 1531, 1532}, K: []int32{0, 1472, 1473, 1479, 1480, 1503, 1504, 1512, 1513, 1514, 1515, 1531, 1532},
} }
f(sketches, 0.1, 8.96) f(sketches, 0, 8)
f(sketches, 0.5, 13.01) f(sketches, 0.1, 12.91)
f(sketches, 0.75, 14.96) f(sketches, 0.5, 13.18)
f(sketches, 0.9, 14.96) f(sketches, 0.75, 14.84)
f(sketches, 0.95, 15.43) f(sketches, 0.9, 15.19)
f(sketches, 0.99, 15.43) f(sketches, 0.95, 15.55)
f(sketches, 0.99, 20.24)
f(sketches, 1, 21)
} }