如何使用NTL库(C ++)对数字进行处理

时间:2015-05-27 16:50:21

标签: c++ math floor ntl

我正在构建一个C ++程序来验证高达1000亿次迭代的数学猜想。为了测试这么高的数字,我不能使用NTL,因此我使用ZZ库,使用类型ZZ generateNthSeq(ZZ n) { return floor(n*sqrt(2)); } 作为我的数字类型。

我的算法如下所示:

#include <cmath>
#include <NTL/ZZ.h>

我要导入两个库:

$ g++ deepness*.cpp
deepness.cpp: In function ‘NTL::ZZ generateNthSeq(NTL::ZZ)’:
deepness.cpp:41: error: no matching function for call to ‘floor(NTL::ZZ)’
/usr/include/bits/mathcalls.h:185: note: candidates are: double floor(double)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/cmath:262: note:                 long double std::floor(long double)
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/cmath:258: note:                 float std::floor(float)

但显然这无法编译,因为我收到了错误:

adb tcpip 5555
adb connect 192.168.2.6:5555

说明楼层数学运算不能接受ZZ类类型。但我需要数字相当大。在使用NTL库时,如何完成我想要做的事情,即功能的底层?

1 个答案:

答案 0 :(得分:4)

请注意,将floor应用于整数类型(确实如此,它只是一个无操作)并不合理。您应该真正担心的是,您的代码显然是将ZZ类型的内容传递给floor

那就是n * sqrt(2)可能在这里意味着什么?

另外,在写这篇文章之前,我已经检查了文档,看看整数*浮点是否实际存在于库中 - 通常对于它来说很有用,你需要任意精度浮动类型可用。

检查标题,只有一个乘法运算符:

ZZ operator*(const ZZ& a, const ZZ& b);

并且有一个转换构造函数:

explicit ZZ(long a);  // promotion constructor

我无法弄清楚你的代码是如何编译的。也许您正在使用不同版本的库而不是我正在查看的内容,并且转换构造函数是隐含的,并且您的double正在获得&#34;升级&#34;到ZZ。这肯定不是您想要的,因为将sqrt(2)提升为ZZ只会给您一个整数1

您需要:

  • 查看NTL是否具有任意精度浮点功能
  • 切换到具有任意精度浮点功能的库
  • 将您的计算转换为纯整数算术

最后一个在这里相当容易:你想要

return SqrRoot(sqr(n) * 2); // sqr(n) will be a bit more efficient than `n * n`