有趣的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。