![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Using arbitrary precision floating point typesBoost , Chapter 1. Boost.Numeric.Odeint , Tutorial
|
![]() | Home | Libraries | People | FAQ | More |
Иногда требуются результаты с более высокой точностью, чем при стандартных типах плавающих точек. Поскольку одеинт позволяет настроить основной численный тип, он хорошо подходит для работы с произвольными типами точности. Поэтому нужна только библиотека, которая предоставляет тип, представляющий значения с произвольной точностью и фундаментальными операциями для этих значений.Повышение.УмножениеЭто библиотека, которая делает именно это. ИспользованиеBoost.MultiprecisionРешить оды одеином очень просто, как показывает следующий пример.
Здесь мы используем<cpp_dec_float_50
>в качестве основного типа значений, который обеспечивает точные вычисления до 50 десятичных цифр.
#include <boost/numeric/odeint.hpp> #include <boost/multiprecision/cpp_dec_float.hpp> using namespace std; using namespace boost::numeric::odeint; typedef boost::multiprecision::cpp_dec_float_50 value_type; typedef boost::array< value_type , 3 > state_type;
В качестве примера ODE снова выбрана система Лоренца, но здесь мы должны убедиться, что все константы инициализированы в качестве высокоточных значений.
struct lorenz { void operator()( const state_type &x , state_type &dxdt , value_type t ) const { const value_type sigma( 10 ); const value_type R( 28 ); const value_type b( value_type( 8 ) / value_type( 3 ) ); dxdt[0] = sigma * ( x[1] - x[0] ); dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; dxdt[2] = -b * x[2] + x[0] * x[1]; } };
Таким образом, фактическая интеграция идет вперед:
state_type x = {{ value_type( 10.0 ) , value_type( 10.0 ) , value_type( 10.0 ) }}; cout.precision( 50 ); integrate_const( runge_kutta4< state_type , value_type >() , lorenz() , x , value_type( 0.0 ) , value_type( 10.0 ) , value_type( value_type( 1.0 ) / value_type( 10.0 ) ) , streaming_observer( cout ) );
Полный пример можно найти наlorenz_mp.cpp. Другой пример, который сравнивает точность высокоточного типа со стандартным двойным, можно найти наcmp_precision.cpp..
Кроме того, одеинт также может быть запущен с другими многоточными библиотеками, напримерgmp. Пример этого приведен вlorenz_gmpxx.cpp.
Статья Using arbitrary precision floating point types раздела Chapter 1. Boost.Numeric.Odeint Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |