32#ifndef BERTINI_MPFR_COMPLEX_HPP
33#define BERTINI_MPFR_COMPLEX_HPP
39#include <boost/archive/text_oarchive.hpp>
40#include <boost/archive/text_iarchive.hpp>
41#include <boost/serialization/split_member.hpp>
53#include <boost/multiprecision/mpc.hpp>
57namespace bmp = boost::multiprecision;
58using bmp::backends::mpc_complex_backend;
60#ifdef BMP_EXPRESSION_TEMPLATES
61 using mpfr_complex = bmp::number<mpc_complex_backend<0>, bmp::et_on >;
63 using mpfr_complex = bmp::number<mpc_complex_backend<0>, bmp::et_off >;
66 inline auto DefaultPrecisionPolicy(){
67 return bmp::variable_precision_options::preserve_source_precision;
74 struct scoped_mpfr_precision_options_this_thread
76 boost::multiprecision::variable_precision_options saved_options;
78 scoped_mpfr_precision_options_this_thread(boost::multiprecision::variable_precision_options opts) : saved_options(mpfr_float::thread_default_variable_precision_options())
80 mpfr_float::thread_default_variable_precision_options(opts);
83 ~scoped_mpfr_precision_options_this_thread()
85 mpfr_float::thread_default_variable_precision_options(saved_options);
88 void reset(boost::multiprecision::variable_precision_options opts)
90 mpfr_float::thread_default_variable_precision_options(opts);
97 struct scoped_mpfr_precision_options_all_threads
99 boost::multiprecision::variable_precision_options saved_options_all_threads;
100 boost::multiprecision::variable_precision_options saved_options_this_thread;
102 scoped_mpfr_precision_options_all_threads(boost::multiprecision::variable_precision_options opts) :
103 saved_options_all_threads(mpfr_float::default_variable_precision_options()),
104 saved_options_this_thread(mpfr_float::default_variable_precision_options())
106 mpfr_float::default_variable_precision_options(opts);
107 mpfr_float::thread_default_variable_precision_options(opts);
110 ~scoped_mpfr_precision_options_all_threads()
112 mpfr_float::default_variable_precision_options(saved_options_all_threads);
113 mpfr_float::thread_default_variable_precision_options(saved_options_this_thread);
116 void reset(boost::multiprecision::variable_precision_options opts)
118 mpfr_float::default_variable_precision_options(opts);
119 mpfr_float::thread_default_variable_precision_options(opts);
129 inline auto DefaultPrecision()
131 auto p = mpfr_float::default_precision();
132 assert(p==mpfr_complex::default_precision() &&
"precision of real and complex multiprecision numbers have drifted...");
136 inline void DefaultPrecision(
unsigned prec)
138 mpfr_float::default_precision(prec);
139 mpfr_complex::default_precision(prec);
146namespace boost {
namespace serialization {
150 template <
typename Archive>
151 void save(Archive& ar, ::boost::multiprecision::backends::mpc_complex_backend<0>
const& r,
unsigned )
153 unsigned num_digits(r.precision());
155 std::string tmp = r.str(0,std::ios::scientific);
162 template <
typename Archive>
163 void load(Archive& ar, ::boost::multiprecision::backends::mpc_complex_backend<0>& r,
unsigned )
167 r.precision(num_digits);
176BOOST_SERIALIZATION_SPLIT_FREE(::boost::multiprecision::backends::mpc_complex_backend<0>);
193 return num.precision();
202 inline void Precision(mpfr_complex & num,
unsigned prec)
208 bool isnan(mpfr_complex
const& num){
return isnan(num.real()) || isnan(num.imag());};
unsigned Precision(Eigen::MatrixBase< Derived > const &v)
Get the precision of an Eigen object. If the object is empty, it's the precision of a default-constru...
Definition eigen_extensions.hpp:292
void load(Archive &ar, ::boost::multiprecision::backends::mpc_complex_backend< 0 > &r, unsigned)
Definition mpfr_complex.hpp:163
void save(Archive &ar, ::boost::multiprecision::backends::mpc_complex_backend< 0 > const &r, unsigned)
Definition mpfr_complex.hpp:151
Extensions to the Boost.Multiprecision library.