Следующий код использует<<boost/cstdfloat.hpp>
>в сочетании с<<boost/math/special_functions.hpp>
>для вычисления упрощенной версии функцииЯнке-Эмден-Ламбда.. Здесь мы указываем тип плавающей точки сровно 64 битами(т.е.<float64_t
>). Если бы мы использовали, например, встроенный<double
>, то не было бы никакой гарантии, что код будет вести себя одинаково на всех платформах. При этом<float64_t
>из<<boost/cstdfloat.hpp>
>, скорее всего, будет идентичным.
Используя<float64_t
>, мы знаем, что этот код является настолько портативным, насколько это возможно, и использует тип с плавающей точкой с приблизительно 15 десятичными цифрами точности, независимо от компилятора или версии или операционной системы.
#include <boost/cstdfloat.hpp>
#include <cmath>
#include <boost/math/special_functions.hpp>
boost::float64_t jahnke_emden_lambda(boost::float64_t v, boost::float64_t x)
{
const boost::float64_t gamma_v_plus_one = boost::math::tgamma(v + 1);
const boost::float64_t x_half_pow_v = std::pow(x /2, v);
return gamma_v_plus_one * boost::math::cyl_bessel_j(x, v) / x_half_pow_v;
}
Убедитесь, что показаны все, возможно, значимые цифры (17), включая нули.
std::cout.precision(std::numeric_limits<boost::float64_t>::max_digits10);
std::cout.setf(std::ios::showpoint);
try
{
boost::float64_t v = 1.;
boost::float64_t x = 1.;
std::cout << jahnke_emden_lambda(v, x) << std::endl;
Подробнее см.cstdfloat_example.cpp- обширная примерная программа.
В этом примере показаны таблицы печати PDF и CDF нормального распределения с использованием<boost::math
>реализации нормального распределения.
Функция, созданная на типе с плавающей точкой, печатает таблицу для ряда стандартных значений z.
В примере показано использование указанных широтных типдефов либо для использования определенной ширины, либо для использования максимума, доступного на платформе, возможно, высотой 128 бит.
Количество отображаемых цифр контролируется точностью типа, поэтому нет ложных незначительных десятичных цифр:
float_32_t 0 0.39894228
float_128_t 0 0.398942280401432702863218082711682655
Некоторые выходные данные для двух различных платформ прилагаются к коду по адресуnormal_tables.cpp.
#ifdef BOOST_FLOAT32_C
normal_table<boost::float32_t>();
#endif
normal_table<boost::float64_t>();
#ifdef BOOST_FLOAT80_C
normal_table<boost::float80_t>();
#endif
#ifdef BOOST_FLOAT128_C
normal_table<boost::float128_t>();
#endif
normal_table<boost::floatmax_t>();