This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.

Fillano's Learning Notes 會員登入 會員註冊

« 上一篇 | 下一篇 »

剛剛在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。

  1. Re: 有趣的partial reduce演算法 [回覆]

     大脚是一款向搜索引擎排名世界玩家提供便利的插件,魔兽大脚完全使用暴雪官方Google排名 提供的用户接口第三方钢结构开发,即桥梁钢结构提供的辅助功能在当前火车站钢结构下完全被认可。

    fefe 回應於 08 元月, 2010 13:25

發表回應

 暱稱 (必填)

 標題

 個人網頁

 電子郵件

authimage 
 認證碼 (必填)