Related sites: University of Antwerp | Department of Mathematics and Computer Science

# CANT Research Group

Navigation: Precompiler
^ TOP

## Conversion example for the ARPREC library

Here we show that the precompiler is also suitable for other C++ libraries such as ARPREC. We take the following example code, this converges a to the value 3 as described in the paper ARPREC: An Arbitrary Precision Computation Package:

    #include <iostream>
    using namespace std;

    int main() {
      double a=1.0, b=9.03, c=6.01;

      for( int i=0; i < 80000; i++ ){
        a=((a*a)+b)/c;
      }

      cout << "a=" << a << endl;

      double d=3.0;
      cout << "3.0-a="<<d-a<<endl;

      return 0;
    }

This is standard c++ code using double precision and when we run it we get the following output:

    wschrep@pascal:~/arprec/cpp> g++ -O2 -Wall arprec_example.cpp -o arprec_example
    wschrep@pascal:~/arprec/cpp> ./arprec_example
    a=3
    3.0-a=1.33227e-13

Using an appropriate configuration file aprec.xml we can convert this example to multi-precision automatically:

    wschrep@pascal:~/arprec/cpp> precompile -x arprec.xml arprec_example.cpp arprec_example_pre.cpp
    wschrep@pascal:~/arprec/cpp> cat arpec_example_pre.cpp

    #include <iostream>
    #include <iomanip>
    using namespace std;

    #include <arprec/mp_real.h>

    #include <iostream>
    using namespace std;

    int main() {

        mp::mp_init(400);

      mp_real a= mp_real( 1.0 );mp_real  b= mp_real( 9.03 );mp_real  c= mp_real( 6.01 );

      for( int i=0; i < 80000; i++ ){
        a=((a*a)+b)/c;
      }

      cout << "a=" << a << endl;

      mp_real d= mp_real( 3.0 );
      cout << "3.0-a="<<d-a<<endl;

      return 0;
    }

Now we can compile and run our converted example which will now run in 400 requested digits precision and get this as output:

    wschrep@pascal:~/arprec/cpp> g++ -I ../include/ -O2 -Wall arprec_example_pre.cpp -o arprec_example_pre ../src/libarprec.a
    wschrep@pascal:~/arprec/cpp> ./arprec_example_pre
    a=10 ^         0 x  3.,

    3.0-a=10 ^       -60 x  1.36805748486673986331724833453095150520711486802840120545,

As future work we could add an extra <exit> tag so that the insertion of mp::mp_finalize(); before the return statement is also automated (for this short example we just left it out and it seems to run fine without it).