c++ - 什么是最好的(可移植)跨平台任意精度数学库?

标签 c++ c biginteger bigdecimal gmp

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

6年前关闭。




Improve this question




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

  • 必须处理任意大的整数——我的主要兴趣是整数。如果你不知道任意大这个词是什么意思,想象一下 100000 之类的东西! (100000 的阶乘)。
  • 精密一定不需要在库初始化或对象创建期间指定。精度应该只有受系统可用资源的限制。
  • 应该充分利用平台的功能,并且应该在 native 处理“小”数字。这意味着在 64 位平台上,计算 (2^33 + 2^32) 应使用可用的 64 位 CPU 指令。图书馆不应该在同一平台上以与 (2^66 + 2^65) 相同的方式计算。
  • 必须有效地处理加法 ( + )、减法 ( - )、乘法 ( * )、整数除法 ( / )、余数 ( % )、幂 5 ( |104|7 | 104| 7 | 104 | 7 )、递减 ( ** )、GCD、阶乘和其他常见的整数算术计算。能够处理不产生整数结果的平方根和对数等函数是一个优势。处理能力symbolic computations甚至更好。

  • 以下是我目前发现的:
  • Java BigInteger BigDecimal 类(class):到目前为止我一直在使用这些。我已经阅读了源代码,但我不明白下面的数学。它可能基于我从未学过的理论和算法。
  • 内置整数类型或在 的核心库中bc , Python , ruby , Haskell , Lisp , Erlang , OCaml , PHP ,其他一些语言:我使用过其中一些,但我不知道他们使用的是哪个库,或者他们使用的是哪种实现。

  • 我已经知道的:
  • 使用 ++十进制数字和 --对于十进制字符串,并使用 char 对数字进行计算-循环。
  • 使用 char* (或 forint )作为基本“单位”和该类型的数组作为任意长整数,并使用 long int 对元素进行计算-循环。
  • 使用整数类型将十进制数字(或几位数字)存储为 BCD (Binary-coded decimal) .
  • Booth’s multiplication algorithm .

  • 我不知道的:
  • 在不使用简单方法的情况下以十进制打印上述二进制数组。一个简单方法的示例:(1) 从最低到最高添加位:1, 2, 4, 8, 16, 32, ... (2) 使用 long long -string 上面提到的存储中间十进制结果)。

  • 我欣赏的是:
  • 上进行很好的比较GMP , MPFR , decNumber (或其他您认为不错的库)。
  • 关于我应该阅读的书籍和文章的好建议。例如,一个带有数字的插图说明 非天真二进制到十进制的转换算法效果会很好。文章“ Binary to Decimal Conversion in Limited Precision ” 由道格拉斯 W. 琼斯 (Douglas W. Jones) 撰写,就是一篇好文章的例子。
  • 任何帮助一般。

  • 不要如果您认为使用 for,请回答这个问题(或 char*double )可以轻松解决此问题。如果你真的这么认为,你就没有理解这个问题。

    最佳答案

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

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

    关于c++ - 什么是最好的(可移植)跨平台任意精度数学库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568446/

    相关文章:

    c++ - 与不同变量类型相比的变量的 Clang AST 匹配器

    c++ - 指向结构体访问冲突写入位置的指针

    c - 使用 sscanf 读取带空格的字符串

    c - 使用 gcc 对 `__gxx_personality_v0' 的 undefined reference

    c - 如何将服务器的日期时间转换为unix时间戳?

    java - 使用 BigInteger.isProbablePrime() 生成加密安全素数

    c++ - 如何知道Qt在哪个线程中执行slots?

    c++ - QSystemDeviceInfo 中成员的无效使用

    c# - 未经检查的 block 不适用于 BigInteger?

    javascript - 在 Twitter API 中使用 since_id 和 max_id