我正在构建一个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库时,如何完成我想要做的事情,即功能的底层?
答案 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
。
您需要:
最后一个在这里相当容易:你想要
return SqrRoot(sqr(n) * 2); // sqr(n) will be a bit more efficient than `n * n`