0.19 (unreleased)



  • The real128 string representation has been changed to use the g format specifier (#213).


  • Fix compilation with older clang versions in C++17 mode (#213).

0.18 (14-02-2020)


  • Add a mppp::real::is_valid() member function to check if a real was moved from (#211).

  • Implement user-defined literals for integer (#209).

  • Implement (modular) squaring primitives for integer (#205).

  • Include mp++’s headers in the project files generated for MSVC (#199). Many thanks to 7ofNine!


  • Update the internal copy of Catch to the latest version, 2.11.1 (#210).

  • mp++’s public headers do not include the quadmath.h header any more. This change greatly improves mp++’s compatibility with clang when the MPPP_WITH_QUADMATH option is active (#206).

  • Continue moving code into the compiled library (#204, #206).

  • Enable the C++20 concept declaration syntax if GCC >= 9 is being used (#203).


  • Various build system and documentation improvements (#200, #202).

0.17 (13-09-2019)


  • mp++’s concepts are now compatible with the C++20 concepts proposal (#196, #198). Many thanks to 7ofNine!

  • Expose most of the missing special functions from the MPFR API for real (#190, #192, #194).


  • On MSVC, use the WIN32_LEAN_AND_MEAN definition (#198).

  • Update the internal copy of Catch to the latest version, 2.9.2 (#197).

  • Drastically reduce the build time of the test suite by separately compiling the Catch main function (#197).


  • Workaround a constexpr issue involving real128 in GCC 9 (#197).

  • Fix C++17 builds with MSVC 2015 (#191).

0.16 (25-05-2019)


  • Properly set the version numbers for the mp++ dynamic library (#187).

0.15 (24-05-2019)


  • Expose the hyperbolic functions from the MPFR API for real (#184).

  • Add the possibility of generating Unicode MSVC solutions (#183).

  • Finish exposing all the trigonometric functions from the MPFR API for real (#180).

  • Add the possibility to build mp++ as a static library (#176).

  • Add CircleCI to the continuous integration pipeline (#173).

  • Implement the logarithm/exponential functions for real (#172).


  • When compiled with MPFR version 4 or later, mp++ now ensures that thread-local and global caches are freed separately at thread exit and program shutdown (#182).

  • Update the internal copy of Catch to the latest version, 2.7.2 (#181).

  • The MPFR cleanup function mpfr_free_cache() is now called at the end of every thread which creates at least one real object (#180).

  • Implement a specialised version of the swap() primitive for integer and rational (#174).

  • Improve the implementation of the less than/greater than operators for integer. Together with the swap() improvements, this change leads to a ~9% decrease in runtime for the integer1_sort_signed benchmark (#174).

  • Continue moving code from the headers into the compiled library (#170, #172).


  • Fix two race conditions in the testing code (#181).

  • The zero_division_error exception is now correctly marked as visible (#180).

  • Add a workaround for a clang-cl bug (#179).

  • Various build system and documentation improvements (#172).

  • Fix a warning when building mp++ with older MSVC versions (#170).

0.14 (2019-04-11)


  • The type_name() function is now part of the public API (#169).

  • integer and rational now respect the format flags in output streams (#161).


  • mp++ does not depend on the DbgHelp library on Windows any more (#169).

  • BREAKING: mp++ has now a compiled component. In order to use mp++, you will now have to both include the mp++ headers and link to the mp++ library (#169).

  • Various improvements to the benchmarks (#166).

  • BREAKING: the input stream operators have been removed from all classes (#161).


  • Fix an issue in the build system when compiling the unit tests in release mode with MSVC (#164).

  • Fixes for the demangler on OSX when 128-bit integers are involved (#163).

  • Fix a build issue on OSX when the compiler is not Xcode (#161).

0.13 (2019-03-13)


  • Update copyright date (#162).

  • Add a tutorial for real128 (#160).

  • Various build system improvements (#159).

  • Update the internal copy of Catch to the latest version, 2.5.0 (#158).


  • Fix a compilation error when using booleans as second arguments in the pow() and binomial() overloads of integer (#162).

  • Work around a compilation error on MSVC when using C++17 (#162).

  • Various documentation fixes (#160).

0.12 (2018-10-11)


  • Add a hash function for real128 (#157).

  • Add all the root functions from the GMP API to the integer API (#156).

  • Add all the root functions from the MPFR API to the real API (#154).

  • Add a specialisation of std::numeric_limits for real128 (#144).


  • Initialising a real with an invalid real_kind enum value now raises an exception, rather than initialising to NaN (#153).

  • Switch to the sphinx material design theme for the documentation (#153).

  • Update the internal copy of Catch to the latest version, 2.4.0 (#152).

  • Various improvements to the GCD implementation for integer (#150).

  • The addition/subtraction operators of integer now use the low-level add_ui(), add_si(), sub_ui() and sub_si() primitives when the other argument is a C++ integral (#147).

  • Various documentation additions, improvements and fixes (#146, #148, #149, #153, #155).

  • BREAKING: replace the integer_nbits_init tag structure with the strongly-typed mppp::integer_bitcnt_t enum (#145).

  • Ensure that real128 is trivially copyable (#144).


  • Fix various warnings issued by Clang 7 in the unit tests (#157).

0.11 (2018-05-22)


  • Wrap more functions from the quadmath API in real128 (#140).


  • The build system should now detect MPIR installations when looking for GMP (#139).

  • Update the internal copy of Catch to the latest version, 2.2.2 (#137).


  • Fix a couple of missing inline specifiers in the tests (#143).

  • Fix a missing noexcept in the move constructor of real128 (#138).

0.10 (2018-04-06)


  • Add a target in the build system to compile and run the benchmarks (#135).

  • Extend the add_ui() and sub_ui() functions to work on all unsigned C++ integral types, and introduce corresponding add_si() and sub_si() functions for signed C++ integral types (#131).

  • Initial version of the rational tutorial (#130).

  • The demangler is now aware of cv-qualifiers and references (#129).


  • BREAKING: the add_ui() function now requires an unsigned integral as the third argument (previously, the function could be invoked with a signed integral argument thanks to C++’s conversion rules).


  • Fix a test failure on FreeBSD (#134).

  • Various small documentation fixes (#130, #135).

  • Fix demangling failures for 128-bit integers in OSX (#128).

0.9 (2018-02-25)


  • Add a couple of benchmarks against hardware integer types (#124).


  • The mppp::StringType concept is now satisfied by cv qualified types as well (#127).

  • Add a leading mppp:: to the names of mp++’s classes in the pybind11 custom type casters (#120). This should be only a cosmetic change.

  • Update the internal copy of Catch to the latest version, 2.1.1 (#120).

  • Small tweaks/improvements to the build system and to the docs (#118, #120, #121, #124, #126).


  • Fix a potential bug in the real printing code (#123).

  • Fix a potential name shadowing issue in the pybind11 integration utilities (#125).

0.8 (2018-01-26)


  • Add a function to check if a real is equal to one (#117).

  • The pybind11 integration utilities now automatically translate mp++ exceptions into appropriate Python exceptions (#115).

  • Expose various internal type traits in the public API (#114).

  • Add an implementation of the binomial coefficient for rational top arguments (#113).


  • When C++ concepts are enabled, various functions now use automatically-deduced return types to simplify the implementation and improve the generated documentation (#114).

  • In the CMake config-file package produced by the installation process, ensure that the installed package version is considered compatible with any other version with the same major version number (#113).


  • Fix a compilation error in the in-place operators of real when using concepts (#116).

  • Fix a compilation error in the pybind11 utilities when mp++ is configured with quadmath support but without MPFR (#114).

0.7 (2018-01-11)


  • Implement the initial version of the binary serialisation API (#110).

  • Add builds based on MSVC 2017 in Appveyor (#110).

  • Extend the CppInteroperable concept to include all C++ integral types (#104).

  • Add left bit shift benchmarks for integer (#103).

  • Implement division without remainder (tdiv_q()) and exact division with positive divisor (divexact_gcd()) for integer (#103).

  • Implement the trunc() and integer_p() primitives for real (#102).

  • Implement the free_integer_caches() function to manually free the caches used internally by integer (#98).


  • Update copyright date (#110).

  • Various updates to the documentation and to the benchmarks (#107, #108).

  • Add an internal demangling utility to improve the quality of the error messages (#105).

  • Various performance improvements for integer division, fused multiply-add, left bit shift, addition and multiplication (#103, #106, #108).

  • Improve the detection of the availability of the thread_local keyword on recent Xcode versions (#99).

0.6 (2017-12-05)


  • Implement additional get() conversion functions for real128 (#96).

  • Implement the increment and decrement operators for rational (#95).

  • Implement support for __int128_t and __uint128_t (#90).

  • Implement the bitwise logic operators for integer (#86).

  • Initial implementation of the pybind11 integration utilities (#81).

  • Implement the frexp() primitive for real128 (#81).

  • Implement the get/set_z_2exp() primitives for real (#77).

  • Implement construction with preallocated storage for integer (#74).

  • Implement construction from an array of limbs for integer (#73).


  • Various additions to the tutorial (#97).

  • BREAKING: the imported target created by the installation process has been renamed from Mp++ to mp++ (#94).

  • Take advantage of std::gcd() on C++17 (#93).

  • Update the benchmark results for integer (#91).

  • Add division benchmarks for integer (#91).

  • A few performance tweaks for integer (#91).

  • Simplifications in the bit shifting primitives for integer (#85).

  • Split an integer test in two parts to curb memory usage during compilation (#80).

  • Use bit counting intrinsics in MSVC (#79).

  • Update the internal copy of Catch to the latest version, 2.0.1 (#76).

  • Improve the performance of generic assignment for integer (#74).

  • Improve construction from C++ integrals for integer (#74).


  • Fix integer warnings in release mode (#97).

  • Various internal cleanups in integer (#80, #85, #86).

  • Small fixes regarding the use of GMP type aliases in integer (#73).

0.5 (2017-11-07)


  • Implement the real class (#40).

  • Add non-throwing GMP-style conversion functions (#59, #61).

  • Implement move constructors and move assignment operators from mpz_t and mpq_t for integer and rational (#57).

  • Implement a cache for the allocation of limbs arrays in small integer objects (#55).

  • Implement the real128 class (#31).

  • Implement the sub_ui() primitive for integer (#37).

  • Add a CI build testing against the latest unstable GMP branch (#34).

  • Add assignment operators from std::string_view for integer and rational (#32).

  • Add the possibility of constructing non-canonical rational objects from numerator/denominator pairs (#28).


  • Use the sphinx bootstrap theme for the html documentation (#71).

  • Various simplifications in the rational API (#66).

  • Introduce a StringType concept and use it to reduce the number of overloads in the constructors/assignment operators from string (#63, #64).

  • The integer functions accepting the return value as a parameter will now demote a return value with dynamic storage to static storage if the other arguments all have static storage (#58).

  • The free functions for integer and rational now return a reference to the return value, rather than void (#56).

  • Performance improvements and code simplifications for integer division (#55).

  • Minor improvements in the static checks for the expected layouts of mpz_t and mpq_t (#53, #42).

  • Enable additional compiler warning flags in debug builds for GCC (#52).

  • BREAKING: various improvements/changes to the bit shifting functions for integer, and the exception raised by the bit shifting operators is not any more std::domain_error, it is now std::overflow_error (#48).

  • Various updates to the benchmarks (#39).

  • Use various C++17 standard library bits if available, and improve general C++17 compatibility (#31, #37).

  • Update the internal copy of Catch to the latest version, 1.9.7 (#36).

  • Bump up the minimum required CMake version to 3.3 (#31).

  • Performance improvements and simplifications in the rational constructors and assignment operators (#28, #32).


  • Fixes/improvements in the support for long double (#50, #54).

  • Fix the compilation of the tests on Clang 5 (#43).

  • Fix too lax constraints in the implementation of in-place operators for integer and rational (#41).

  • Fix the PDF build of the documentation (#39).

  • Fix a few missing inline specifiers (#38, #41).

  • Fix C++ version detection on MSVC (#36).

  • Fix missing tests for rational hashing (#29).

  • Fix some MSVC warnings when compiling the tests in release mode (#28).

  • Various minor documentation fixes.

0.4 (2017-07-29)


  • Implement the constructors from a range of characters and from std::string_view for integer and rational (#23).

  • Implement the assignment operator and the constructor from mpz_t in rational (#19).


  • Expand CI to include GCC 7 in C++17 mode (#27).

  • Improve testing coverage (#25).

  • Various extensions to the benchmark suite (#25).

  • Various performance improvements in integer thanks to the reduction of the number of branches in the implementation of basic arithmetic for the 1/2-limb specialisations (#25).

  • Update the internal copy of Catch to the latest version, 1.9.6 (#24).

  • Performance improvements for mppp::integer::size() (#23).

  • Performance improvements for the construction/conversion of integer from/to C++ integrals (#23).

  • Make sure the MPFR cleanup routine is automatically called on shutdown (#22).

  • Performance improvements for mppp::integer::nbits() on GCC and Clang (#17).


  • Fix a build failure on older GMP versions (#25).

  • Fix a build system bug when building the benchmarks with older CMake versions (#25).

  • Various minor fixes.

0.3 (2017-06-12)


  • Implement the multiprecision rational class (#14).

  • Implement fast assignment functions to zero and plus/minus one for integer.

  • Add assignment operators from string for integer.

  • Implement the submul() primitive for integer.

  • Implement the assignment operator from mpz_t in integer, and use it in various function in order to avoid the creation of a temporary.


  • Performance improvements for the copy/move assignment operators of integer.


  • Various small documentation fixes.

0.2 (2017-05-09)


  • Provide a CMake config-file package as part of the install process.

  • Implement the missing in-place modulo operator with C++ integrals on the left.

  • Experimental support for C++ concepts.

  • Support the clang-cl compiler on Windows.

  • Add input stream operator.

  • Add in-place arithmetic operators with interoperable types on the left-hand side.

  • Add convenience overloads for the computation of the binomial coefficient.

  • Add convenience overloads for pow().

  • Add functions to test if an integer is equal to -1.

  • Add a static member to integer storing the static size.


  • Split out the library in multiple files.

  • Rename the mp_integer class to integer.

  • Various improvements to the documentation.

  • Rework the library interface to use regular functions rather than inline friend functions.

  • Change the license to MPL2.

  • Remove the allocation cache.

  • Remove the custom namespace option.


  • Fix operators example in the documentation.