...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Home | Libraries | People | FAQ | More |
Besides the classical floating point number like float
,
double
, complex< double >
you can also use arbitrary precision
types, like the types from gmp and
mpfr. But you have to be careful
about instantiating any numbers.
For gmp types you have to set the default precision before any number is
instantiated. This can be done by calling mpf_set_default_prec( precision )
as the first function in your main program.
Secondly, you can not use any global constant variables since they will not
be set with the default precision you have already set.
Here is a simple example:
typedef mpf_class value_type; typedef boost::array< value_type , 3 > state_type; struct lorenz { void operator()( const state_type &x , state_type &dxdt , value_type t ) const { const value_type sigma( 10.0 ); const value_type R( 28.0 ); const value_type b( value_type( 8.0 ) / value_type( 3.0 ) ); 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]; } };
which can be integrated:
const int precision = 1024; mpf_set_default_prec( precision ); state_type x = {{ value_type( 10.0 ) , value_type( 10.0 ) , value_type( 10.0 ) }}; cout.precision( 1000 ); 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 ) );
Caution | |
---|---|
The full support of arbitrary precision types depends on the functionality
they provide. For example, the types from gmp are lacking of functions
for calculating the power and arbitrary roots, hence they can not be used
with the controlled steppers. In detail, for full support the |
The full example can be found at lorenz_gmpxx.cpp.