最好的跨平台(便携式)任意精度math库

我在C或C ++中寻找一个好的任意精度的math库。 你能给我一些build议吗?

主要要求:

  1. 必须处理任意大的整数(我的主要兴趣在于整数)。 万一你不知道这个字是什么意思的话,想象一下就是100000! (100000的阶乘)。
  2. 在库初始化/对象创build期间, 应该指定精度。 精度只能受系统可用资源的限制。
  3. 应该利用平台的全部力量,并且应该在本地处理“小”号码。 这意味着在64位平台上,计算2 ^ 33 + 2 ^ 32应该使用可用的64位CPU指令。 图书馆不应该在相同的平台上以与2 ^ 66 + 2 ^ 65相同的方式来计算。
  4. (+),减法( – ),乘法(*),整数除法(/),余数(%),功率(**),增量(++),递减( – ),gcd() ,阶乘()和其他常用整数算术运算。 能够处理像sqrt()(平方根),log()(对数)等不会产生整数结果的函数是一个优点。 处理符号计算的能力甚至更好。

这是我到目前为止发现的:

  1. JavaBigIntegerBigDecimal类:我一直在使用这些。 我已经阅读了源代码,但我不明白下面的math。 它可能基于我从未学过的理论/algorithm。
  2. 内置的整数types或在bc / Python / Ruby / Haskell / Lisp / Erlang / OCaml / PHP /其他语言的核心库中:我曾经使用过其中的一些,但我不知道它们使用的是哪个库或者他们正在使用哪种types的实现。

我已经知道:

  1. 使用char作为十进制数字, char *作为十进制string,并使用for循环对数字进行计算。
  2. 使用int (或long longlong long )作为基本“单位”,并将其数组作为任意长整数,并使用for循环对元素进行计算。
  3. 使用整数types将十进制数(或几位数)存储为BCD(二进制编码的十进制数)
  4. 展位的乘法algorithm

我不知道的是:

  1. 用十进制打印上面提到的二进制数组,而不使用天真的方法。 天真的方法示例:(1)添加从最低位到最高位:1,2,4,8,16,32,…(2)使用上面提到的char *string来存储中间小数结果)。

我欣赏:

  1. GMPMPFRdecNumber (或您认为是好的其他图书馆)上进行比较。
  2. 对我应该阅读的书籍/文章有很好的build议。 例如,有关如何从非天真的二进制转换到十进制转换algorithm的图例很好。 Douglas W. Jones的文章“Binary to Decimal Conversion in Limited Precision”是一篇很好的文章的例子。
  3. 任何帮助。

不要回答这个问题,如果:

  1. 你认为使用 (或长双 ,或长长双 )可以很容易地解决这个问题。 如果你这样想,那就意味着你不理解正在讨论的问题。

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基础之上,并且提供了所有您需要的数字理论操作(以及许多符号计算的东西)的其他好处。

http://pari.math.u-bordeaux.fr/