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

主要要求:

  1. 它能处理must个任意大的整数,我的主要兴趣是整数.如果你不知道"任意大"这个词的意思,想象一下10万吧!(must000的阶乘).

  2. 在库初始化或对象创建期间指定的精度must not need.精度应受到系统可用资源的限制.

  3. should利用平台的全部功能,并应在本地处理"小"数字.这意味着在64位平台上,计算(2^33+2^32)应该使用可用的64位CPU指令.库should not的计算方法与在同一平台上计算(2^66+2^65)的方法相同.

  4. 它可以有效地处理加法(+)、减法(-)、乘法(*)、整数除法(/)、余数(%)、幂(**)、增量(++)、减量(--)、GCD、阶乘和其他常见的整数算术计算.处理不产生整数结果的平方根和对数等函数的能力是一个优势.处理symbolic computations的能力甚至更好.

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

  1. Java100级和101级:到目前为止我一直在用这些.我读过源代码,但我不懂下面的数学.它可能是基于我从未学过的理论和算法.

  2. 内置的整数类型或在100101RubyHaskellLispErlangOCamlPHP等语言的核心库中:我用过其中的一些语言,但我不知道它们使用的是哪个库,或者它们使用的是哪种实现.

我已经知道的是:

  1. 使用char表示十进制数字,char*表示十进制字符串,并使用for循环对数字进行计算.

  2. 使用int(或long intlong long)作为基本"单位",将该类型的数组作为任意长整数,并使用for循环对元素进行计算.

  3. 使用整数类型将小数位(或几位)存储为100.

  4. 100

我不知道的是:

  1. 在不使用朴素方法的情况下,以十进制打印上述二进制array.一个简单的方法示例:(1)从最低位到最高位相加:1,2,4,8,16,32,…(2)使用上面提到的char*个字符串来存储中间小数结果).

我欣赏的是:

  1. 100101102(或其他你认为不错的库)进行了很好的比较.

  2. 关于我应该阅读的书籍和文章的好建议.例如,用数字说明non-naive二进制到十进制转换算法的工作原理就很好了.道格拉斯·W·琼斯的文章《100》就是一篇好文章的例子.

  3. 总的来说有什么帮助吗.

如果你认为使用double(或long doublelong long double)可以轻松解决这个问题,请回答这个问题.如果你真的这么认为,那你就不理解这个问题.

推荐答案

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

你要求提供相关书籍或文章.bignums最棘手的部分是长除法.我推荐伯林奇·汉森的论文Multiple-Length Division Revisited: A Tour of the Minefield.

C++相关问答推荐

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

在列表中插入Int指针(C)

如何在C中使printf不刷新标准输出?

Char变量如何在不使用方括号或花括号的情况下存储字符串,以及它如何迭代到下一个字符?

CSAPP微型shell 实验室:卡在sigprocmask

X64:并发写入布尔数组

用gcc-msse 2编译的C程序包含AVX 1指令

Tic-tac-toe:从文件加载存储

GCC错误,共享内存未定义引用?

C:如何将此代码转换为与数组一起使用?

在C程序中使用Beaglebone Black UART的问题

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

与指针的原始C数组或C++向量<;向量<;双>>;

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

为什么创建局部变量的指针需要过程在堆栈上分配空间?

C11 嵌套泛型

在带中断的循环缓冲区中使用 易失性

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

将十六进制值或十进制值分配给 uint16_t 有什么区别?