Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Use With User-Defined Types

Boost , Math Toolkit 2.5.0 , Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Наиболее распространенным примером высокоточного пользовательского типа, вероятно, будетBoost.Multiprecision..

Синтаксис для использования констант вызова функций с определяемыми пользователем типами такой же, как и в классе шаблонов, то есть мы используем:

#include <boost/math/constants/constants.hpp>
boost::math::constants::pi<UserDefinedType>();

Например:

boost::math::constants::pi<boost::multiprecision::cpp_dec_float_50>();

Дающий π с точностью 50 десятичных цифр.

Однако, поскольку точность определяемого пользователем типа может быть намного выше, чем у встроенных типов с плавающей запятой, способ создания возвращаемого значения выглядит следующим образом:

  • Если точность типа известна во время компиляции:
    • Если точность меньше или равна точности<float>, а тип можно построить из<float>, то наш код возвращает<float>буквальный. Если определяемый пользователем тип является буквальным, то вызов функции, возвращающий константу, будет<constexp>.
    • Если точность меньше или равна точности<double>, а тип можно построить из<double>, то наш код возвращает буквальный<double>. Если определяемый пользователем тип является буквальным, то вызов функции, возвращающий константу, будет<constexp>.
    • Если точность меньше или равна точности<longdouble>, а тип можно построить из<long double>, то наш код возвращает<longdouble>буквальный. Если определяемый пользователем тип является буквальным, то вызов функции, возвращающий константу, будет<constexp>.
    • Если точность меньше или равна точности<__float128>(и компилятор поддерживает такой тип), а тип конструируется из<__float128>, то наш код возвращает буквальный<__float128>. Если определяемый пользователем тип является буквальным, то вызов функции, возвращающий константу, будет<constexp>.
    • Если точность меньше 100 десятичных цифр, то константа будет построена (только один раз, затем кэширована безопасным способом) из струнного представления константы. В этом случае значение возвращается в качестве ссылки на кэшированное значение.
    • В противном случае значение вычисляется (только один раз, затем кэшируется безопасным способом). В этом случае значение возвращается в качестве ссылки на кэшированное значение.
  • Если точность неизвестна во время компиляции, то:
    • Если точность времени выполнения (полученная от вызова к<boost::math::tools::digits<T>()>) составляет менее 100 десятичных цифр, то константа строится «на лету» из струнного представления константы.
    • В противном случае значение строится «на лету» путем вычисления значения постоянной с использованием текущей по умолчанию точности типа. Обратите внимание, что это может сделать использование констант довольно дорогим.

Кроме того, можно передать<Policy>тип в качестве второго аргумента шаблона и использовать его для контроля точности:

#include <boost/math/constants/constants.hpp>
typedef boost::math::policies::policy<boost::math::policies::digits2<80> > my_policy_type;
boost::math::constants::pi<MyType, my_policy_type>();
[Note] Note

Повышаю. Математика не знает, как контролировать внутреннюю точность<MyType>, политика просто контролирует, как осуществляется процесс выбора выше, и точность расчета, если вычисляется результат.

Также можно контролировать, какой метод используется для построения константы, специализируя класс признаков<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бит.

Custom Specializing a constant

Кроме того, для определенных пользователем типов, требующих специальной обработки, можно частично специализировать внутреннюю структуру, используемую каждой константой. Например, предположим, что мы используем обертку 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
Diagnosing what meta-programmed code is doing

Наконец, поскольку может быть сложно диагностировать, что делает метапрограммный код, существует диагностическая процедура, которая печатает информацию о том, как эта библиотека будет обрабатывать определенный тип.

#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.

PrevUpHomeNext

Статья Use With User-Defined Types раздела Math Toolkit 2.5.0 Tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:43:55/0.0047948360443115/0