Siu*_*ji-
77
c
c++
biginteger
gmp
bigdecimal
我在C或C++中寻找一个好的任意精度数学库.你能给我一些意见/建议吗?
主要要求:
- 它必须处理任意大整数(我的主要兴趣是整数).如果你不知道这个词是什么意思大,意味着像100000这样的东西!(阶乘为100000).
- 在库初始化/对象创建期间,不必指定精度.精度应该仅受系统可用资源的限制.
- 它应该利用平台的全部功能,并且应该本地处理"小"数字.这意味着在64位平台上,计算2 ^ 33 + 2 ^ 32应该使用可用的64位CPU指令.库不应该像在同一平台上使用2 ^ 66 + 2 ^ 65那样计算它.
- 它必须处理加法(+),减法( - ),乘法(*),整数除法(/),余数(%),幂(**),增量(++),减量( - ),gcd() ,factorial()和其他常见的整数算术计算有效.能够处理不产生整数结果的sqrt()(平方根),log()(对数)等函数是一个优点.处理符号计算的能力甚至更好.
这是我到目前为止发现的:
- Java的BigInteger和BigDecimal类:到目前为止我一直在使用它们.我已经阅读了源代码,但我不了解下面的数学.它可能基于我从未学过的理论/算法.
- 内置的整数类型或bc/Python/Ruby/Haskell/Lisp/Erlang/OCaml/PHP /其他一些语言的核心库:我曾经使用过其中的一些,但我不知道他们使用的是哪个库,或者他们正在使用哪种实现方式.
我所知道的:
- 使用char作为十进制数字,使用char*作为十进制字符串,并使用for循环对数字进行计算.
- 使用int(或long int或long long)作为基本"单元"并将其数组作为任意长整数,并使用for循环对元素进行计算.
- 使用整数类型将十进制数字(或几位数)存储为BCD(二进制编码的十进制).
- Booth的乘法算法
我不知道的是:
-
不使用朴素方法打印上面提到的二进制数组十进制.一个朴素方法的例子:(1)添加从最低到最高的位:1,2,4,8,16,32 ......(2)使用上面提到的char*字符串来存储中间十进制结果).
我很欣赏:
- 对GMP,MPFR,decNumber(或您认为好的其他图书馆)的良好比较.
- 我应该阅读的关于书籍/文章的好建议.例如,有关非天真二进制到十进制转换算法如何工作的数字的插图是好的.Douglas W. Jones 撰写的文章"有限精度的二进制到十进制转换"是一篇好文章的例子.
- 任何帮助.
请不要回答这个问题:
- 你认为使用双(或长双,或长双)可以很容易地解决这个问题.如果你这么认为,那就意味着你不理解正在讨论的问题.