For floating point numbers of about equal value, this is a numerically
more stable way of summing them up.

Signed-off-by: Klaus Aehlig <[email protected]>
---
 src/Ganeti/Utils.hs | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/Ganeti/Utils.hs b/src/Ganeti/Utils.hs
index 46cfc67..8db0c71 100644
--- a/src/Ganeti/Utils.hs
+++ b/src/Ganeti/Utils.hs
@@ -45,6 +45,7 @@ module Ganeti.Utils
   , commaJoin
   , ensureQuoted
   , divideList
+  , balancedSum
   , tryRead
   , readMaybe
   , formatTable
@@ -218,6 +219,15 @@ divideList (a:b:xs) = let (ls, rs) = divideList xs in 
(a:ls, b:rs)
 
 -- * Mathematical functions
 
+-- | Compute the sum of a list of numbers, all about the same value,
+-- and do so in a balanced way to avoid adding numbers of too different
+-- values (and thus too bad inaccuracies).
+balancedSum :: Num a => [a] -> a
+balancedSum [] = 0
+balancedSum [x] = x
+balancedSum xs = let (ls, rs) = divideList xs
+                 in balancedSum ls + balancedSum rs
+
 -- Simple and slow statistical functions, please replace with better
 -- versions
 
-- 
2.6.0.rc2.230.g3dd15c0

Reply via email to