This module wraps the MPFR library functions. The MPFR library is a C library for multiple-precision floating-point computations with exact rounding (also called correct rounding). It is based on the GMP multiple-precision C library. The main goal of MPFR is to provide a library for multiple-precision floating-point computation which is both efficient and has a well-defined semantics. It copies the good ideas from the ANSI/IEEE-754 standard for double-precision floating-point arithmetic (53-bit mantissa). It also offers a wide range of trig, log, and other functions, and constants. MPFR, like GMP, is free. It is distributed under the GNU Lesser General Public License (GNU Lesser GPL). Because this module wraps the MPFR functions, it requires that both the GMP C library and the MPFR C library have been installed. For the GMP library see: https://gmplib.org For the MPFR library see: https://www.mpfr.org Minimum required version of gmp is gmp-4.2.0. Minimum required version of mpfr is mpfr-3.0.0. You'll get errors if you try to build Math::MPFR against an insufficiently recent version of the mpfr library. Some features of Math::MPFR require later versions of the gmp and mpfr libraries. If the versions are not sufficiently recent, then those features will not be available. To build this module you need perl 5.6.0 or later. I'm not sure of all the requirements to get it to build with earlier versions of perl, but it's definite that the XS code relating to operator overloading will not compile with perl versions prior to 5.6. Build in the usual way: perl Makefile.PL make make test make install When building this module, the GMP and MPFR libraries will need to be accessible. If those files are in a location where your compiler does not find them by default, then instead of running 'perl Makefile.PL', you'll need to run: perl Makefile.pl INC="-I/path/to/gmp_includes -I/path/to/mpfr_includes" LIBS="-L/path/to/mpfr_lib -lmpfr -L/path/to/gmp_lib -lgmp" Other commandline args you may want to provide to 'perl Makefile.PL' are D64=1 (for _Decimal64 support) and F128=1 (for __float128 support). See the Decimal64 and Float128 sections (below). ================================== 64-bit-int and long double support ================================== If your perl's Config reports that 'ivsize' is greater than or equal to 8 && 'ivtype' is not 'long', then Math::MPFR will, by default, be built with access to the mpfr_*_uj and mpfr_*_sj functions. Else, access to those functions is, by default, denied. You can override the default by opening up the Makefile.PL and uncommenting the appropriate line (just a few lines down from the top of the file ... the comments in that file should make it clear). Similarly, if your perl's Config reports that 'nvsize' is greater than 8 then Math::MPFR will be built with access to the mpfr_*_ld functions. Else, access to those functions is, by default, denied. Again, you can override the default by opening up the Makefile.PL and uncommenting the appropriate line. I believe it to be both unnecessary and inadvisable to override the default - but if you do find that you need to override the default, please let me know. That you have found it necessary to override the default is something I probably ought to know about. I am contactable by email at sisyphus at(@) cpan dot (.) org. =================================== Decimal64 and Decimal128 conversion =================================== The functions Rmpfr_set_DECIMAL64 and Rmpfr_get_DECIMAL64 allow conversion between Math::Decimal64 (_Decimal64) and Math::MPFR (mpfr_t) objects. For this feature to be available you firstly need a compiler that has the _Decimal64 data type. You'll also need to have a recent version of the mpfr library that has been built with _Decimal64 support (ie that was configured with '--enable-decimal-float'). This should all be detected and enabled automatically whenever these conditions are met. To utilise mpfr's _Decimal64 functionality you also need to install Math::Decimal64. If you wish to override the automated procedure you can: 1) avoid _Decimal64 support by providing D64=0 as an argument to the Makefile.PL - ie run 'perl Makefile.PL D64=0'; 2) ensure _Decimal64 support by providing the argument D64=1. You can aternatively override the automated procedure by uncommenting one of a number of lines of code near the start of the Makefile.PL. (The comments in the Makefile.PL are a clear statement of what's required for this.) Note that forcing 'D64=1' will not work unless the conditions mentioned earlier in this section are met. The above holds true also for the Math::Decimal128 and the _Decimal128 type. Just replace all occurrences of "64" with "128". ========================================================= Conversion between Math::Float128 and Math::MPFR objects ========================================================= If 'perl -V:nvtype' reports __float128, see also the section 'Conversion between __float128 NV and Math::MPFR objects', below. This section deals only with conversion between Math::Float128 and Math::MPFR objects - and if your nvtype is __float128 there's probably nothing to be gained by calling on Math::Float128. The functions Rmpfr_set_FLOAT128 and Rmpfr_get_FLOAT128 allow conversion between Math::Float128 (__float128) and Math::MPFR (mpfr_t) objects. For this feature to be available you firstly need a compiler that has the __float128 data type. You'll also need to have a recent version (4.0.0 or later) of the mpfr library that has been built with __float128 support (ie that was configured with'--enable-float128'). This should all be detected and enabled automatically whenever these conditions are met. To utilise mpfr's __float128 functionality in this way you also need to install Math::Float128. If you wish to override the automated detection you can: 1) avoid __float128 support by providing F128=0 as an argument to the Makefile.PL - ie run 'perl Makefile.PL F128=0'; 2) ensure __float128 support by providing the argument F128=1. You can aternatively override the automated procedure by uncommenting one of a number of lines of code near the start of the Makefile.PL. (The comments in the Makefile.PL are a clear statement of what's required for this.) Note that forcing inclusion of __float128 support will not work unless the conditions mentioned earlier in this section are met. ========================================================== Conversion between Math::LongDouble and Math::MPFR objects ========================================================== There are 2 functions provided for conversion between Math::LongDouble and Math::MPFR objects: Rmpfr_set_LD (assign the value of a Math::LongDouble object to a Math::MPFR object) Rmpfr_get_LD (assign the value of a Math::MPFR object to a Math::Long Double object) If your perl's nvtype is long double, just use Rmpfr_set_ld and Rmpfr_get_ld instead. Math::LongDouble provides 'long double' support for perls whose nvtype is other than 'long double'. ======================================================= Conversion between __float128 NV and Math::MPFR objects ======================================================= To determine your nvtype, run 'perl -V:nvtype'. As of perl-5.21.4 it is possible to build perl with an nvtype of __float128. This is achieved by specifying -Dusequadmath as a Configure arg .... but, it will not work for all architectures and compilers. If $Config{nvtype} specifies '__float128' && if your mpfr library (need 4.0.0 or later) was built with --enable-float128 then you can pass your __float128 NV values to and from Math::MPFR using the Rmpfr_set_float128() and Rmpfr_get_float128() functions. And the overloaded operations will also accept the __float128 NV arguments as one would want. This should all be detected and enabled automatically whenever these conditions are met. NOTE: Even if the mpfr library was not built with __float128 support and the conditions are therefore not met, you can still pass and receive __float128 values to/from Math::MPFR by instead using the functions Rmpfr_get_NV and Rmpfr_set_NV - but that happens only if your nvtype is __float128. If you need/wish to override the automated procedure you can: 1) avoid __float128 support by providing F128=0 as an argument to the Makefile.PL - ie run 'perl Makefile.PL F128=0'; 2) ensure __float128 support by providing the argument F128=1. You can aternatively override the automated procedure by uncommenting one of a number of lines of code near the start of the Makefile.PL. (The comments in the Makefile.PL are a clear statement of what's required for this.) Note that forcing inclusion of __float128 support will not work unless the conditions mentioned earlier in this section are met.