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

Using without expression templates for Boost.Test and others

Boost , Math Toolkit 2.5.0 , Using Boost.Math with High-Precision Floating-Point Libraries

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, определенные конструкции программ не будут компилироваться при использовании шаблонов выражения. Одним из примеров, с которым могут столкнуться многие пользователи, является Boost. Тест (1.54 и более ранний) при использовании макроса BOOST_CHECK_CLOSE и BOOST_CHECK_CLOSE_FRACTION.

Если, например, вы хотите использовать любой тип многоточности, такой как cpp_dec_float_50 вместо double, чтобы обеспечить большую точность, вам нужно будет переопределить по умолчанию boost::::et_on с boost::multiprecision::et_off.

#include <boost/multiprecision/cpp_dec_float.hpp>

Для определения типа 50 десятичных цифр с использованием cpp_dec_float необходимо передать два параметра шаблона boost::multiprecision::number.

Может быть более разборчивым использовать двухступенчатое определение типа, такое как:

typedef boost::multiprecision::cpp_dec_float<50> mp_backend;
typedef boost::multiprecision::number<mp_backend, boost::multiprecision::et_off> cpp_dec_float_50_noet;

Здесь мы сначала определяем mp_backend как cpp_dec_float с 50 цифрами. На втором шаге этот бэкэнд переходит к boost::множество ::число с boost::многообразие::et_off, перечисленный тип.

typedef boost::multiprecision::number<boost::multiprecision::cpp_dec_float<50>, boost::multiprecision::et_off>
cpp_dec_float_50_noet;

Вы можете уменьшить типизацию с помощью директивы , используя namespace boost::multiprecision; при желании, как показано ниже.

using namespace boost::multiprecision;

Теперь cpp_dec_float_50_noet или cpp_dec_float_50_et можно использовать в качестве прямой замены встроенных типов, таких как double и т.д.

BOOST_AUTO_TEST_CASE(cpp_float_test_check_close_noet)
{ // No expression templates/
  typedef number<cpp_dec_float<50>, et_off> cpp_dec_float_50_noet;
  std::cout.precision(std::numeric_limits<cpp_dec_float_50_noet>::digits10); // All significant digits.
  std::cout << std::showpoint << std::endl; // Show trailing zeros.
  cpp_dec_float_50_noet a ("1.0");
  cpp_dec_float_50_noet b ("1.0");
  b += std::numeric_limits<cpp_dec_float_50_noet>::epsilon(); // Increment least significant decimal digit.
  cpp_dec_float_50_noet eps = std::numeric_limits<cpp_dec_float_50_noet>::epsilon();
  std::cout <<"a = " << a << ",\nb = " << b << ",\neps = " << eps << std::endl;
  BOOST_CHECK_CLOSE(a, b, eps * 100); // Expected to pass (because tolerance is as percent).
  BOOST_CHECK_CLOSE_FRACTION(a, b, eps); // Expected to pass (because tolerance is as fraction).
} // BOOST_AUTO_TEST_CASE(cpp_float_test_check_close)
BOOST_AUTO_TEST_CASE(cpp_float_test_check_close_et)
{ // Using expression templates.
  typedef number<cpp_dec_float<50>, et_on> cpp_dec_float_50_et;
  std::cout.precision(std::numeric_limits<cpp_dec_float_50_et>::digits10); // All significant digits.
  std::cout << std::showpoint << std::endl; // Show trailing zeros.
  cpp_dec_float_50_et a("1.0");
  cpp_dec_float_50_et b("1.0");
  b += std::numeric_limits<cpp_dec_float_50_et>::epsilon(); // Increment least significant decimal digit.
  cpp_dec_float_50_et eps = std::numeric_limits<cpp_dec_float_50_et>::epsilon();
  std::cout << "a = " << a << ",\nb = " << b << ",\neps = " << eps << std::endl;
  BOOST_CHECK_CLOSE(a, b, eps * 100); // Expected to pass (because tolerance is as percent).
  BOOST_CHECK_CLOSE_FRACTION(a, b, eps); // Expected to pass (because tolerance is as fraction).

Используя cpp_dec_float_50 с включенным использованием шаблона выражения по умолчанию, сообщение об ошибке компилятора для 'BOOST_CHECK_CLOSE_FRACTION(a, b, eps); будет:

// failure floating_point_comparison.hpp(59): error C2440: 'static_cast' :
// cannot convert from 'int' to 'boost::multiprecision::detail::expression<tag,Arg1,Arg2,Arg3,Arg4>'

Полный пример кода находится на test_cpp_float_close_fraction.cpp


PrevUpHomeNext

Статья Using without expression templates for Boost.Test and others раздела Math Toolkit 2.5.0 Using Boost.Math with High-Precision Floating-Point Libraries может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Using Boost.Math with High-Precision Floating-Point Libraries ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 06:52:34/0.006260871887207/0