From 91db81f3745c4ef33c02cc3565ebb7626be97089 Mon Sep 17 00:00:00 2001 From: ben hockey Date: Wed, 22 Apr 2015 11:35:45 -0500 Subject: [PATCH] calculate mean without causing overflow --- influxql/functions.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/influxql/functions.go b/influxql/functions.go index 22949df55e..3ae5caba32 100644 --- a/influxql/functions.go +++ b/influxql/functions.go @@ -211,29 +211,31 @@ func MapMean(itr Iterator) interface{} { for _, k, v := itr.Next(); k != 0; _, k, v = itr.Next() { out.Count++ - out.Sum += v.(float64) + out.Mean += (v.(float64) - out.Mean) / float64(out.Count) } return out } type meanMapOutput struct { Count int - Sum float64 + Mean float64 } // ReduceMean computes the mean of values for each key. func ReduceMean(values []interface{}) interface{} { out := &meanMapOutput{} + var countSum int for _, v := range values { if v == nil { continue } val := v.(*meanMapOutput) - out.Count += val.Count - out.Sum += val.Sum + countSum = out.Count + val.Count + out.Mean = val.Mean*(float64(val.Count)/float64(countSum)) + out.Mean*(float64(out.Count)/float64(countSum)) + out.Count = countSum } if out.Count > 0 { - return out.Sum / float64(out.Count) + return out.Mean } return nil }