![]()  | 
![]() ![]() ![]() ![]()  | 
![]()  | 
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.
реклама  |