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

Using arbitrary precision floating point types

Boost , Chapter 1. Boost.Numeric.Odeint , Tutorial

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

Boost C++ LibrariesHomeLibrariesPeopleFAQMore

PrevUpHomeNext

Иногда требуются результаты с более высокой точностью, чем при стандартных типах плавающих точек. Поскольку одеинт позволяет настроить основной численный тип, он хорошо подходит для работы с произвольными типами точности. Поэтому нужна только библиотека, которая предоставляет тип, представляющий значения с произвольной точностью и фундаментальными операциями для этих значений.Повышение.УмножениеЭто библиотека, которая делает именно это. Использование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.


PrevUpHomeNext

Статья Using arbitrary precision floating point types раздела Chapter 1. Boost.Numeric.Odeint Tutorial может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Tutorial ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 00:56:57/0.0031828880310059/0