13

有人能告诉我一个好的 C++ 库,用于处理(执行操作等)任意大的数字(它也可以是一个处理任意精度浮点数的库,但处理整数更重要)?

请仅参考您使用的库,并告诉我您是如何设法设置和获取它的,可能是一个非常简约的示例或其他东西(基本上,如果提到的库缺乏良好的文档,请提供您自己的一些输入)。

作为记录,我在 x64 机器上使用 Windows 7,CodeBlocks 作为我的 IDE,最新的 MinGW 作为编译器。

我试过的图书馆:

  • vlint(没有足够的操作,虽然适用于小东西)

  • bigint(易于设置,编译错误并且没有太多文档(可能从中衍生错误))

  • ttmath(似乎很有希望,编译了一些 BIG 示例程序并由于编译错误而运行了一些修复程序,由于几乎没有文档而导致语法难以理解)

  • gmp(甚至无法设置)

ps 删除了“问题的咆哮部分”,这基本上解释了为什么我要问一些在 Stackoverflow 上被问了很多次的东西,这样人们就会把它读到最后。

--> 更新

所以我选择了一个不是我最初问题的直接答案但对我解决这个问题有很大帮助的答案,我将发布我的一些发现来帮助像我这样的其他 c++ 新手开始使用非常大的数字而不会挣扎像我在一个简单的一步一步的微指南中所做的那样的图书馆。

我正在使用的东西(请记住这一点以遵循指南):

  • Windows 7 旗舰版 x64

  • Amd k10 x64(一些库不能使用它,其他库的行为会有所不同,其他库是定制为 amd k10 的,所以这不仅可以帮助您使用我使用的库,还可以帮助您使用其他库)

  • Code::Blocks 10.05不包含 MinGW 的版本,文件名“codeblocks-10.05-setup.exe”(安装在 C:\Program Files (x86)\CodeBlocks)

  • MinGW 软件包(binutils-2.15.91-20040904-1.tar.gz gcc-core-3.4.2-20040916-1.tar.gz gcc-g++-3.4.2-20040916-1.tar.gz mingw-runtime- 3.11.tar.gz w32api-3.8.tar.gz) 在 C:\MinGW 上提取

  • TTMath 0.9.2文件名“ttmath-0.9.2-src.tar.gz”解压缩并将文件夹“ttmath”复制到文件夹“C:\CPPLibs”(这是我将 c++ 库放入的文件夹)

怎么做才能设置好

  • 转到代码:块>设置>编译器和调试器(我的编译器在这里自动检测到。如果您没有发生这种情况,请在“选定编译器”上选择“GNU GCC编译器”并单击“设置为默认值”,然后单击“工具链” “编译器安装目录”上的可执行文件”,您可以选择编译器的安装目录或尝试自动检测”,然后在“C++ 编译器”上排序,选择或写入“mingw32-g++.exe”。如果发生这种情况,您只需执行这个,在“Selected Compiler”上选择“GNU GCC Compiler”并点击“Set as Default”)。

  • 不离开“代码:块>设置>编译器和调试器”并整理好上述内容,转到“搜索目录”,然后“编译器”单击“添加”并选择存储库的文件夹或放置“ ttmath”文件夹(在我的情况下是 C:\CPPLibs)然后转到“链接器”并做同样的事情。

  • 要开始使用“ttmath”库进行编码,您必须将此行放在#include <ttmath/ttmath.h>main 函数之前(注意:如果您使用 64 位系统,如果您不将此行放在此行之前,则会出现很多错误,#define TTMATH_DONT_USE_WCHAR #include <ttmath/ttmath.h>是与这个废话苦苦挣扎,直到我找到了其他也在苦苦挣扎的人找到并发布在网络上的修复程序,它对我有用)ps我认为它仅适用于64位系统,但如果你确实因为包含“ttmath”而出错.h" 头文件很可能是因为这个。

  • 必须像这样声明将具有大整数值的变量:ttmath::UInt<n> a,b,c;其中“a,b,c”是您的变量,“n”是您可以以这种形式存储在变量中的数字的大小“2 ^(32 *n)-1" 用于 32 位系统,这种形式 "2^(64*n)-1" 用于 64 位系统

  • 如果您这样做a = 333;(并且代替 333 的数字大于 C++ 上的“long int”标准数据类型),则为变量分配值将无法编译,因为将值分配给这样的变量独立于您之前指定的大小整数可以和 c++ 上的“long int”标准数据类型一样大(我自己想出了这个,很难),即使你使用一个更小的值并且它编译好然后你运行您的程序并尝试向该变量写入比上述“long int”标准数据类型可以处理的数字更大的数字,那么您的数学将是错误的,因此请注意:为变量赋值你必须像这样分配a = "333";(是的,我知道您几乎以这种方式将其视为字符串,但它可以很好地执行操作,没有任何问题,如果您决定“计算”变量,它将永远不会像您使用的那样是指数或科学记数法结果标准整数数据类型,无需加上一些“额外语句”来显示恰到好处的数字)

