【问题标题】:How to floor a number using the NTL library (C++)如何使用 NTL 库 (C++) 计算底数
【发布时间】: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 &gt;= 0)

标签: c++ math floor ntl


【解决方案1】:

请注意,将floor 应用于整数类型并没有什么意义(嗯,确实如此,它只是一个无操作)。您真正应该担心的是您的代码显然将ZZ 类型的东西传递给floor

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

另外,在写之前,我已经检查了文档以查看库中是否真的存在整数 * 浮点数——通常要让它完全有用,你需要可用的任意精度浮点类型。


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

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

还有一个转换构造函数:

explicit ZZ(long a);  // promotion constructor

我什至无法弄清楚您的代码是如何编译的。也许您使用的库版本与我所看到的不同,并且转换构造函数是隐式的,并且您的 double 正在“升级”为 ZZ。这肯定不是您想要的,因为将sqrt(2) 提升为ZZ 只会给您整数1

您需要:

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

最后一个在这里相当简单:你想要

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

【讨论】:

  • 顺便说一句,即使您有任意精度的浮点可用,纯整数版本仍然可能是更好的计算方式。
  • 感谢@Hurkyl 提供所有信息。我真正需要的只是你提到的最后一点。这是一个类,对要使用的库以及如何设置有要求,所以我受到了上面提到的约束。我真正需要知道的是 SqrRoot() NTL 函数返回一个四舍五入的 int,这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多