最好的跨平台(便携式)任意精度math库
我在C或C ++中寻找一个好的任意精度的math库。 你能给我一些build议吗?
主要要求:
- 它必须处理任意大的整数(我的主要兴趣在于整数)。 万一你不知道这个字是什么意思的话,想象一下就是100000! (100000的阶乘)。
- 在库初始化/对象创build期间, 不应该指定精度。 精度只能受系统可用资源的限制。
- 它应该利用平台的全部力量,并且应该在本地处理“小”号码。 这意味着在64位平台上,计算2 ^ 33 + 2 ^ 32应该使用可用的64位CPU指令。 图书馆不应该在相同的平台上以与2 ^ 66 + 2 ^ 65相同的方式来计算。
- (+),减法( – ),乘法(*),整数除法(/),余数(%),功率(**),增量(++),递减( – ),gcd() ,阶乘()和其他常用整数算术运算。 能够处理像sqrt()(平方根),log()(对数)等不会产生整数结果的函数是一个优点。 处理符号计算的能力甚至更好。
这是我到目前为止发现的:
- Java的BigInteger和BigDecimal类:我一直在使用这些。 我已经阅读了源代码,但我不明白下面的math。 它可能基于我从未学过的理论/algorithm。
- 内置的整数types或在bc / Python / Ruby / Haskell / Lisp / Erlang / OCaml / PHP /其他语言的核心库中:我曾经使用过其中的一些,但我不知道它们使用的是哪个库或者他们正在使用哪种types的实现。
我已经知道:
- 使用char作为十进制数字, char *作为十进制string,并使用for循环对数字进行计算。
- 使用int (或long long或long long )作为基本“单位”,并将其数组作为任意长整数,并使用for循环对元素进行计算。
- 使用整数types将十进制数(或几位数)存储为BCD(二进制编码的十进制数) 。
- 展位的乘法algorithm
我不知道的是:
- 用十进制打印上面提到的二进制数组,而不使用天真的方法。 天真的方法示例:(1)添加从最低位到最高位:1,2,4,8,16,32,…(2)使用上面提到的char *string来存储中间小数结果)。
我欣赏:
- 在GMP , MPFR , decNumber (或您认为是好的其他图书馆)上进行比较。
- 对我应该阅读的书籍/文章有很好的build议。 例如,有关如何从非天真的二进制转换到十进制转换algorithm的图例很好。 Douglas W. Jones的文章“Binary to Decimal Conversion in Limited Precision”是一篇很好的文章的例子。
- 任何帮助。
请不要回答这个问题,如果:
- 你认为使用双 (或长双 ,或长长双 )可以很容易地解决这个问题。 如果你这样想,那就意味着你不理解正在讨论的问题。
GMP是stream行的select。 Squeak Smalltalk有一个很好的库,但是它是用Smalltalk编写的。
你要求有关的书籍或文章。 高尚的部分是长分区。 我推荐Per Brinch Hansen的论文“重新考虑多次重复的部分:地雷之旅” 。
总的来说,他最快的通用任意精度库是GMP 。 如果您想使用浮点值,请查看MPFR库。 MPFR基于GMP。
关于其他语言的本地任意精度支持,由于许可证,代码大小和代码可移植性原因,Python使用自己的实现。 GMPY模块允许Python访问GMP库。
casevh
我自己并没有比较任意的精确算术库,但似乎确实有一个统一的GMP的人。 GHC Haskell和GNU Guile Scheme中的任意精度整数都是使用GMP实现的,在语言大战中最快实现的pidigits基准是基于GMP的。
如果你问实际情况,也可以参考http://ttmath.org
那么Pari呢? 它build立在顶级的GMP基础之上,并且提供了所有您需要的数字理论操作(以及许多符号计算的东西)的其他好处。