9**66 != n**66,节点 11.6.0 中的 n=9

9**66 != n**66 with n=9 in Node 11.6.0

提问人:Arnauld 提问时间:12/23/2020 最后编辑:Arnauld 更新时间:12/24/2020 访问量:180

问:

在寻找 Code Golf 挑战答案中使用的一些黑魔法时,我注意到 Node 11.6.0 中的以下行为:

// 1) exact result with BigInts
console.log(9n ** 66n);         // 95500495(...)3841n
console.log(9n ** 66n % 79n);   // 21n

// 2) approximation with a Number literal
console.log(9 ** 66);           // 9.550049507968253e+62
console.log(9 ** 66 % 79);      // 71

// 3) approximation with a variable
let n = 9;
console.log(n ** 66);           // 9.550049507968251e+62
console.log(n ** 66 % 79);      // 69

从本质上讲,with 不会导致与 相同的结果,这是我以前从未经历过的事情,尽管我在 Code Golf 上做了很多类似的奇怪事情。n ** 66n = 99 ** 66

您可以在 Try it online!服务,在发布时安装了 Node v11.6.0。

我当前的本地 Node 版本是 12.13.1,在这两种情况下都一致给出。71

这是 Node 11.6.0 的已知问题吗?其他 Node 版本和/或其他 JS 引擎的行为方式是否相同?


补遗

下面是一个更简单的例子:9 ** 17

console.log(9n ** 17n); // 16677181699666569n
console.log(9 ** 17);   // 16677181699666570
let n = 9;
console.log(n ** 17);   // 16677181699666568
节点 .js 精度

评论

3赞 t348575 12/24/2020
刚刚在节点 14.11.0 和数字文字上运行它并返回相同的值n = 9
0赞 Silviu Burcea 12/24/2020
奇数 Node.js 版本大多是开发版本,并充当下一个偶数版本的测试版,这些版本实际上受到支持。顺便说一句,我尝试了 9 ** 66 并让 n = 9;n ** 66 并返回相同的值,甚至模数 79。
0赞 Arnauld 12/24/2020
@SilviuBurcea 没错。知道 Node 10.x 是否在做同样的事情会很有趣。

答: 暂无答案