JavaScript 大数 - Nth 根

4
最近我遇到了Javascript的著名浮点精度错误。通常情况下,我会避免在薄客户端上进行浮点计算,并将其留给后端。
我开始使用Michael Mclaughlin创建的big.js库。虽然它有一个平方根方法/函数,但它没有一个nth-root方法/函数,也不支持分数值作为参数的幂函数。
所以我想知道是否有人使用该库扩展了这样的函数或至少使用它来计算准确的nth-root结果。 Michael Mclaughlin建议我实现类似于平方根函数结构的函数。然而,我的尝试理解逻辑证明了我的数学残疾,导致简单的计算产生非常错误的结果。
Rosetta Code上使用的算法也会产生不正确的结果。
所以我想知道是否有人使用该库扩展了这样的函数或至少使用它来计算准确的nth-root结果。

这是我最后一次尝试的代码:

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的4次方根=3,而是得到3.00000000xxx。

Rosetta Code使用牛顿法来找到x^n-num的根(我可能会挑剔它对precision的使用)。您能展示一下产生错误结果的代码吗? - Teepeemm
已添加此功能,感谢您的关注。 - NeilC
3个回答

1
牛顿法仅给出根的近似值,因此应该期望得到3.0000xxx。如果您知道答案应该是整数,可以向下舍入r(牛顿法会高估根),并检查r^n=x是否成立。

0
你可以使用big-numbers库来解决你的问题。它们支持sqrt、pow、exp等许多功能。pow方法接受正数、负数、整数和浮点数:
var bn = new BigNumber();
var value = bn.of('81');

var xRoot = value.pow(0.25);
console.log('Result: ' + bn.format(xRoot));

0

你可以使用Basenumber.js来执行n次方根计算。相关文档请参见此处

例如:

// 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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接