4

最近、よく知られた Javascript の浮動小数点精度エラーに遭遇しました。通常、シン クライアントでの浮動小数点計算は避け、バックエンドに任せます。

Michael Mclaughlin によって作成されたbig.jsライブラリを使い始めました。平方根メソッド/関数はありますが、n 乗根メソッド/関数はなく、累乗関数は引数として分数値をサポートしていません。

そのため、ライブラリを使用している人がそのような機能を持つように拡張したのか、少なくともそれを使用して正確な n 乗根の結果を計算したのか疑問に思っていました。

Michael Mclaughlinは、平方根関数と構造が似ているような関数を実装することを提案しました。しかし、論理を理解しようとする私の試みは、私の数学障害を証明し、単純な計算が非常に間違った結果をもたらしました。

Rosetta Codeでアルゴリズムを使用すると、正しくない結果が得られます。

そのため、ライブラリを使用している人がそのような機能を持つように拡張したのか、少なくともそれを使用して正確な n 乗根の結果を計算したのか疑問に思っていました。

これが私の最後の試みのコードです:

P['nthrt'] = P['nthroot'] = function (n, prec)
{
    var negate, r,
        x = this,
        xc = x['c'],
        i = x['s'],
        e = x['e'];

    // Argument defaults
    n = n || 2;
    prec = prec || 12;

    // Zero?
    if ( !xc[0] ) {
        return new Big(x)
    }

    // Negative?
    negate = ( n % 2 == 1 && i < 0 );

    // Estimate.
    r = new Big(1); // Initial guess.

    for (var i = 0; i < prec; i++) {
        r = (ONE.div(n)).times(r.times(n-1).plus(x.div(r.pow(n-1))));
    }

    if (negate) r['s'] = -1;

    return r;
};

81 = 3 の 4 乗根のように、明らかな正しい結果が得られず、代わりに 3.00000000xxx が得られます。

4

3 に答える 3

1

ニュートン法では根の概算しか得られないため、3.0000xxx が予想されます。答えが整数でなければならないことがわかっている場合は、r切り捨てて (ニュートン法は根を過大評価します)、それを確認できr^n=xます。

于 2013-06-28T15:03:43.307 に答える
0

Basenumber.jsを使用してnth rootを実行できます。ドキュメンテーションはこちら

例えば

// Set precision decimals required
Base.setDecimals(25);

let x = Base("1e+10");

console.log(x.root(10).toString());
<script src='https://cdn.jsdelivr.net/gh/AlexSp3/Basenumber.js@main/BaseNumber.min.js'></script>

于 2021-09-09T01:40:00.540 に答える