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

时间:2010-04-02 18:36:41

标签: c++ c biginteger bigdecimal gmp

我在C或C ++中寻找一个好的任意精度数学库。你能给我一些意见/建议吗?

主要要求:

  1. 必须处理任意大整数(我的主要兴趣是整数)。如果你不知道这个词是什么意思大,意味着像100000这样的东西! (阶乘为100000)。
  2. 在库初始化/对象创建期间指定精度 MUST NOT NEED 。精度受系统可用资源的限制。
  3. 应该利用平台的全部功能,并且应该本地处理“小”数字。这意味着在64位平台上,计算2 ^ 33 + 2 ^ 32应该使用可用的64位CPU指令。库不应该以与在同一平台上使用2 ^ 66 + 2 ^ 65相同的方式计算它。
  4. 必须处理加法(+),减法( - ),乘法(*),整数除法(/),余数(%),幂(**),增量(++) ,递减( - ),gcd(),factorial()和其他常见的整数算术计算。能够处理不产生整数结果的sqrt()(平方根),log()(对数)等函数是一个优点。处理symbolic computations的能力更好。

以下是我到目前为止所发现的内容:

  1. Java BigInteger BigDecimal 类:到目前为止我一直在使用这些。我已经阅读了源代码,但我不理解下面的数学。它可能基于我从未学过的理论/算法。
  2. 内置整数类型或核心库 bc / Python / Ruby / < b> Haskell / Lisp / Erlang / OCaml / PHP /其他一些语言:我有曾经使用过其中一些,但我不知道他们正在使用哪个库,或者他们正在使用哪种实现。
  3. 我所知道的:

    1. 使用 char 作为十进制数字,使用 char * 作为十进制字符串并进行计算在使用for循环的数字上。
    2. 使用 int (或 long int ,或者 long long )作为一个基本的“单位”和一个任意长整数的数组,并使用for循环对元素进行计算。
    3. 使用整数类型将十进制数字(或几位数)存储为<​​b> BCD (Binary-coded decimal)
    4. Booth's multiplication algorithm
    5. 我不知道的是:

      1. 不使用朴素方法打印上面提到的二进制数组十进制。天真方法的示例:(1)添加从最低到最高的位:1,2,4,8,16,32 ......(2)使用 char * 上面提到的字符串,用于存储中间十进制结果)。
      2. 我很感激:

        1. GMP MPFR decNumber (或其他图书馆)的良好比较你认为好。)
        2. 我应该阅读的关于书籍/文章的好建议。例如,有关非天真二进制到十进制转换算法如何工作的数字的图示是好的。 Douglas W. Jones的文章 "Binary to Decimal Conversion in Limited Precision" 就是一篇好文章的例子。
        3. 任何帮助。
        4. 如果符合以下情况,请请勿回答此问题:

          1. 您认为使用 double (或 long double long long double )可以轻松解决这个问题。如果你这么认为,那就意味着你不理解正在讨论的问题。

5 个答案:

答案 0 :(得分:24)

GMP是热门的选择。 Squeak Smalltalk有一个非常好的库,但它是用Smalltalk编写的。

您要求提供相关书籍或文章。 bignums的棘手部分是长期划分。我推荐Per Brinch Hansen的论文Multiple-Length Division Revisited: A Tour of the Minefield

答案 1 :(得分:13)

总的来说,他最快的通用任意精度库是GMP。如果要使用浮点值,请查看MPFR库。 MPFR基于GMP。

关于其他语言中的本机任意精度支持,由于许可证,代码大小和代码可移植性原因,Python使用自己的实现。 GMPY模块允许Python访问GMP库。

casevh

答案 2 :(得分:8)

请参阅http://ttmath.org

小型模板化标题库,供个人和商业免费使用。

答案 3 :(得分:7)

我自己并没有将任意精确算术库相互比较,但似乎或多或少地确定了GMP的人。对于它的价值,GHC Haskell和GNU Guile Scheme中的任意精度整数都是使用GMP实现的,而pidigits benchmark on the language shootout的最快实现是基于GMP。

答案 4 :(得分:3)

Pari怎么样?它建立在顶级GMP之上,提供了您需要的数论运算的所有其他好处(以及许多符号计算的东西)。

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