Подтвердить что ты не робот

Обрабатывать произвольные длины целых чисел в С++

Может ли кто-нибудь сказать мне хорошую библиотеку С++ для обработки (выполнение операций и т.д.) с произвольно большими числами (это может быть библиотека, которая также обрабатывает произвольные прецизионные поплавки, но более важна обработка целых чисел)?

Пожалуйста, обратитесь только к библиотекам, которые вы использовали и рассказали мне, как вам удалось настроить его и забрать, возможно, с очень минималистичным примером или чем-то (в основном, если в упомянутой библиотеке отсутствует хорошая документация, вы можете внести свой вклад).

Для записи я использую Windows 7 на машине x64, CodeBlocks в качестве моей IDE и последнюю версию MinGW в качестве компилятора.

Библиотеки, которые я пробовал:

  • vlint (недостаточно операций, отлично работает для небольших вещей)

  • bigint (легко настроить, скомпилировать ошибки и не много документации (из которых могут быть получены ошибки))

  • ttmath (казалось многообещающим, скомпилировал несколько примеров BIG и запускался после некоторых исправлений из-за компиляции ошибок, непонятного синтаксиса из-за практически отсутствия документализации)

  • gmp (даже не мог настроить его)

p.s. Убрали "пронзительную часть вопроса", в основном объясняющую, почему я спрашиваю то, что было задано много раз на Stackoverflow, чтобы люди читали его до конца.

→ ОБНОВЛЕНИЕ

Итак, я выбрал ответ, который не был прямым ответом на мой первоначальный вопрос, но помог мне решить эту проблему, и я опубликую некоторые мои выводы, чтобы помочь другим новичкам С++, таким как я, начать работу с очень большими числами не борясь с библиотеками в течение нескольких дней, как я сделал в простой пошаговый микро-гид.

Материал, который я использовал (помните о том, чтобы следовать руководству):

  • Windows 7 Ultimate x64

  • Amd k10 x64 (некоторые библиотеки не будут работать с этим, другие будут вести себя по-другому, другие настраиваются на amd k10, поэтому это не только поможет вам с библиотекой я но, возможно, и с другими)

  • Code:: Blocks 10.05 версия без включенного MinGW, имя файла "codeblocks-10.05-setup.exe" (установлено на C:\Program Files (x86)\CodeBlocks)

  • пакеты MinGW (binutils-2.15.91-20040904-1.tar.gz gcc-core-3.4.2-20040916-1.tar.gz gcc-g++ - 3.4. 2-20040916-1.tar.gz mingw-runtime-3.11.tar.gz w32api-3.8.tar.gz), извлеченный на C:\MinGW

  • TTMath 0.9.2 имя файла "ttmath-0.9.2-src.tar.gz" распаковали и скопировали папку "ttmath" в папку "C:\CPPLibs" ( который является папкой, в которую я помещал свои библиотеки С++)

Что делать, чтобы настроить все

  • Перейдите в раздел "Блоки > Настройки > Компилятор и отладчик (мой компилятор был обнаружен здесь автоматически. Если это не происходит с вами, в" Выбранный компилятор "выберите" GNU GCC Компилятор "и нажмите" Установить по умолчанию ", а затем в" Инструментальные выходы "в" Каталог установки компиляторов вы можете выбрать каталог установки компилятора или попытаться автоматически определить "и с помощью этого, отсортированного по" Компилятору на С++ ", выбрать или написать" mingw32 -g++. exe ". Если это произойдет с вами, просто сделайте это, в" Selected Compiler "выберите" GNU GCC Compiler "и нажмите" Установить по умолчанию ").

  • Не оставляя "Код: Блоки" > "Настройки" > "Компилятор и отладчик" и с приведенным выше списком, перейдите в "Каталоги поиска", а затем "Компилятор" нажмите "Добавить" и выберите папку, в которой хранятся ваши библиотеки или где вы помещаете свою папку "ttmath" (в моем случае C:\CPPLibs), переходите к "Linker" и делайте то же самое.

  • Чтобы начать кодирование с помощью библиотеки "ttmath" , перед основной функцией вы должны поместить эту строку #include <ttmath/ttmath.h> ( ПРИМЕЧАНИЕ:. Если вы используете 64-битную систему, вы получите много ошибки, если вы также не поместили эту строку #define TTMATH_DONT_USE_WCHAR ПЕРЕД этой строкой #include <ttmath/ttmath.h>, я боролся с этим дерьмом, пока не нашел исправление, что другой парень, который также пытался найти и опубликовать на сеть, и это сработало для меня) ps Я думаю, что это только для 64-битных систем, но если вы получаете ошибки только из-за включения заголовочного файла "ttmath.h", это, скорее всего, из-за этого.

  • Объявление переменныхкоторые будут иметь большие целочисленные значения, должны быть выполнены следующим образом: ttmath::UInt<n> a,b,c; где "a, b, c" - ваши переменные, а "n" - размер чисел, которые вы можете хранить в переменных в этой форме "2 ^ 32 * n) -1" для 32-битных систем и этот вид "2 ^ (64 * n) -1" для 64-битных систем

  • Присвоение значений переменным, если вы сделаете это a = 333; (а число вместо 333 больше стандартного типа данных "long int" на С++), это не будет compile, потому что присваивание значений таким переменным независимо от того размера, которое вы указали ранее, целое число может быть таким же большим, как стандартный тип данных "long int" на С++ (я сам это понял сам по себе, трудный путь), также даже если вы используете меньшее значение, и оно компилируется в порядке, а затем вы запускаете свою программу, и оно пытается записать в эту переменную большее число, чем число, которое может обрабатывать стандартный тип данных "long int" , тогда ваша математика идет чтобы быть неправильным, следите за этим: присваивать значение переменной правильным способом, вам нужно назначить ее так a = "333"; (да, я знаю, что вы в значительной степени рассматриваете ее как строку таким образом, но он будет делать операции просто отлично, без каких бы то ни было проблем, и если вы решите "загромождать" переменную, это никогда не будет экспоненциальным или научным n вывода, так как вы получаете использование стандартных целочисленных типов данных, не связавшись с некоторыми "дополнительными операторами", чтобы отображать число справа)

