有趣的partial reduce演算法
Wed, 11 Mar 2009 11:20:21 +0800
剛剛在yui blog上,看到Crockford發表的文章,討論如何用partial reduce的方法,來避免一些IEEE 754影響計算精確的問題:
When You Can’t Count On Your Numbers
不過直接拿Crockford的程式來跑,發現似乎有一點問題,所以做了一點修改:
var partial_reduce = function (array, func) { var i, result = [], x = array.length - 1; if (x >= 1) { for (i = 0; i < x; i += 2) { result.push(func(array[i], array[i + 1])); } } if (i === x) { result.push(array[i]); } return result; }; var add = function (a, b) { return a + b; }; var totalizer = function (array) { var result = array; while (result.length>1) { result = partial_reduce(result, add); } return result; }; var test = []; for(var i=0; i<10000; i++) { if(i<5000) { test[i] = 0.01; } else { test[i] = 0.02; } } alert(totalizer(test)); var x = 0; for(var i=0; i<10000; i++) { if(i<5000) { x += 0.01; } else { x += 0.02; } } alert(x);(我改了Crockford程式碼中,partial_reduce函數裡面的if(x<1)條件,改成了if(x>=1);另外totalizer裡面的while條件,從Array.isArray(result)改成result.length>1)
用partial reduce的方法做,結果是:150;直接累加的話,結果是:149.99999999999932。