mirror of https://github.com/prometheus/prometheus
c46074f4dd
The basic idea here is that the previous code was always doing incremental calculation of the mean value, which is more costly and can be less precise. It protects against overflows, but in most cases, an overflow doesn't happen anyway. The other idea applied here is to expand on #14074, where Kahan summation was applied to sum(). With this commit, the average is calculated in a conventional way (adding everything up and divide in the end) as long as the sum isn't overflowing float64. This is combined with Kahan summation so that the avg aggregation, in most cases, is really equivalent to the sum aggregation with a following division (which is the user's expectation as avg is supposed to be syntactic sugar for sum with a following divison). If the sum hits ±Inf, the calculation reverts to incremental calculation of the mean value. Kahan summation is also applied here, although it cannot fully compensate for the numerical errors introduced by the incremental mean calculation. (The tests added in this commit would fail if incremental mean calculation was always used.) Signed-off-by: beorn7 <beorn@grafana.com> |
||
---|---|---|
.. | ||
aggregators.test | ||
at_modifier.test | ||
collision.test | ||
functions.test | ||
histograms.test | ||
limit.test | ||
literals.test | ||
native_histograms.test | ||
operators.test | ||
range_queries.test | ||
selectors.test | ||
staleness.test | ||
subquery.test | ||
trig_functions.test |