| Home | Libraries | People | FAQ | More

### Using arbitrary precision floating point types

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 `min( x , y )`, `max( x , y )`, `pow( x , y )` must be callable.

The full example can be found at lorenz_gmpxx.cpp.