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

Siu*_*ji- 77 c c++ biginteger gmp bigdecimal

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

主要要求:

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

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

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

我所知道的:

  1. 使用char作为十进制数字,使用char*作为十进制字符串,并使用for循环对数字进行计算.
  2. 使用int(或long intlong long)作为基本"单元"并将其数组作为任意长整数,并使用for循环对元素进行计算.
  3. 使用整数类型将十进制数字(或几位数)存储为BCD(二进制编码的十进制).
  4. Booth的乘法算法

我不知道的是:

  1. 不使用朴素方法打印上面提到的二进制数组十进制.一个朴素方法的例子:(1)添加从最低到最高的位:1,2,4,8,16,32 ......(2)使用上面提到的char*字符串来存储中间十进制结果).

我很欣赏:

  1. GMP,MPFR,decNumber(或您认为好的其他图书馆)的良好比较.
  2. 我应该阅读的关于书籍/文章的好建议.例如,有关非天真二进制到十进制转换算法如何工作的数字的插图是好的.Douglas W. Jones 撰写的文章"有限精度的二进制到十进制转换"是一篇好文章的例子.
  3. 任何帮助.

不要回答这个问题:

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

Nor*_*sey 24

GMP是受欢迎的选择.Squeak Smalltalk有一个非常好的库,但它是用Smalltalk编写的.

你问了相关的书籍或文章.bignums的棘手部分是长期划分.我推荐Per Brinch Hansen的论文" 多长度分部重访:雷区之旅".

  • @Sui:Brinch Hanson展示了如何将试错方法减少到最多两次试验.这真的非常令人印象深刻. (3认同)

cas*_*evh 13

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

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

casevh

  • "代码可移植性"与"主要平台上支持"不同.Python使用一个简单的实现,对C编译器的行为做出很少的假设,因此相同的代码几乎可以在任何C编译器上编译.GMP使用更多代码(C和高度调整的程序集),使GMP更快,但也对C编译器和汇编程序的行为做出更多假设.例如,Microsoft Visual Studio编译器不支持GMP.有一个名为MPIR(www.mpir.org)的GMP分支支持微软的编译器. (2认同)

And*_*kiy 8

http://ttmath.org

小型模板化标题库,免费个人和商业用途.


Ric*_*ell 7

我自己并没有将任意精确算术库相互比较,但是那些似乎或多或少一致地确定了GMP的人.对于它的价值,GHC Haskell和GNU Guile Scheme中的任意精度整数都是使用GMP实现的,并且语言枪战中pidigits基准的最快实现基于GMP.


for*_*ran 5

什么帕里?它建立在顶级 GMP 之上,并提供了您永远需要的有关数论运算的所有其他优点(以及许多符号计算内容)。