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

问题描述 投票:13回答:4

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

[请仅参考您使用的库,并告诉我您是如何进行设置和选择的,也许举一个非常简单的示例或类似的东西(基本上,如果所提到的库缺少好的文档,请提供您自己的输入) 。

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

我尝试过的图书馆:

  • vlint(操作不足,虽然可以用于小东西)

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

  • ttmath(看起来很有希望,由于编译错误,由于几乎没有文件证明,语法难以理解,因此编译了一些BIG示例程序并运行了一些修复程序)]]

  • gmp(甚至无法设置)

  • ps.s。删除了“问题的多余部分”,该部分基本上解释了为什么我要在Stackoverflow上问很多次,以便人们读到最后。

->更新

所以我选择的答案不是我最初提出的问题的直接答案,但对我解决了很大的帮助,我将发表一些发现,以帮助像我这样的其他c ++新手开始使用大量数字而无需像我在一个简单的分步式微指南中所做的那样,每天都在图书馆中苦苦挣扎。

我正在使用的东西

(请紧记以遵循指南):
  • Windows 7 Ultimate 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” 如果您遇到这种情况

    只需执行此操作,请在“选定的编译器”上选择“ GNU GCC编译器”,然后单击“设置为默认值”)。
  • 不离开“代码:块>设置>编译器和调试器”,并按照上面的步骤进行排序,请转到“搜索目录”,然后在“编译器”中单击“添加”,然后选择存储库的文件夹或其中的位置您放置“ ttmath”文件夹(在我的情况下为C:\ CPPLibs),然后转到“链接器”并执行相同的操作。

  • 要开始使用“ ttmath”库进行编码,您必须在主函数之前放置此行#include <ttmath/ttmath.h>NOTE:

    如果使用64位系统,如果不这样做,则会出现很多错误。 t还把这行#define TTMATH_DONT_USE_WCHAR BEFORE
  • 放在了这行#include <ttmath/ttmath.h>之前,我一直在努力处理这些废话,直到找到其他也在努力工作的家伙找到的修复程序并发布到了Web上并为我工作了) ps我认为这仅适用于64位系统,但是如果仅由于包含“ ttmath.h”头文件而出现错误,则很可能是因为该原因。
  • 声明变量

    将具有大的整数值,必须这样处理:ttmath::UInt<n> a,b,c;其中“ a,b,c”是您的变量,“ n”是您可以存储的数字的大小对于32位系统,其格式为“ 2 ^(32 * n)-1”;对于64位系统,其格式为“ 2 ^(64 * n)-1”
  • 向变量赋值

    如果执行此操作a = 333;(并且333处的数字大于c ++上的“ long int”标准数据类型),则不会编译,因为将值赋给这样的变量与您之前指定的大小无关,整数可以与c ++上的“ long int”标准数据类型一样大(我自己很难理解),即使您使用值它较小,并且可以正常编译,然后运行程序,并尝试向该变量写入一个比上述“ long int”标准数据类型可以处理的数字大的数字,那么您的数学将是错误的,因此请注意这样:为变量正确的方法
  • 赋值,您必须像a = "333";那样赋值(是的,我知道您将这种方式当作字符串对待,但它可以很好地执行操作,而无需任何问题,如果您决定“删减”该变量,就不会像您得到usi那样是指数或科学计数法结果ng标准整数数据类型,而无需与某些“额外的语句”结合使用以显示正确的数字)

    ps.s。使用这个简单的规则处理整数,在这个库中,我用一个简单的程序(花费了3分钟的代码)在15到20秒内计算了斐波那契数,直到第100.000个数,并且该数占用了3页,所以除了实用一旦知道了它的工作原理(以前几乎没有帮助,ttmath网站的某些示例就很容易产生误导,但现在您确实有帮助),它似乎也很有效,我确认第100.000个数字是可能是正确的,因为我将大小(“ n”)从10000增加到了50000,并且数字保留了大小,并且初始和最终数字相同。这是我使用的源代码,我使用了一个非常大的整数来测试整数,实际上我并没有费心去看程序会启动多少长度,但确实出错了,但是我知道最大长度第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;}  

我还没有修改该库的任意精度浮点数,但是当我看到人们对此感兴趣时,我将继续扩展本指南,感谢所有的评论和回答。

有人可以告诉我一个好的C ++库,用于处理任意大数的数字(它可以是处理任意精度浮点数的库,但可以处理整数...

c++ numbers biginteger arbitrary-precision
4个回答
4
投票

[官方网站(http://www.ttmath.org/)的samples使用整数(ttmath::Int<2> a,b,c;)和浮点(ttmath::Big<1,2> a,b,c;)。像对待没有成员的高精度int / float一样对待它们,一切都应该很好。如果错误仍然存​​在,您能否发布完整的错误消息以及错误所在的代码行?


0
投票

MIRACLNTLLIP的可能性很小。


0
投票

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


0
投票

我在这里写了这样的图书馆,MIT许可证:https://github.com/zettix/fatint

© www.soinside.com 2019 - 2024. All rights reserved.