математика — Как напечатать число, используя библиотеку NTL (C ++)

Я строю программу на 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?

0

Решение

Обратите внимание, что на самом деле не имеет смысла применять 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`
4

Другие решения


По вопросам рекламы [email protected]