ps 使用这个简单的规则来处理整数和这个库,我用一个简单的程序(编码大约需要 3 分钟)在 15 到 20 秒内计算了第 100.000 个数字的斐波那契数,并且这个数字占用了 3 页,所以除了是实用的图书馆一旦你了解它是如何工作的(你以前几乎没有任何帮助,ttmath 网站的一些示例非常具有误导性,但现在你确实有一些帮助)它看起来也很有效,我确认第 100.000 个数字可能是正确的,因为我将大小(“n”)从 10000 增加到 50000,并且数字保留了大小,并且初始和最终数字相同。这是我使用的源代码,我用一个非常大的数字作为整数大小只是为了测试,我没有 t 实际上很想看看程序会在多长的范围内开始做错事,但我知道直到第 10.000 个斐波那契数的长度不会超过我定义的长度,因为在此之前我让程序“cout”每个结果直到它达到第 10.000 个并且它一直在增长。在我暂停程序之前,我还检查了序列的第一个数字,我看到“数字增长”并确认了序列的第一个斐波那契数字,它们是正确的。注意:此源代码只会显示您想知道的斐波那契数列的编号,如果您取消注释行,它只会显示“增长”的数字。

#define TTMATH_DONT_USE_WCHAR
#include <ttmath/ttmath.h>
#include <iostream>

using namespace std;
int main () {

int fibonaccinumber;
cin >> fibonaccinumber;
cin.ignore();

ttmath::UInt<10000> fibonacci1,fibonacci2,fibonacci3;
fibonacci1 = 1;
fibonacci2 = 1;
//cout << "1. " << fibonacci1 << "\n2. " << fibonacci2 << "\n";

for(int i=3;i<=fibonaccinumber;i++)
{fibonacci3 = fibonacci1 + fibonacci2;
//   cout << i << ". " << fibonacci3 << "\n";
fibonacci1=fibonacci2;
fibonacci2=fibonacci3;}

cout << "the " << fibonaccinumber << "th fibonacci number is " << fibonacci2;

string endprog;
getline(cin,endprog);
return 0;}  

我还没有修改这个图书馆的任意精度浮点数,但是当我这样做时,如果我看到人们对它感兴趣,我将继续扩展本指南,感谢所有评论和答案。

4

3 回答 3

4

官方网站 (http://www.ttmath.org/) 有使用整数 ( ) 和浮点 ( ) 的示例。只需将这些视为高精度/没有成员,一切都应该没问题。如果错误仍然存​​在,您能否发布完整的错误消息以及出错的代码行?ttmath::Int<2> a,b,c;ttmath::Big<1,2> a,b,c;intfloat

于 2011-11-16T18:25:07.660 回答
0

一些可能性是MIRACLNTLLIP

于 2011-11-16T06:53:19.313 回答
0

Boost.Multiprecision库支持任意长的整数、实数和比率。它还允许您使用具有不同性能特征和许可条款的不同后端。

于 2014-06-14T14:55:28.810 回答