37#include <boost/math/special_functions/modf.hpp>
41#include <boost/fusion/adapted.hpp>
42#include <boost/fusion/include/adapted.hpp>
44#define BOOST_SPIRIT_USE_PHOENIX_V3 1
46#include <boost/spirit/include/qi.hpp>
47#include <boost/spirit/include/karma.hpp>
48#include <boost/phoenix/core.hpp>
49#include <boost/phoenix/operator.hpp>
50#include <boost/fusion/include/std_pair.hpp>
53#include <boost/spirit/include/support_istream_iterator.hpp>
76 namespace karma = boost::spirit::karma;
78 template <
typename Num>
79 struct BertiniNumPolicy :
public karma::real_policies<Num>
82 static int floatfield(Num n) {
return std::ios_base::scientific; }
84 static unsigned int precision(Num) {
85 return std::numeric_limits<Num>::max_digits10;
90 struct BertiniNumPolicy<mpfr_float> :
public karma::real_policies<mpfr_float>
93 static int floatfield(mpfr_float n) {
return std::ios_base::scientific; }
95 static unsigned int precision(mpfr_float
const& x) {
102 template<
typename Num>
103 using FullPrec = boost::spirit::karma::real_generator<Num, BertiniNumPolicy<Num> >;
105 FullPrec<double>
const full_prec_d = FullPrec<double>();
106 FullPrec<mpfr_float>
const full_prec_mp = FullPrec<mpfr_float>();
111 template <
typename OutputIterator>
112 static bool generate(OutputIterator sink,
double const& c)
114 using boost::spirit::karma::omit;
115 using boost::spirit::karma::generate;
117 return generate(sink,
121 full_prec_d <<
" " << full_prec_d
130 template <
typename OutputIterator>
131 static bool generate(OutputIterator sink, std::complex<double>
const& c)
133 using boost::spirit::karma::omit;
134 using boost::spirit::karma::generate;
136 return generate(sink,
140 full_prec_d <<
" " << full_prec_d
150 template <
typename OutputIterator>
151 static bool generate(OutputIterator sink, mpfr_float
const& c)
153 using boost::spirit::karma::omit;
154 using boost::spirit::karma::generate;
156 return generate(sink,
160 boost::spirit::karma::string
169 template <
typename OutputIterator>
170 static bool generate(OutputIterator sink, mpfr_complex
const& c)
172 using boost::spirit::karma::omit;
173 using boost::spirit::karma::generate;
175 return generate(sink,
179 boost::spirit::karma::string <<
" " << boost::spirit::karma::string
183 c.real().str(), c.imag().str()
188 template <
typename OutputIterator,
typename T>
189 static bool generate(OutputIterator sink, Vec<T>
const& c)
192 for (
decltype(s) ii=0; ii<s; ++ii)
194 bool b = generate(sink, c(ii));
197 boost::spirit::karma::generate(sink, (boost::spirit::karma::char_),
'\n');
208 template <
typename OutputIterator>
209 static bool generate(OutputIterator sink, std::complex<double>
const& c)
211 using boost::spirit::karma::omit;
212 using boost::spirit::karma::generate;
214 return generate(sink,
218 !full_prec_d(0.0) <<
'(' << full_prec_d <<
", " << full_prec_d <<
')'
219 | omit[full_prec_d] << full_prec_d
223 c.imag(), c.real(), c.imag()
Bertini extensions of the Eigen linear algebra library.
The main multiprecision complex number type. This is essentially boost::multiprecision' complex.