主要要求:
它必须能够处理任意大的整数——我的主要兴趣在于整数。如果您不知道“任意大”这个词是什么意思,可以想象一下100000!(100000的阶乘)。
精度不需要在库初始化或对象创建时指定。精度应该只受系统可用资源的限制。
它应该充分利用平台的全部功能,并且应该本地处理“小”数字。这意味着在64位平台上,计算(2 ^ 33 + 2 ^ 32)应该使用可用的64位CPU指令。库不应该像在同一平台上计算(2 ^ 66 + 2 ^ 65)那样计算它。
它必须高效地处理加法(+)、减法(-)、乘法(*)、整数除法(/)、余数(%)、幂(**)、递增(++)、递减(--)、GCD、阶乘和其他常见的整数算术运算。能够处理不产生整数结果的平方根和对数等函数的能力是一个加分项。能够处理符号计算更好。
Java中的BigInteger和BigDecimal类:我一直在使用它们。我读过源代码,但我不理解其背后的数学知识。它可能基于我从未学过的理论和算法。
bc、Python、Ruby、Haskell、Lisp、Erlang、OCaml、PHP等其他语言中的内置整数类型或核心库:我曾经使用过其中一些,但我不知道它们使用的是哪个库,或者它们使用的是哪种实现方式。
1. 使用`char`表示十进制数字,使用`char*`表示十进制字符串,在数字上使用`for`循环进行计算。 2. 使用`int`(或`long int`、`long long`)作为基本的“单位”,并将该类型的数组作为任意长的整数,通过`for`循环对元素进行计算。 3. 使用整数类型存储十进制数字(或几个数字),例如BCD(二进制编码十进制)。 4. Booth乘法算法。
我不知道的内容:
将上述二进制数组以不使用朴素方法的方式转换为十进制。朴素方法的一个例子:(1) 从低位到高位添加位数:1、2、4、8、16、32等;(2) 使用上面提到的
char*
字符串来存储中间的十进制结果。我欣赏的是:
建议我应该阅读哪些书籍和文章。例如,有图示的关于一个非幼稚的二进制到十进制转换算法如何工作的文章会很好。Douglas W. Jones 的文章“Binary to Decimal Conversion in Limited Precision”是一篇好文章的例子。
一般性帮助。
double
(或long double
,或long long double
)可以轻松解决此问题。如果您这样认为,那么您不理解所涉及的问题。