C 환경에서 가장 유명한 오픈소스 고정밀(Multiprecision) 연산 라이브러리는 GNU Multiple Precision Arithmetic Library(GMP)일 것이다. GMP는 리눅스 환경에서 사용하기 간편하지만 윈도우(VC++)환경에서 사용하는 것은 쉽지 않으며 최신 버전에서는 VC++ 환경에서 빌드 가능한 솔루션을 제공하고 있기는 하나 여전히 불편하다. 윈도우(VC++)에서 고정밀 연산 라이브러리를 사용하려고 할 때 MPIR는 훌륭한 대안이다. MPIR는 GMP에서 fork 된 오픈소스 프로젝트이며 대부분의 코드가 GMP으로부터 왔고 추가 오리지널 기여 코드로 구성되어 있다. MPIR 개발자가 말하는 MPIR 프로젝트의 주 목적은 다음과 같다[1].
GPU와 멀티 코어 프로세서를 지원하는 병렬 알고리즘 고정밀 연산
GMP와의 호환성을 유지 - 따라서 MPIR는 GMP로도 대체될 수 있다.
리눅스, Mac OS, Solaris, 그리고 윈도 빌드 지원을 제공.
32비트, 64비트 윈도에서 마이크로소프트 기반 빌드 툴의 빌드를 지원
...라고 말은 하지만 결국 MPIR의 목적은 프로젝트의 부제 MPIR (GMP Windows fork)와 같이 윈도에서 GMP를 쉽게 사용하기 위함이다. GNU 계열 OS는 그냥 GMP 쓰면 된다.
gmpxx.h에서 알 수 있듯 GMP 코드와 완벽히 호환된다.
그리고 다음 클래스에 모든 연산자와 함수가 오버로드되어 있다.
mpz_class
mpq_class
mpf_class
For example.
int main (void) { mpz_class a, b, c; a = 1234; b = "-5678"; c = a+b; cout << "sum is " << c << "\n"; cout << "absolute value is " << abs(c) << "\n"; return 0; }
GMP의 C++ 클래스 오버로딩이 안 된 함수들(gcd 등)은 C++ 클래스를 GMP C 타입으로 바꿔야 하는데 그런 경우 각 클래스 안에 다음 메서드를 쓰면 된다. (mpz_t가 GMP C 타입)
mpz_t mpz_class::get_mpz_t()
즉, 다음 같은 코딩이 된다.
mpz_class a, b, c; ... mpz_gcd (a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t());
반대의 경우, 클래스는 GMP C 타입으로 클래스를 초기화하거나 명시적인 생성자를 사용하여 할당할 수 있다.
mpz_t z; // ... init and calculate z ... mpz_class x(z); mpz_class y; y = mpz_class (z);