1

それは非常に近いですが、わずか 1 桁違います。ここで何かを変更して改善できる場合は、感謝します。近いかどうかを確認するために、自分の番号を と比較していMath.Eます。

var e = (function() {
    var factorial = function(n) {
        var a = 1;
        for (var i = 1; i <= n; i++) {
            a = a * i;
        }
        return a;

    };
    for (var k = 0, b = []; k < 18; k++) {
        b.push(b.length ? b[k - 1] + 1 / factorial(k) : 1 / factorial(k));
    }
    return b[b.length - 1];
})();
document.write(e);document.write('<br />'+ Math.E);​

私の番号: 2.7182818284590455
Math.E: 2.718281828459045

4

4 に答える 4

2

キャンセルを最小限に抑えるために、大きい数値から小さい数値へと作業します。

var e = 1;
for(var k = 17; k > 0; --k) {
    e = 1 + e/k;
}
return e;

ホーナーの法則によってテイラー多項式を評価すると、階乗を回避し、より多くの項を使用できるようになります (ただし、17 を超えると違いはありません)。

于 2012-06-07T15:03:21.563 に答える
1

私が見る限り、あなたの数値は と同じでMath.E、さらに精度が高くなっています。

2.7182818284590455

2.718281828459045

結局何が問題なの?

于 2012-06-07T14:55:41.243 に答える
1

JavaScript では、JavaScript の計算精度のレベルにより、この方法でeを計算することはできません。詳細については、 http://www.javascripter.net/faq/accuracy.htmを参照してください。

この問題を実証するために、50000000 から始まる n を使用して e を計算する次のフィドルを見てください。n は 10 ミリ秒ごとに 1 ずつ増加します。

http://jsfiddle.net/q8xRs/1/

于 2012-06-07T17:34:14.460 に答える
0

整数値を使用して実際の値を近似するのが好きです。
精度の高い順に e を近似すると、次のよう に
なり ます 。


最後の値はかなり正確で、 2.7182818284590452213260834432 に相当し、18 日までウィキペディアの値から 逸脱 していません:
2.71828182845904523536028747135266249775724709369995

それで、興味があれば、それがあります。

于 2012-06-11T12:50:53.320 に答える