33#ifndef BERTINI_NUM_TRAITS_HPP
34#define BERTINI_NUM_TRAITS_HPP
54 template <>
struct NumTraits<double>
56 inline static unsigned NumDigits()
61 inline static unsigned NumFuzzyDigits()
67 static unsigned TolToDigits(
double tol)
69 return ceil(-log10(tol));
73 double FromString(std::string
const& s)
75 return boost::lexical_cast<double>(s);
79 double FromRational(mpq_rational
const& n,
unsigned )
85 using Complex = dbl_complex;
89 template <>
struct NumTraits<dbl_complex >
91 inline static unsigned NumDigits()
96 inline static unsigned NumFuzzyDigits()
102 dbl_complex FromString(std::string
const& s)
104 return boost::lexical_cast<dbl_complex>(s);
108 dbl_complex FromString(std::string
const& s, std::string
const& t)
110 return dbl_complex(boost::lexical_cast<double>(s),boost::lexical_cast<double>(t));
114 dbl_complex FromRational(mpq_rational
const& n,
unsigned )
116 return dbl_complex(
static_cast<double>(n),0);
120 using Complex = dbl_complex;
125 unsigned PrecisionIncrement()
131 unsigned DoublePrecision()
137 unsigned LowestMultiplePrecision()
143 unsigned MaxPrecisionAllowed()
156 return DoublePrecision();
165 if (prec!=DoublePrecision())
167 std::stringstream err_msg;
168 err_msg <<
"trying to change precision of a double to " << prec;
169 throw std::runtime_error(err_msg.str());
181 return DoublePrecision();
190 if (prec!=DoublePrecision())
192 std::stringstream err_msg;
193 err_msg <<
"trying to change precision of a double to " << prec;
194 throw std::runtime_error(err_msg.str());
199 dbl_complex rand_complex()
203 static std::default_random_engine generator;
204 static std::uniform_real_distribution<double> distribution(-1.0,1.0);
205 dbl_complex returnme(distribution(generator), distribution(generator));
206 return returnme / sqrt( abs(returnme));
210 dbl_complex RandomUnit<dbl_complex >()
212 static std::default_random_engine generator;
213 static std::uniform_real_distribution<double> distribution(-1.0,1.0);
214 dbl_complex returnme(distribution(generator), distribution(generator));
215 return returnme / abs(returnme);
220 mpfr_complex RandomUnit<mpfr_complex>()
222 return multiprecision::RandomUnit();
241 template <>
struct NumTraits<mpfr_float>
243 inline static unsigned NumDigits()
245 return DefaultPrecision();
248 inline static unsigned NumFuzzyDigits()
250 return DefaultPrecision()-3;
254 static unsigned TolToDigits(mpfr_float tol)
256 mpfr_float b = ceil(-log10(tol));
257 return b.convert_to<
unsigned int>();
261 mpfr_float FromString(std::string
const& s)
263 return mpfr_float(s);
267 mpfr_float FromRational(mpq_rational
const& n,
unsigned precision)
269 return mpfr_float(n,precision);
272 using Real = mpfr_float;
273 using Complex = mpfr_complex;
278 template <>
struct NumTraits<mpfr_complex>
280 inline static unsigned NumDigits()
282 return DefaultPrecision();
286 mpfr_complex FromString(std::string
const& s)
288 return mpfr_complex(s);
292 mpfr_complex FromString(std::string
const& s, std::string
const& t)
294 return mpfr_complex(s,t);
298 mpfr_complex FromRational(mpq_rational
const& n,
unsigned precision)
300 return mpfr_complex(n,0,precision);
303 using Real = mpfr_float;
304 using Complex = mpfr_complex;
307 template <>
struct NumTraits<mpq_rational>
310 mpq_rational FromString(std::string
const& s)
312 return mpq_rational(s);
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
The main multiprecision complex number type. This is essentially boost::multiprecision' complex.
stuff for generating random numbers