<#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;
}