JavaScript 大整数平方根

dan*_*y74 9 javascript bigint node.js

这涉及 Chrome 和 Node v10.4 支持的新 JavaScript BigInt 类型

以下两行都抛出错误:

Math.sqrt(9n)
Math.sqrt(BigInt(9))
Run Code Online (Sandbox Code Playgroud)

错误是:

无法将 BigInt 值转换为数字

如何在 JavaScript 中获得 BigInt 的平方根?TIA

Ant*_*ton 11

从这里:https : //golb.hplar.ch/2018/09/javascript-bigint.html

function sqrt(value) {
    if (value < 0n) {
        throw 'square root of negative numbers is not supported'
    }

    if (value < 2n) {
        return value;
    }

    function newtonIteration(n, x0) {
        const x1 = ((n / x0) + x0) >> 1n;
        if (x0 === x1 || x0 === (x1 - 1n)) {
            return x0;
        }
        return newtonIteration(n, x1);
    }

    return newtonIteration(value, 1n);
}

sqrt(BigInt(9))
Run Code Online (Sandbox Code Playgroud)

  • 对于初始猜测(“1n”被传递给“newtonIteration”的第一次调用),最好使用“const Guess = 1n + (sqrt(value &gt;&gt; BigInt(Math.floor(bitLength(value) / 2)”) ))) &lt;&lt; BigInt(Math.floor(bitLength(value) / 4)));`,其中 `bitLength` 定义为 `function bitLength(n) { return n.toString(16).length * 4; }`。这可以使非常大的整数的速度更快。 (2认同)
  • 仅供参考,传入“4n”似乎会给出“1n”,而不是预期的“2n”。似乎是迭代偏差造成了这种情况,即“x0 === (x1 - 1n)”。这似乎是唯一的错误情况;因此也许为其提供一个额外的特殊情况就足够了。 (2认同)