Bertini 2 d882924 (2026-10-06 19:56 UTC)
Numerical algebraic geometry library (C++ core)
Loading...
Searching...
No Matches
mpfr_extensions.hpp
Go to the documentation of this file.
1//This file is part of Bertini 2.
2//
3//mpfr_extensions.hpp is free software: you can redistribute it and/or modify
4//it under the terms of the GNU General Public License as published by
5//the Free Software Foundation, either version 3 of the License, or
6//(at your option) any later version.
7//
8//mpfr_extensions.hpp is distributed in the hope that it will be useful,
9//but WITHOUT ANY WARRANTY; without even the implied warranty of
10//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11//GNU General Public License for more details.
12//
13//You should have received a copy of the GNU General Public License
14//along with mpfr_extensions.hpp. If not, see <http://www.gnu.org/licenses/>.
15//
16// Copyright(C) Bertini2 Development Team
17//
18// See <http://www.gnu.org/licenses/> for a copy of the license,
19// as well as COPYING. Bertini2 is provided with permitted
20// additional terms in the b2/licenses/ directory.
21
29
30#ifndef BERTINI_MPFR_EXTENSIONS_HPP
31#define BERTINI_MPFR_EXTENSIONS_HPP
32
33
34
35#include <boost/multiprecision/mpfr.hpp>
36
37#ifdef B2_FORBID_MIXED_ARITHMETIC
39#endif
40
41#include <boost/random.hpp>
42
43#include <boost/archive/text_oarchive.hpp>
44#include <boost/archive/text_iarchive.hpp>
45#include <boost/serialization/split_member.hpp>
46
47#include <string>
48
50
51namespace bertini{
52#ifdef BMP_EXPRESSION_TEMPLATES
53 using real_mp = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_on>;
54 using mpz_int = boost::multiprecision::number<boost::multiprecision::backends::gmp_int, boost::multiprecision::et_on>;
55 using mpq_rational = boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, boost::multiprecision::et_on>;
56#else
57 using real_mp = boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off>;
58 using mpz_int = boost::multiprecision::number<boost::multiprecision::backends::gmp_int, boost::multiprecision::et_off>;
59 using mpq_rational = boost::multiprecision::number<boost::multiprecision::backends::gmp_rational, boost::multiprecision::et_off>;
60#endif
61
67 inline
68 auto Precision(real_mp const& num)
69 {
70 return num.precision();
71 }
72
78 inline void Precision(real_mp & num, unsigned prec)
79 {
80 num.precision(prec);
81 }
82
83}
84
85
86// overloads of the `max` function.
87namespace bertini{
95 template <typename T>
96 T max(T const& a, T const& b, T const& c)
97 {
98 using std::max;
99 return max(max(a,b),c);
100 }
101
110 template <typename T>
111 T max(T const& a, T const& b, T const& c, T const& d)
112 {
113 using std::max;
114 using bertini::max;
115 return max(max(a,b,c),d);
116 }
117
127 template <typename T>
128 T max(T const& a, T const& b, T const& c, T const& d, T const& e)
129 {
130 using std::max;
131 using bertini::max;
132 return max(max(a,b,c,d),e);
133 }
134}
135
136
137
138// the following code block extends serialization to the real_mp class from boost::multiprecision
139namespace boost { namespace serialization {
143 template <typename Archive>
144 void save(Archive& ar, ::boost::multiprecision::backends::mpfr_float_backend<0> const& r, unsigned /*version*/)
145 {
146 unsigned num_digits(r.precision());
147 ar & num_digits;
148 std::string tmp = r.str(0,std::ios::scientific);
149 ar & tmp;
150 }
151
155 template <typename Archive>
156 void load(Archive& ar, ::boost::multiprecision::backends::mpfr_float_backend<0>& r, unsigned /*version*/)
157 {
158 unsigned num_digits;
159 ar & num_digits;
160 r.precision(num_digits);
161 std::string tmp;
162 ar & tmp;
163 r = tmp.c_str();
164 }
165
166
167
171 template <typename Archive>
172 void save(Archive& ar, ::boost::multiprecision::backends::gmp_rational const& r, unsigned /*version*/)
173 {
174 std::string tmp = r.str(0,std::ios::scientific);
175 ar & tmp;
176 }
177
181 template <typename Archive>
182 void load(Archive& ar, ::boost::multiprecision::backends::gmp_rational& r, unsigned /*version*/)
183 {
184 std::string tmp;
185 ar & tmp;
186 r = tmp.c_str();
187 }
188
189
193 template <typename Archive>
194 void save(Archive& ar, ::boost::multiprecision::backends::gmp_int const& r, unsigned /*version*/)
195 {
196 std::string tmp = r.str(0,std::ios::scientific);
197 ar & tmp;
198 }
199
203 template <typename Archive>
204 void load(Archive& ar, ::boost::multiprecision::backends::gmp_int& r, unsigned /*version*/)
205 {
206 std::string tmp;
207 ar & tmp;
208 r = tmp.c_str();
209 }
210
211
212} } // re: namespaces
213
214
215
216BOOST_SERIALIZATION_SPLIT_FREE(::boost::multiprecision::backends::mpfr_float_backend<0>)
217
218BOOST_SERIALIZATION_SPLIT_FREE(::boost::multiprecision::backends::gmp_rational)
219
220BOOST_SERIALIZATION_SPLIT_FREE(::boost::multiprecision::backends::gmp_int)
221
222
223// Eigen 3.2.x workaround for Boost.Multiprecision expression templates
224// removed -- project now requires Eigen >= 3.3.
225
226
227
228#endif
Provides bertini extensions to the double and complex<double> types.
Definition algorithm_builder.hpp:36
boost::multiprecision::number< boost::multiprecision::backends::gmp_int, boost::multiprecision::et_on > mpz_int
The arbitrary-precision integer type.
Definition mpfr_extensions.hpp:54
boost::multiprecision::number< boost::multiprecision::mpfr_float_backend< 0 >, boost::multiprecision::et_on > real_mp
The arbitrary-precision real number type.
Definition mpfr_extensions.hpp:53
boost::multiprecision::number< boost::multiprecision::backends::gmp_rational, boost::multiprecision::et_on > mpq_rational
The exact rational number type.
Definition mpfr_extensions.hpp:55
unsigned Precision(Eigen::MatrixBase< Derived > const &v)
Get the precision of an Eigen object.
Definition eigen_extensions.hpp:339
T max(T const &a, T const &b, T const &c)
Three-argument form of max.
Definition mpfr_extensions.hpp:96
Definition mpfr_complex.hpp:191
void load(Archive &ar, ::boost::multiprecision::backends::mpc_complex_backend< 0 > &r, unsigned)
Load a mpc_complex type from a boost archive.
Definition mpfr_complex.hpp:208
void save(Archive &ar, ::boost::multiprecision::backends::mpc_complex_backend< 0 > const &r, unsigned)
Save a mpc_complex type to a boost archive.
Definition mpfr_complex.hpp:196
Definition forbid_mixed_arithmetic.hpp:27