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