diff --git a/executor.go b/executor.go index ae63759f8..15d6fb571 100644 --- a/executor.go +++ b/executor.go @@ -1295,7 +1295,10 @@ func (e *executor) executePercentile(ctx context.Context, qcx *Qcx, index string min, max := minVal.Val, maxVal.Val // estimate nth val, eg median when nth=0.5 for min < max { - possibleNthVal := (max + min) / 2 + // compute average without integer overflow, then correct for division of + // odd numbers by 2 + possibleNthVal := ((max / 2) + (min / 2)) + (((max % 2) + (min % 2)) / 2) + // possibleNthVal = (max + min) / 2 // get left count rangeCall.Args[fieldName] = &pql.Condition{ Op: pql.Token(pql.LT), diff --git a/executor_test.go b/executor_test.go index 2b37c36b2..9427914b2 100644 --- a/executor_test.go +++ b/executor_test.go @@ -6939,7 +6939,7 @@ func variousQueriesOnPercentiles(t *testing.T, c *test.Cluster) { possibleNthVal := int64(0) // bin search for min < max { - possibleNthVal = (max + min) / 2 + possibleNthVal = ((max / 2) + (min / 2)) + (((max % 2) + (min % 2)) / 2) leftCount, rightCount := int64(0), int64(0) for _, num := range nums { if num < possibleNthVal {