p.s. Используя эти простые правила для работы с целыми числами и этой библиотекой, я вычислил число фибоначчи до 100 000-го числа с помощью простой программы (которая занимала примерно 3 мин для кода) за 15-20 секунд, а число заняло 3 страницы, что, кроме того, было практичным после того, как вы узнаете, как это работает (у вас практически не было никакой помощи раньше, некоторые образцы веб-сайта ttmath довольно вводят в заблуждение, но теперь у вас есть какая-то помощь), это также кажется довольно эффективным, я подтвердил, что 100-тысячное число вероятно, потому, что я увеличил размер ( "n" ) с 10000 до 50000, а число сохраняло размер, а начальные и конечные цифры были одинаковыми. Это исходный код, который я использовал, я использовал ОЧЕНЬ БОЛЬШОЕ число для целочисленного размера, чтобы просто проверить, я действительно не беспокоился о том, на какой длительности программа начнет делать что-то неправильно, но я знаю, что длина до 10.000-й номер фибоначчи не будет превосходить длину, которую я определил, потому что до этого я сделал программу "cout" каждый результат, пока она не достигнет 10.000-го, и она всегда росла. Я также проверил первые числа последовательности до того, как я приостановил программу, и я видел, как "цифры растут" и подтвердили первые числа фибоначчи последовательности, и они были правильными. ПРИМЕЧАНИЕ.. Этот исходный код отображает только номер последовательности фибоначчи, который вы хотите знать, он будет показывать только числа, "растущие", если вы раскомментируете прокомментированные строки.

#define TTMATH_DONT_USE_WCHAR
#include <ttmath/ttmath.h>
#include <iostream>

using namespace std;
int main () {

int fibonaccinumber;
cin >> fibonaccinumber;
cin.ignore();

ttmath::UInt<10000> fibonacci1,fibonacci2,fibonacci3;
fibonacci1 = 1;
fibonacci2 = 1;
//cout << "1. " << fibonacci1 << "\n2. " << fibonacci2 << "\n";

for(int i=3;i<=fibonaccinumber;i++)
{fibonacci3 = fibonacci1 + fibonacci2;
//   cout << i << ". " << fibonacci3 << "\n";
fibonacci1=fibonacci2;
fibonacci2=fibonacci3;}

cout << "the " << fibonaccinumber << "th fibonacci number is " << fibonacci2;

string endprog;
getline(cin,endprog);
return 0;}  

Я не возился с произвольными точными поплавками этого lbrary, но когда я это сделаю, я продолжу расширять это руководство, если увижу, что люди заинтересованы в нем, спасибо за все комментарии и ответы.

4b9b3361

Ответ 1

На официальном сайте (http://www.ttmath.org/) samples использования целых чисел (ttmath::Int<2> a,b,c;) и плавающие точки (ttmath::Big<1,2> a,b,c;). Просто рассматривайте их как высокую точность int/float без членов, и все должно быть хорошо. Если ошибка остается, можете ли вы опубликовать полное сообщение об ошибке и строки кода, на которые он ошибся?

Ответ 2

Несколько возможностей MIRACL, NTL и LIP.

Ответ 3

Библиотека Boost.Multiprecision поддерживает произвольно длинные целые числа, действительные числа и отношения. Он также позволяет использовать различные серверные компоненты, которые имеют разные характеристики производительности и условия лицензирования.