<#include<boost/multiprecision/gmp.hpp>>
namespace boost{ namespace multiprecision{
class gmp_rational;
typedef number<gmp_rational >         mpq_rational;
}} 
При этом<gmp_rational>используется как<boost::multiprecision::mpq_rational>. Он действует как тонкая обертка вокругGMP<mpq_t>, чтобы обеспечить рациональный тип чисел, который является заменой для родных типов чисел C++, но с неограниченной точностью.
Как и обычные преобразования из арифметических и струнных типов, экземпляры<number<gmp_rational>>являются копируемыми и присваиваемыми из:
- GMPродные типы:<mpz_t>,<mpq_t>.
- <number<gmp_int>>.
Существует также двухаргументный конструктор, который принимает числитель и знаменатель (оба типа<number<gmp_int>>).
Существуют также функции, не являющиеся членами:
mpz_int numerator(const mpq_rational&);
mpz_int denominator(const mpq_rational&);
который возвращает числитель и знаменатель числа.
Также можно получить доступ к базовой функции<mpq_t>через функцию<data()>члена<mpq_rational>.
Что вы должны знать при использовании этого типа:
- По умолчанию построенные<mpq_rational>s имеют значение ноль (этоGMPповедение по умолчанию).
- Разбиение на ноль приводит к тому, что<std::overflow_error>выбрасывается.
- Преобразование из строки приводит к тому, что<std::runtime_error>выбрасывается, если строка не может быть интерпретирована как действительное рациональное число.
- В глобальные настройки библиотекиGMPизменений не вносится, поэтому этот тип может сосуществовать с существующимGMPкодом.
- Код в равной степени может использоваться сMPIRв качестве базовой библиотеки - действительно, это предпочтительный вариант на Win32.
#include <boost/multiprecision/gmp.hpp>
#include <boost/multiprecision/gmp.hpp>
#include <iostream>
int main()
{
   using namespace boost::multiprecision;
   mpq_rational v = 1;
   
   for(unsigned i = 1; i <= 1000; ++i)
      v *= i;
   v /= 10;
   std::cout << v << std::endl; 
   std::cout << numerator(v) << std::endl;
   std::cout << denominator(v) << std::endl;
   mpq_rational w(2, 3);  
   std::cout << w << std::endl; 
   
   mpq_t q;
   mpq_init(q);
   mpq_set(q, v.backend().data());
   mpq_clear(q);
   return 0;
}