Как работать с целыми числами размером до 2 ^ 9000000 в С++

Самый большой известный мне тип данных для положительных целых чисел — unsigned long long. Есть ли способ работать с целыми числами размером 2 ^ 9000000 в С++. Я использую компилятор gcc в кодовых блоках, но могу работать и в Visual Studio.


person Usama Tahir    schedule 05.11.2019    source источник
comment
Это зависит от того, что вы хотите сделать со значением.   -  person Patrick Trentin    schedule 05.11.2019
comment
Один из вариантов — использовать большую целочисленную библиотеку.   -  person    schedule 05.11.2019
comment
Вы можете использовать такую ​​библиотеку, как GMP. Попытка сделать все, что дает вам такая библиотека, вручную, скорее всего, потребует человеко-лет работы. Просто используйте уже существующую библиотеку произвольной точности.   -  person Jesper Juhl    schedule 05.11.2019
comment
Существует также https://www.boost.org/doc/libs/1_71_0/libs/multiprecision/doc/html/index.html   -  person drescherjm    schedule 05.11.2019
comment
Есть ли способ работать с целыми числами размером до 2^9000000 в C++? Ничего не встроено в язык. Либо используйте библиотеку, либо напишите свою собственную (только академические упражнения).   -  person drescherjm    schedule 05.11.2019
comment
@drescherjm Это тоже хороший вариант. И еще: en.m.wikipedia.org/wiki/   -  person Jesper Juhl    schedule 05.11.2019
comment
Очень часто, когда вы сталкиваетесь с такой проблемой, вы можете использовать трюк. Модульное возведение в степень является классическим, чтобы избежать обработки таких больших чисел.   -  person user4581301    schedule 05.11.2019


Ответы (1)


Вам нужна какая-то библиотека BigInt. Лично я предпочитаю boost.multiprecision, поскольку он содержит большинство утилит, которые потребуются среднему программисту.

С точки зрения того, что вы на самом деле хотите использовать, есть два очевидных типа, которые следует учитывать.

  • Если вам просто нужны целые числа произвольного размера, boost::multiprecision::cpp_int — это путь, который будет хранить число размером 2 ^ 9000000, выделяя примерно 9 миллионов бит данных (чуть больше одного мегабайта) и сохраняя там все число.
  • Если вам нужны большие числа, но вам не нужно сохранять точность каждой последней цифры, вы предпочтете что-то вроде cpp_bin_float бэкенда, хотя для этого вам, вероятно, придется определить свой собственный шаблон, поскольку предварительно запеченные версии, вероятно, не недостаточно большой.

Для последнего потенциальный пример:

using namespace boost::multiprecision;
using my_big_float = number<backends::cpp_bin_float<100, backends::digit_base_2, void, boost::int32_t, -9000000, 9000000>, et_off>;
//Defines the number to have 100 bits of precision, an exponent range from negative
//nine million to positive nine million, and uses 32-bit ints for the internal representation
//of the exponent. Allocator is void (because we don't need it) and et_off just turns off 
//expression templates, which we don't need

int main() {
    my_big_float fl = 5;
    fl = pow(fl, my_big_float{900007});
    std::cout << fl << std::endl;
}

7.88302e+629077

I don't know what your use-case is, but my guess is that the latter is going to be much better for your use-case than the former. You'll have to decide for yourself what the case is.

person Xirema    schedule 05.11.2019