首页 > 解决方案 > 以二进制实现任意精度算术(例如 JavaScript 中的 BigInt)是否有原因?

问题描述

这个问题来看,Google Chrome 和 Node.js 似乎都选择在 binary 中实现任意精度算法。有充分的理由这样做吗?

如果我们可以加减乘除,然后做 7 + 8 = 15 并进位到下一位,这比逐位做要快,7 + 8 需要将两位相加 4 次。

标签: v8bigintarbitrary-precision

解决方案


V8 开发人员在这里。二进制是一个不错的选择,因为硬件是二进制的 [*]。这并不意味着操作一次发生一点。在 V8 中,BigInt 的“数字”是uintptr_t值,即寄存器大小(在 32 位机器上为 32 位,在 64 位机器上为 64 位)无符号整数。请参阅我们的博客文章以获取概述,以及所有血腥细节的来源。FWIW,许多其他实现(例如 GMP、OpenJDK、Go、Dart)都做出了相同的基本选择。

[*] 一些硬件架构具有“二进制编码的十进制”算术指令,这与您所描述的类似,但这种方法 (1) 通常被认为效率较低,并且 (2) 并非在我们想要的所有架构上都可用V8 运行。


推荐阅读