Add multi-precision type MPFRField based on mpreal and mpfr
Summary
Replace the outdated and deprecated library GMPXX by MPFR C++ (mpreal) in the backend of GMPField. The old GMPXX library is still supported but a warning will be emitted if the newer MPFR is not found.
Motivation
The old gmpcxx library lacks some implementations, e.g. of numeric_limits. Since the GMP library also recommends to switch to the (more up-to-date) library MPFR (See https://gmplib.org/manual/Floating_002dpoint-Functions.html and https://www.mpfr.org) for floating point arithmetic, I switched the backend from GMPXX to MPFR. The C++ wrapper is chosen to be MPFR C++ (mpreal) (https://github.com/advanpix/mpreal) since it is used in several other libraries, e.g. Eigen, boost::multiprecision. It can be used as a floating-point type in the Eigen linear algebra library and has much better support for std::numeric_limits.
Since in the Dune GMPField implementation, the precision is given by a template parameter, some numeric_limits constants can be filled with concrete values.
The MPFR and MPFR-C++ library are available in the Ubuntu and Debian repositories (libmpfr-dev and libmpfrc++-dev).
The Dune wrapper class GMPField is only changed internally and is provided with the same template arguments and members as before. Also the preprocessor constant HAVE_GMP is used as before. But new constants are added to distinguish between the actual backend to use, i.e. HAVE_MPFR and HAVE_GMPXX. Note that libmpfr is itself based on gmp. (or at least a minimal version of it)
TODO
-
Add packages for libmpfr and libmpfrc++ to docker images for the CI system.