C++의 기본 자료형은 저장할 수 있는 값의 범위가 제한되어 있습니다. 예를 들어 long long 타입도 64비트 범위를 넘어서는 수는 표현할 수 없죠. 하지만 Boost 라이브러리를 사용하면 이러한 한계를 쉽게 극복할 수 있습니다.
Boost는 C++ 생태계에서 가장 널리 사용되는 라이브러리 중 하나로, 다양한 분야에서 활용됩니다. 특히 Boost의 multiprecision 모듈을 이용하면 264를 훨씬 넘어서는 매우 큰 숫자도 문제없이 다룰 수 있습니다.
고정 정밀도 정수 타입
Boost 라이브러리는 int128_t, int256_t, int512_t, int1024_t 같은 고정 정밀도 정수 타입을 제공합니다. 이를 활용하면 최대 1024비트까지의 정밀도를 손쉽게 확보할 수 있습니다.
먼저, 두 개의 매우 큰 숫자를 곱하는 예제를 살펴보겠습니다.
예제 코드
#include<iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
using namespace std;
int128_t large_product(long long n1, long long n2) {
int128_t ans = (int128_t) n1 * n2;
return ans;
}
int main() {
long long num1 = 98745636214564698;
long long num2 = 7459874565236544789;
cout << "Product of " << num1 << " * " << num2 << " = " <<
large_product(num1, num2);
}
실행 결과
Product of 98745636214564698 * 7459874565236544789 =
736630060025131838840151335215258722
long long 두 개를 곱하면 결과값이 64비트 범위를 초과하지만, int128_t로 캐스팅한 후 연산하면 오버플로우 없이 정확한 결과를 얻을 수 있습니다.
임의 정밀도 정수 타입 (cpp_int)
Boost는 또 하나의 강력한 타입인 임의 정밀도(Arbitrary Precision) 정수 타입을 제공합니다. 바로 cpp_int인데요, 이 타입은 필요한 정밀도를 런타임에 자동으로 할당해 주기 때문에 미리 비트 크기를 지정할 필요가 없습니다.
다음은 cpp_int를 사용해 50 팩토리얼(50!)을 계산하는 예제입니다. 50!은 약 65자리에 달하는 거대한 숫자이기 때문에 일반 자료형으로는 절대 표현할 수 없습니다.
예제 코드
#include<iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
using namespace std;
cpp_int large_fact(int num) {
cpp_int fact = 1;
for (int i = num; i > 1; --i)
fact *= i;
return fact;
}
int main() {
cout << "Factorial of 50: " << large_fact(50) << endl;
}
실행 결과
Factorial of 50:
30414093201713378043612608166064768844377641568960512000000000000
정리
이처럼 Boost 라이브러리를 활용하면 C++에서 기본 자료형의 한계를 넘어선 큰 숫자를 간편하게 처리할 수 있습니다.
- 고정 정밀도가 필요하다면:
int128_t,int256_t,int1024_t등을 사용하세요. - 유연한 크기가 필요하다면: 실행 시점에 정밀도가 자동 조절되는
cpp_int를 사용하세요.
암호화, 수학적 계산, 경쟁 프로그래밍 등 큰 숫자 연산이 필요한 상황이라면 Boost multiprecision 라이브러리가 훌륭한 선택이 될 것입니다.