<#include<boost/multiprecision/tommath.hpp>>
namespace boost{ namespace multiprecision{
typedef rational_adpater<tommath_int>        tommath_rational;
typedef number<tommath_rational >         tom_rational;
}} 
При этом<tommath_rational>используется как<boost::multiprecision::tom_rational>. Он действует как тонкая обертка вокруг<boost::rational<tom_int>>, чтобы обеспечить рациональный тип чисел, который является заменой для родных типов чисел C++, но с неограниченной точностью.
Преимущество использования этого типа, а не<boost::rational<tom_int>>напрямую, заключается в том, что он активирован экспрессионным шаблоном, что значительно сокращает количество времен, созданных в сложных выражениях.
Существуют также функции, не являющиеся членами:
tom_int numerator(const tom_rational&);
tom_int denominator(const tom_rational&);
который возвращает числитель и знаменатель числа.
Что вы должны знать при использовании этого типа:
- По умолчанию построенные<tom_rational>s имеют значение ноль (это унаследованное Boost.Rational поведение).
- Разбиение на ноль приводит к тому, что<std::overflow_error>выбрасывается.
- Преобразование из строки приводит к тому, что<std::runtime_error>бросается, если строка не может быть интерпретирована как действительное рациональное число.
- Никаких изменений вlibtommathне вносится, поэтому этот тип может безопасно сосуществовать с другимlibtommathкодом.
- Производительность этого типа была признана довольно плохой - это требует дальнейшего расследования - но, похоже, что Boost. Рациональность нуждается в некотором улучшении в этой области.
#include <boost/multiprecision/tommath.hpp>
#include <iostream>
int main()
{
   using namespace boost::multiprecision;
   tom_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;
   tom_rational w(2, 3); 
   std::cout << w << std::endl; 
   return 0;
}