4

最近我遇到了众所周知的 Javascript 浮点精度错误。通常我会避免在瘦客户端上进行浮点计算,而是将其留给后端。

我开始使用由 Michael Mclaughlin 创建的big.js库。尽管它具有平方根方法/函数,但它没有 nth 根方法/函数,幂函数也不支持小数值作为参数。

所以我想知道是否有人使用该库已将其扩展为具有这样的功能,或者至少使用它来计算准确的 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 = 3 的第四根那样得到明显的正确结果,而是得到 3.00000000xxx

4

3 回答 3

1

牛顿法只给出了根的近似值,所以应该是 3.0000xxx。如果您知道答案应该是整数,则可以向下舍r入(牛顿法高估根)并检查r^n=x.

于 2013-06-28T15:03:43.307 回答
0

您可以使用大数字库来解决您的问题。它们支持 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));
于 2018-07-23T09:29:29.320 回答
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 回答