Общее числовое программирование использует шаблоны для использования одного и того же кода для различных типов и функций с плавающей запятой. Рассмотрим область окружности a радиуса r, данную
Область круга может быть вычислена в общем программировании с использованием Boost. Математика для константы π как показано ниже:
#include <boost/math/constants/constants.hpp>
template<typename T>
inline T area_of_a_circle(T r)
{
using boost::math::constants::pi;
return pi<T>() * r * r;
}
Можно использовать<area_of_a_circle()
>со встроенными типами плавающих точек, а также с типами плавающих точек от Boost. Многоточность. В частности, рассмотрим систему с 4-байтовым одноточным поплавком, 8-байтным двухточным двойным, а также типом данных<cpp_dec_float_50
>от Boost. Многоточность с 50 десятичными цифрами точности.
Мы можем вычислить и распечатать приблизительную площадь круга с радиусом 123/100 для<float
>,<double
>и<cpp_dec_float_50
>с помощью программы ниже.
#include <iostream>
#include <iomanip>
#include <boost/multiprecision/cpp_dec_float.hpp>
using boost::multiprecision::cpp_dec_float_50;
int main(int, char**)
{
const float r_f(float(123) / 100);
const float a_f = area_of_a_circle(r_f);
const double r_d(double(123) / 100);
const double a_d = area_of_a_circle(r_d);
const cpp_dec_float_50 r_mp(cpp_dec_float_50(123) / 100);
const cpp_dec_float_50 a_mp = area_of_a_circle(r_mp);
std::cout
<< std::setprecision(std::numeric_limits<float>::digits10)
<< a_f
<< std::endl;
std::cout
<< std::setprecision(std::numeric_limits<double>::digits10)
<< a_d
<< std::endl;
std::cout
<< std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10)
<< a_mp
<< std::endl;
}
В следующем примере мы рассмотрим вызов как стандартной библиотеки, так и Boost. Математические функции внутри общего кода. Мы также покажем, как справляться с аргументами шаблонов, которые являются шаблонами выражений, а не типами чисел.