Обрабатывать целые числа произвольной длины в C ++ - PullRequest
13 голосов
/ 16 ноября 2011

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

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

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

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

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

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

  • ttmath (казалось многообещающим, скомпилировал некоторые БОЛЬШИЕ примеры программ и выполнил некоторые исправления из-за ошибок компиляции, непонятного синтаксиса из-за практически отсутствия документирования)

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

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

-> ОБНОВЛЕНИЕ

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

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

  • Windows 7 Ultimate x64

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

  • Код :: Блоки 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». »и нажмите« Установить как значение по умолчанию », затем на« Наборы инструментов »,« Каталог установки компиляторов, вы можете выбрать каталог установки компилятора или выполнить автоматическое обнаружение », и, отсортировав его по« Компилятору C ++ », выбрать или написать« mingw32- g ++. exe ". Если это произойдет с вами , просто сделайте это, в« Выбранном компиляторе »выберите« Компилятор GNU GCC »и нажмите« Установить по умолчанию »).

  • Не выходя из «Код: Блоки> Настройки> Компилятор и отладчик» и разобрав вышесказанное, перейдите в «Поиск по каталогам», а затем «Компилятор», нажмите «Добавить» и выберите папку, в которой вы храните свои библиотеки. или куда вы помещаете свою папку «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" на c ++), оно выигралоне компилировать, потому что присвоение значений переменным, подобным этому, независимо от размера, который вы указали ранее, целое число может быть таким же большим, как стандартный тип данных "long int" на c ++ (я решил это самостоятельно, сложный путь),также даже если вы используете значение, которое меньше, и оно хорошо компилируется, а затем вы запускаете вашу программу и она пытается записать в эту переменную большее число, чем число, которое может обработать упомянутый стандартный тип данных "long int", тогда ваша математикабудет неправильно, так что часыh это: чтобы присвоить значение переменной правильным образом вы должны присвоить его примерно так a = "333"; (да, я знаю, что вы в значительной степени относитесь к нему как к строке таким образом, но он будет выполнять операции простобез проблем, и если вы решите «переставить» переменную, то это никогда не будет экспоненциальным или научным результатом записи, как если бы вы использовали стандартные целочисленные типы данных, не будучи соединенными с некоторыми «дополнительными операторами» для правильного отображения числа)

ps Используя эти простые правила для работы с целыми числами и этой библиотекой, я вычислил числа Фибоначчи до 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;}  

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

Ответы [ 3 ]

4 голосов
/ 16 ноября 2011

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

0 голосов
/ 14 июня 2014

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

0 голосов
/ 16 ноября 2011

Возможны следующие варианты: MIRACL , NTL и LIP .

...