![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Use With User-Defined TypesBoost , Math Toolkit 2.5.0 , Tutorial
|
![]() |
Note |
---|---|
Повышаю. Математика не знает, как контролировать внутреннюю точность< |
Также можно контролировать, какой метод используется для построения константы, специализируя класс признаков<construction_traits
>:
namespace boost{ namespace math{ namespace constant{ template <class T, class Policy> struct construction_traits { typedef mpl::int_<N> type; }; }}} // namespaces
ЕслиNпринимает одно из следующих значений:
N |
значение |
---|---|
0 |
Точность недоступна во время компиляции; либо построить из десятичной строки цифры или вычислить на лету в зависимости от точности времени выполнения. |
1 |
Возврат поплавковой прецизионной постоянной. |
2 |
Возврат константы двойной точности. |
3 |
Возврат длинной константы двойной точности. |
4 |
Постройте результат из представления строки и кэшируйте результат. |
Любое другое значениеN |
Устанавливает точность времени компиляцииNбит. |
Кроме того, для определенных пользователем типов, требующих специальной обработки, можно частично специализировать внутреннюю структуру, используемую каждой константой. Например, предположим, что мы используем обертку C++ вокруг MPFR<mpfr_class
>: Это имеет свое собственное представление о Пи, которое мы вполне можем использовать вместо вышеупомянутого механизма. Мы можем достичь этого, специализируясь на шаблоне класса<boost::math::constants::detail::constant_pi
>:
namespace boost{ namespace math{ namespace constants{ namespace detail{ template<> struct constant_pi<mpfr_class> { template<int N> static mpfr_class get(const mpl::int_<N>&) { // The template param N is one of the values in the table above, // we can either handle all cases in one as is the case here, // or overload "get" for the different options. mpfr_class result; mpfr_const_pi(result.get_mpfr_t(), GMP_RNDN); return result; } }; }}}} // namespaces
Наконец, поскольку может быть сложно диагностировать, что делает метапрограммный код, существует диагностическая процедура, которая печатает информацию о том, как эта библиотека будет обрабатывать определенный тип.
#include <boost/math/constants/info.hpp> int main() { boost::math::constants::print_info_on_type<MyType>(); }
При желании вы также можете передать дополнительный аргумент std::ostream в функцию<print_info_on_type
>. Типичный вывод для определяемого пользователем типа выглядит следующим образом:
Information on the Implementation and Handling of Mathematical Constants for Type class boost::math::concepts::real_concept Checking for std::numeric_limits<class boost::math::concepts::real_concept> specialisation: no boost::math::policies::precision<class boost::math::concepts::real_concept, Policy> reports that there is no compile type precision available. boost::math::tools::digits<class boost::math::concepts::real_concept>() reports that the current runtime precision is 53 binary digits. No compile time precision is available, the construction method will be decided at runtime and results will not be cached - this may lead to poor runtime performance. Current runtime precision indicates that the constant will be constructed from a string on each call.
Статья Use With User-Defined Types раздела Math Toolkit 2.5.0 Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |