gpt4 book ai didi

c++ - 如何使用 NTL 库 (C++) 对数字进行下限

转载 作者:行者123 更新时间:2023-11-27 22:58:11 24 4
gpt4 key购买 nike

我正在构建一个 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)

声明 floor 数学运算不能接受 ZZ 类类型。但我需要数字非常大。如何在使用 NTL 库的同时完成我想做的事情,即降低功能?

最佳答案

请注意,应用 floor 没有任何意义到一个整数类型(好吧,确实如此,它只是一个空操作)。您真正应该担心的是您的代码显然传递了 ZZ 类型的东西。进入floor !

也就是说,什么可以n * sqrt(2)可能是这里的意思?

另外,甚至在写那个之前,我已经检查了文档以查看整数 * float 是否确实存在于库中——通常要使它有用,您需要可用的任意精度浮点类型。


查看headers,只有一个乘法运算符:

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`

关于c++ - 如何使用 NTL 库 (C++) 对数字进行下限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30488643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com