如何在 C++ 中处理大至 2^9000000 的整数
How to work on intergers as large as 2^9000000 in C++
我所知道的正整数的最大数据类型是unsigned long long。有没有办法在 C++ 中处理大至 2^9000000 的整数。
我在代码块中使用 gcc 编译器,但也可以在 visual studio.
上工作
您需要某种 BigInt 库。我个人更喜欢 boost.multiprecision,因为它包含了普通代码编写者需要的大部分实用程序。
就您实际想要使用的内容而言,有两种明显的类型需要考虑。
- 如果您只需要任意大小的整数,
boost::multiprecision::cpp_int
是可行的方法,它将通过分配大约 900 万位数据(略多于 1 兆字节)来存储 2^9000000 这样大的数字并将整个数字存储在那里。
- 如果您需要大数字,但不需要保留每个最后一位数字的精度,您会更喜欢
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
我不知道你的用例是什么,但我的猜测是后者比前者更适合你的用例。你必须自己决定是什么情况。
我所知道的正整数的最大数据类型是unsigned long long。有没有办法在 C++ 中处理大至 2^9000000 的整数。 我在代码块中使用 gcc 编译器,但也可以在 visual studio.
上工作您需要某种 BigInt 库。我个人更喜欢 boost.multiprecision,因为它包含了普通代码编写者需要的大部分实用程序。
就您实际想要使用的内容而言,有两种明显的类型需要考虑。
- 如果您只需要任意大小的整数,
boost::multiprecision::cpp_int
是可行的方法,它将通过分配大约 900 万位数据(略多于 1 兆字节)来存储 2^9000000 这样大的数字并将整个数字存储在那里。 - 如果您需要大数字,但不需要保留每个最后一位数字的精度,您会更喜欢
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
我不知道你的用例是什么,但我的猜测是后者比前者更适合你的用例。你必须自己决定是什么情况。