【发布时间】:2019-02-02 16:46:52
【问题描述】:
任意精度的有符号整数几乎总是使用符号幅度表示来实现:
- (Java) BigInteger 在 OpenJDK 中
- (Python)Bigint CPython 中 Python 内置 int 类型的实现
- (C) mpz_t 在 GMP 中,GNU 多精度算术库
- (C++)BigInteger 在一个 bigint 库中,作者:Matt McCutchen
- (Rust)BigInt 在 num-bigint 库中
对符号大小的明显偏好与固定宽度有符号整数类型中对二进制补码的近乎普遍偏好形成对比。问题是,为什么 BigIntegers 如此明显首选符号幅度?(如果您不同意这个前提,我欢迎反例。)
请注意,BigInteger API 通常为重要的按位运算指定“如同二进制补码”语义(例如Java、Python)。这提供了与这些操作的通常含义的一致性。这并不规定实际的内部表示(仅是一个实现细节),但如果其他所有条件都相同,它应该是支持在内部使用二进制补码的一点。
浮点数使用符号大小,与使用二进制补码的整数不同。不过,浮点在这里并不是真正的指导性先例,因为浮点运算的行为和算法与整数运算有很大不同。 Bignums 更像整数而不是浮点数。
我们知道为什么二进制补码在数学上起作用以及为什么它具有优势的“教科书”原因。在我看来,这些原因同样适用于整数和 BigInteger。这在多大程度上是真的?
当然,硬件固定精度整数和软件任意精度整数的设计约束之间存在巨大差异。从这个意义上说,看到设计师在这些不同的领域做出不同的权衡也就不足为奇了。那么,当应用于任意精度整数时,符号大小和二进制补码之间的权衡是什么?例如,这可能与某些重要算法的性能或简单性有关。
我希望您的回答能够阐明 BigInteger 算术的设计注意事项,并帮助我从新的角度重新审视我对二进制补码的了解。
(要清楚:当我说任意精度整数的二进制补码时,我的意思是使用单词数组的表示,其位模式放在一起时,是所需数字的二进制补码表示 - 也许附加要求没有“不必要的前导 0”(对于非负数)或“不必要的前导 1”(对于负数)。)
【问题讨论】:
-
我修复了 Python 的链接;您指向的链接指向浮点到字符串和字符串到浮点转换使用的专业且有些受限的 bigint 实现,与 Python 的
int类型无关。
标签: math data-structures binary biginteger arbitrary-precision