Closed. This question is
off-topic。它当前不接受答案。
想改善这个问题吗?
Update the question,所以它是
on-topic,用于堆栈溢出。
4年前关闭。
我正在寻找一个使用C或C ++编写的良好的任意精度数学库。您能给我一些建议吗?
主要要求:
它必须处理任意大整数(我的主要兴趣是整数)。如果您不知道任意大这个词的含义,请想象一下类似100000的东西! (阶乘为100000)。
在库初始化/对象创建期间,不必指定精度。精度应仅受系统可用资源的限制。
它应该利用平台的全部功能,并且应该本地处理“小”数字。这意味着在64位平台上,计算2 ^ 33 + 2 ^ 32应该使用可用的64位CPU指令。库不应以与在同一平台上2 ^ 66 + 2 ^ 65相同的方式来计算该值。
它必须处理加法(+),减法(-),乘法(*),整数除法(/),余数(%),幂(**),增量(++),减量(-),gcd() ,factorial()和其他常见的整数算术计算。能够处理不会产生整数结果的函数,例如sqrt()(平方根),log()(对数),是一个加号。处理
symbolic computations的能力甚至更好。
这是我到目前为止发现的:
Java的
BigInteger和
BigDecimal类:到目前为止,我一直在使用它们。我已经阅读了源代码,但是我不理解下面的数学原理。它可能基于我从未学过的理论/算法。
内置整数类型或
bc /
Python / Ruby / Haskell / Lisp / Erlang / OCaml / PHP /其他语言的核心库:我曾经用过其中一些,但是我不知道该使用哪种语言他们正在使用的库,或者他们正在使用哪种实现。
我已经知道的:
使用char作为十进制数字,并使用char *作为十进制字符串,并使用for循环对这些数字进行计算。
使用int(或long int或long long)作为基本的“单位”,并将其数组作为任意长整数,并使用for循环对元素进行计算。
使用整数类型将小数位数(或几位数)存储为<aa>。
BCD (Binary-coded decimal)我不知道的是:
不使用天真的方法,将上述二进制数组以十进制打印。天真的方法的示例:(1)从最低到最高的位相加:1、2、4、8、16、32,...(2)使用上面提到的char *字符串存储中间十进制结果)。
我的赞赏:
在
Booth's multiplication algorithm,
GMP,
MPFR(或您认为不错的其他库)上进行了很好的比较。
关于我应该阅读的书籍/文章的好的建议。例如,用数字说明非原始的二进制到十进制转换算法是如何工作的很好。道格拉斯·W·琼斯(Douglas W. Jones)的文章
decNumber是一个很好的文章的例子。
任何帮助。
如果出现以下情况,请不要回答此问题:
您认为使用双精度(或长双精度或长双精度双精度)可以轻松解决此问题。如果您这样认为,则意味着您不了解所讨论的问题。