Я строю программу на C ++ для проверки математической гипотезы до 100 миллиардов итераций. Чтобы проверить такие высокие цифры, я не могу использовать 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?
Обратите внимание, что на самом деле не имеет смысла применять 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
,
Вам либо нужно:
Этот последний довольно легко здесь: вы хотите
return SqrRoot(sqr(n) * 2); // sqr(n) will be a bit more efficient than `n * n`