Javascript大十进制 - 第N根

时间:2013-06-27 12:16:03

标签: javascript math bigdecimal

最近我遇到了众所周知的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

2 个答案:

答案 0 :(得分:1)

牛顿方法只给出了根的近似值,因此应该预期3.0000xxx。如果你知道答案应该是一个整数,你可以将r向下舍入(Newton的方法过高估计根)并检查r^n=x

答案 1 :(得分: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));