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