我正在寻找一个使用C或C ++编写的良好的任意精度数学库。您能给我一些建议吗?
主要要求:
它必须处理任意大的整数-我的主要兴趣是整数。如果您不知道任意大这个词的含义,请想象一下类似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以及其他一些语言的核心库:我使用了其中一些,但不知道它们使用的是哪个库,或者他们正在使用哪种实现。
我已经知道的:
使用
char
十进制数字和char*
十进制字符串,做用数字计算for
-loop。使用
int
(或long int
或long long
)作为基本的“单位”,并使用该类型的数组作为任意长整数,并使用for
-loop对元素进行计算。使用整数类型将十进制数字(或几位数)存储为BCD(二进制编码的十进制)。
我不知道的是:
- 不使用天真的方法,将上述二进制数组以十进制打印。天真的方法的一个示例:(1)从最低到最高的位相加:
char*
1、2、4、8、16、32 ,……(2)使用上面提到的-string来存储中间十进制结果)。
我的赞赏:
关于我应该阅读的书籍和文章的好的建议。例如,用数字说明非原始的二进制到十进制转换算法是如何工作的将是很好的。道格拉斯·W·琼斯(Douglas W. Jones)的文章“有限精度的二进制到十进制转换”是一个很好的例子。
任何帮助一般。
如果您认为使用(或或)可以轻松解决此问题,请不要回答此问题。如果您这样认为,则您将不理解所涉及的问题。double
long double
long long double