【发布时间】:2015-05-27 16:50:21
【问题描述】:
我正在构建一个 C++ 程序来验证一个数学猜想,最多可进行 1000 亿次迭代。为了测试如此高的数字,我不能使用C++ int,所以我使用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)
声明地板数学运算不能接受 ZZ 类类型。但我需要数字相当大。如何在使用 NTL 库的同时完成我想做的事情,即地板功能?
【问题讨论】:
-
看起来 n * squrt(2) 返回的是双精度而不是 NTL::ZZ 也许你的库有自己的 squrt 函数?
-
我不知道该库,但如果它是shoup.net/ntl/doc/tour-ex1.html 中描述的库,显然它具有“
SqrRoot- 平方根的整数部分”。所以你可以试试SqrRoot(2*n*n),假设n是正数(否则-SqrRoot(2*n*n))。 -
谢谢大家。我已将算法更改为
floor(SqrRoot(2*n*n))。SqrRoot现在返回 ZZ,但在 NTL 库或 C++ 库中仍然没有floor函数接受ZZ,这是上面列出的真正问题。floor:(NTL::ZZ)没有匹配的呼叫。需要更多帮助。 -
为什么需要申请地板?根据我引用的内容,SqrRoot 已经返回平方根的整数部分。
-
.. 具体来说,标题 cmets
x = floor(a^{1/2}) (a >= 0)