Все специальные функции в этой библиотеке бывают двух перегруженных форм, одна с конечным параметром «политики», а другая без. Например:
namespace boost{ namespace math{
template <class RealType, class Policy>
RealType tgamma(RealType, const Policy&);
template <class RealType>
RealType tgamma(RealType);
}}
Как правило, вторая версия представляет собой просто пересылающую обертку к первой такой:
template <class RealType>
inline RealType tgamma(RealType x)
{
return tgamma(x, policies::policy<>());
}
Поэтому называть специальную функцию конкретной политикой — это всего лишь вопрос определения типа политики для использования и передачи ее в качестве конечного параметра. Например, предположим, что мы хотим<tgamma
>вести себя в C-совместимой манере и установить<::errno
>, когда происходит ошибка, и никогда не выбрасывать исключение:
#include <boost/math/special_functions/gamma.hpp>
using boost::math::tgamma;
using namespace boost::math::policies;
using boost::math::policies::policy;
using boost::math::policies::evaluation_error;
using boost::math::policies::domain_error;
using boost::math::policies::overflow_error;
using boost::math::policies::domain_error;
using boost::math::policies::pole_error;
using boost::math::policies::errno_on_error;
using boost::math::policies::ignore_error;
using boost::math::policies::throw_on_error;
using boost::math::policies::user_error;
typedef policy<
domain_error<errno_on_error>,
pole_error<errno_on_error>,
overflow_error<errno_on_error>,
evaluation_error<errno_on_error>
> c_policy;
int main()
{
errno = 0;
cout << "Result of tgamma(30000) is: "
<< tgamma(30000, c_policy()) << endl;
cout << "errno = " << errno << endl;
cout << "Result of tgamma(-10) is: "
<< boost::math::tgamma(-10, c_policy()) << endl;
cout << "errno = " << errno << endl;
}
который выдает:
Result of tgamma(30000) is: 1.#INF
errno = 34
Result of tgamma(-10) is: 1.#QNAN
errno = 33
Альтернативно, для специального использования мы можем использовать функцию помощника<make_policy
>для создания политики для нас: это использование более многословно, поэтому, вероятно, предпочтительнее, когда политика будет использоваться только один раз:
#include <boost/math/special_functions/gamma.hpp>
using boost::math::tgamma;
int main()
{
using boost::math::policies::errno_on_error;
using boost::math::policies::make_policy;
using boost::math::policies::pole_error;
using boost::math::policies::domain_error;
using boost::math::policies::overflow_error;
using boost::math::policies::evaluation_error;
errno = 0;
std::cout << "Result of tgamma(30000) is: "
<< boost::math::tgamma(
30000,
make_policy(
domain_error<errno_on_error>(),
pole_error<errno_on_error>(),
overflow_error<errno_on_error>(),
evaluation_error<errno_on_error>()
)
) << std::endl;
std::cout << "errno = " << errno << std::endl;
std::cout << "Result of tgamma(-10) is: "
<< boost::math::tgamma(
-10,
make_policy(
domain_error<errno_on_error>(),
pole_error<errno_on_error>(),
overflow_error<errno_on_error>(),
evaluation_error<errno_on_error>()
)
) << std::endl;
std::cout << "errno = " << errno << std::endl;
}