在C ++中处理任意长度的整数

时间:2011-11-16 04:56:36

标签: c++ numbers biginteger arbitrary-precision

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

请仅参考您使用过的图书馆并告诉我您是如何设置并捡起来的,可能是一个非常简约的例子或者其他东西(基本上如果提到的图书馆缺乏良好的文档提供了一些你自己的输入)。

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

我试过的图书馆:

  • vlint(操作不够,虽然适用于小东西)

  • bigint(易于设置,编译错误和文档不多(可能导致错误))

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

  • gmp(甚至无法设置)

P.S。删除了问题的“咆哮”部分。这基本上解释了为什么我在Stackoverflow上问过很多次问过的东西,所以人们会把它读到最后。

- >更新

所以我选择了一个答案,不能直接回答我最初的问题,但帮助我解决了很多问题,我将发布一些我的发现,以帮助像我这样的其他c ++新手开始使用非常大的工作数字没有与图书馆挣扎好几天,就像我在一个简单的一步一步的微指南。

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

  • Windows 7旗舰版x64

  • Amd k10 x64 (有些图书馆不会使用此版本,其他图书馆的行为会有所不同,其他图书馆会自定义tdlored到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编译器"然后单击"设置为默认"然后在"工具链Exectables" on"编译器安装目录中,您可以选择编译器的安装目录或尝试自动检测"和那个排序在" C ++编译器"选择或写" mingw32-g ++。exe"。如果这发生在你身上就这样做,在"选择编译器"选择" GNU GCC编译器"并单击"设置为默认")。

  • 不离开"代码:块>设置>编译器和调试器"并通过以上整理,转到"搜索目录"然后"编译器"点击"添加"并选择存储图书馆的文件夹或您放置图书馆的位置" ttmath"文件夹(在我的例子中是C:\ CPPLibs)然后转到"链接器"并做同样的事情。

  • 开始使用&#34; ttmath&#34;库你需要在主函数之前放置这一行#include <ttmath/ttmath.h>注意:如果你使用的是64位系统,如果你还没有把这行放在一边,你会遇到很多错误#define TTMATH_DONT_USE_WCHAR 之前这一行#include <ttmath/ttmath.h>,我一直在努力解决这个问题,直到我找到了其他一些也在努力寻找并在网上发布并且在我)ps我认为它只适用于64位系统,但如果你因为包括&#34; ttmath.h&#34;而得到错误。头文件最有可能是因为这个。

  • 声明具有大整数值的变量必须像这样完成:ttmath::UInt<n> a,b,c;其中&#34; a,b,c&#34;是你的变量和&#34; n&#34;是你可以在这种形式的变量中存储的数字的大小&#34; 2 ^(32 * n)-1&#34;对于32位系统和这种形式&#34; 2 ^(64 * n)-1&#34;对于64位系统

  • 为变量分配值如果执行此操作a = 333;(代替333的数字大于&#34; long int&#34;标准数据类型在c ++上)它不会编译,因为将值分配给这样的变量,与之前指定的大小无关,整数可以和&#34; long int&#34;一样大。 c ++上的标准数据类型(我自己认为这是一个很难的方法),即使你使用较小的值并且编译正常然后你运行你的程序并且它试图写入这个变量更大的数字比提到的#34; long int&#34;标准数据类型可以处理,那么你的数学就会出错,所以请注意:为变量赋值正确的方式你必须像a = "333";那样分配它(是的我我知道你几乎把它当作一个字符串来对待它,但是它会很好地完成操作而没有任何问题,如果你决定&#34; cout&#34;变量它将永远不会像你一样成为指数或科学记数法结果使用标准整数数据类型而不与一些额外的语句结合使用以显示正确的数字

P.S。使用这个简单的规则来处理整数和这个库我用15到20秒的简单程序(花了3分钟代码)来计算最多到第1000个数字的斐波纳契数,这个数字占用了3页,所以除了实用之外图书馆一旦你知道它是如何工作的(你以前几乎没有任何帮助,ttmath网站的一些样本非常具有误导性,但现在你确实有一些帮助)它看起来也非常有效,我确认第100.000个数字是可能是正确的,因为我将尺寸(&#34; n&#34;)从10000增加到50000,数字保留了大小,初始和最终数字相同。这是我使用的源代码,我使用一个非常大的数字作为整数大小只是为了测试,我实际上并不打算看看程序会开始做什么,做错了但我知道的长度是直到第10,000个斐波那契数字不会超过我定义的长度,因为在此之前我制作了节目&#39; cout&#39;每一个结果,直到它达到10.000并且它总是在增长。在我暂停程序之前,我还检查了序列的第一个数字,并且我看到了&#39;数字增长&#39;并确认序列的第一个斐波那契数,它们是正确的。 注意:此源代码仅显示您想知道的斐波那契序列的数量,它只会显示数字&#34;增长&#34;如果取消注释注释行。

#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;}  

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

有几种可能性MIRACLNTLLIP

答案 2 :(得分:0)

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