#include <boost/multiprecision/detail/integer_ops.hpp>
#include <boost/multiprecision/detail/big_lanczos.hpp>
#include <boost/multiprecision/detail/digits.hpp>
+#include <boost/multiprecision/detail/atomic.hpp>
#include <boost/math/special_functions/fpclassify.hpp>
#include <boost/cstdint.hpp>
#include <boost/functional/hash_fwd.hpp>
gmp_float_imp& operator=(boost::ulong_long_type i)
{
if (m_data[0]._mp_d == 0)
- mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
boost::ulong_long_type mask = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);
unsigned shift = 0;
mpf_t t;
- mpf_init2(t, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(t, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
mpf_set_ui(m_data, 0);
while (i)
{
gmp_float_imp& operator=(boost::long_long_type i)
{
if (m_data[0]._mp_d == 0)
- mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
bool neg = i < 0;
*this = static_cast<boost::ulong_long_type>(boost::multiprecision::detail::unsigned_abs(i));
if (neg)
gmp_float_imp& operator=(unsigned long i)
{
if (m_data[0]._mp_d == 0)
- mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
mpf_set_ui(m_data, i);
return *this;
}
gmp_float_imp& operator=(long i)
{
if (m_data[0]._mp_d == 0)
- mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
mpf_set_si(m_data, i);
return *this;
}
gmp_float_imp& operator=(double d)
{
if (m_data[0]._mp_d == 0)
- mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
mpf_set_d(m_data, d);
return *this;
}
using std::ldexp;
if (m_data[0]._mp_d == 0)
- mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
if (a == 0)
{
gmp_float_imp& operator=(const char* s)
{
if (m_data[0]._mp_d == 0)
- mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
+ mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : (unsigned)get_default_precision()));
+ if (s && (*s == '+'))
+ ++s; // Leading "+" sign not supported by mpf_set_str:
if (0 != mpf_set_str(m_data, s, 10))
BOOST_THROW_EXCEPTION(std::runtime_error(std::string("The string \"") + s + std::string("\"could not be interpreted as a valid floating point number.")));
return *this;
protected:
mpf_t m_data;
- static unsigned& get_default_precision() BOOST_NOEXCEPT
+ static boost::multiprecision::detail::precision_type& get_default_precision() BOOST_NOEXCEPT
{
- static unsigned val = 50;
+ static boost::multiprecision::detail::precision_type val(50);
return val;
}
};
template <>
struct gmp_float<0> : public detail::gmp_float_imp<0>
{
- gmp_float()
+ //
+ // We have a problem with mpf_t in that the precision we request isn't what we get.
+ // As a result the front end can end up chasing it's tail trying to create a variable
+ // with the the correct precision to hold the result of an expression.
+ // See: https://github.com/boostorg/multiprecision/issues/164
+ // The problem is made worse by the fact that our conversions from base10 to 2 and
+ // vice-versa do not exactly round trip (and probably never will).
+ // The workaround is to keep track of the precision requested, and always return
+ // that as the current actual precision.
+ //
+ private:
+ unsigned requested_precision;
+
+ public:
+ gmp_float() : requested_precision(get_default_precision())
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
}
- gmp_float(const mpf_t val)
+ gmp_float(const mpf_t val) : requested_precision(get_default_precision())
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
mpf_set(this->m_data, val);
}
- gmp_float(const mpz_t val)
+ gmp_float(const mpz_t val) : requested_precision(get_default_precision())
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
mpf_set_z(this->m_data, val);
}
- gmp_float(const mpq_t val)
+ gmp_float(const mpq_t val) : requested_precision(get_default_precision())
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
mpf_set_q(this->m_data, val);
}
- gmp_float(const gmp_float& o) : detail::gmp_float_imp<0>(o) {}
+ gmp_float(const gmp_float& o) : detail::gmp_float_imp<0>(o), requested_precision(o.requested_precision) {}
template <unsigned D>
gmp_float(const gmp_float<D>& o)
{
mpf_init2(this->m_data, mpf_get_prec(o.data()));
mpf_set(this->m_data, o.data());
+ requested_precision = D;
}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- gmp_float(gmp_float&& o) BOOST_NOEXCEPT : detail::gmp_float_imp<0>(static_cast<detail::gmp_float_imp<0>&&>(o))
+ gmp_float(gmp_float&& o) BOOST_NOEXCEPT : detail::gmp_float_imp<0>(static_cast<detail::gmp_float_imp<0>&&>(o)), requested_precision(o.requested_precision)
{}
#endif
gmp_float(const gmp_int& o);
gmp_float(const gmp_rational& o);
- gmp_float(const gmp_float& o, unsigned digits10)
+ gmp_float(const gmp_float& o, unsigned digits10) : requested_precision(digits10)
{
mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
mpf_set(this->m_data, o.data());
}
template <class V>
- gmp_float(const V& o, unsigned digits10)
+ gmp_float(const V& o, unsigned digits10) : requested_precision(digits10)
{
mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
*this = o;
// Support for new types in C++17
//
template <class Traits>
- gmp_float(const std::basic_string_view<char, Traits>& o, unsigned digits10)
+ gmp_float(const std::basic_string_view<char, Traits>& o, unsigned digits10) : requested_precision(digits10)
{
using default_ops::assign_from_string_view;
mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
gmp_float& operator=(const gmp_float& o)
{
*static_cast<detail::gmp_float_imp<0>*>(this) = static_cast<detail::gmp_float_imp<0> const&>(o);
+ requested_precision = o.requested_precision;
return *this;
}
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
gmp_float& operator=(gmp_float&& o) BOOST_NOEXCEPT
{
*static_cast<detail::gmp_float_imp<0>*>(this) = static_cast<detail::gmp_float_imp<0>&&>(o);
+ requested_precision = o.requested_precision;
return *this;
}
#endif
mpf_set_prec(this->m_data, mpf_get_prec(o.data()));
}
mpf_set(this->m_data, o.data());
+ requested_precision = D;
return *this;
}
gmp_float& operator=(const gmp_int& o);
gmp_float& operator=(const mpf_t val)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ {
+ requested_precision = get_default_precision();
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
+ }
mpf_set(this->m_data, val);
return *this;
}
gmp_float& operator=(const mpz_t val)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ {
+ requested_precision = get_default_precision();
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
+ }
mpf_set_z(this->m_data, val);
return *this;
}
gmp_float& operator=(const mpq_t val)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ {
+ requested_precision = get_default_precision();
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
+ }
mpf_set_q(this->m_data, val);
return *this;
}
}
unsigned precision() const BOOST_NOEXCEPT
{
- return static_cast<unsigned>(multiprecision::detail::digits2_2_10(static_cast<unsigned long>(mpf_get_prec(this->m_data))));
+ return requested_precision;
}
void precision(unsigned digits10) BOOST_NOEXCEPT
{
- mpf_set_prec(this->m_data, multiprecision::detail::digits10_2_2(digits10));
+ requested_precision = digits10;
+ mpf_set_prec(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
+ }
+ void swap(gmp_float& o)
+ {
+ std::swap(requested_precision, o.requested_precision);
+ gmp_float_imp<0>::swap(o);
}
};
{
return mpq_sgn(val.data());
}
-inline void eval_convert_to(double* result, const gmp_rational& val)
+template <class R>
+inline typename enable_if_c<number_category<R>::value == number_kind_floating_point>::type eval_convert_to(R* result, const gmp_rational& backend)
{
+ //
+ // The generic conversion is as good as anything we can write here:
//
// This does not round correctly:
//
//
// This does:
//
- boost::multiprecision::detail::generic_convert_rational_to_float(*result, val);
+ ::boost::multiprecision::detail::generic_convert_rational_to_float(*result, backend);
}
+#ifdef BOOST_HAS_FLOAT128
+inline void eval_convert_to(__float128* result, const gmp_rational& val)
+{
+ using default_ops::eval_convert_to;
+
+ gmp_int n, d;
+ __float128 fn, fd;
+ mpz_set(n.data(), mpq_numref(val.data()));
+ mpz_set(d.data(), mpq_denref(val.data()));
+
+ eval_convert_to(&fn, n);
+ eval_convert_to(&fd, d);
+
+ *result = fn / fd;
+}
+#endif
inline void eval_convert_to(long* result, const gmp_rational& val)
{
template <unsigned D>
inline gmp_float<Digits10>::gmp_float(const gmp_float<D>& o, typename enable_if_c<D <= Digits10>::type*)
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));
mpf_set(this->m_data, o.data());
}
template <unsigned Digits10>
template <unsigned D>
inline gmp_float<Digits10>::gmp_float(const gmp_float<D>& o, typename disable_if_c<D <= Digits10>::type*)
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));
mpf_set(this->m_data, o.data());
}
template <unsigned Digits10>
inline gmp_float<Digits10>::gmp_float(const gmp_int& o)
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));
mpf_set_z(this->data(), o.data());
}
template <unsigned Digits10>
inline gmp_float<Digits10>::gmp_float(const gmp_rational& o)
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));
mpf_set_q(this->data(), o.data());
}
template <unsigned Digits10>
inline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_float<D>& o)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));
mpf_set(this->m_data, o.data());
return *this;
}
inline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_int& o)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));
mpf_set_z(this->data(), o.data());
return *this;
}
inline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_rational& o)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : (unsigned)this->get_default_precision()));
mpf_set_q(this->data(), o.data());
return *this;
}
-inline gmp_float<0>::gmp_float(const gmp_int& o)
+inline gmp_float<0>::gmp_float(const gmp_int& o) : requested_precision(get_default_precision())
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
mpf_set_z(this->data(), o.data());
}
-inline gmp_float<0>::gmp_float(const gmp_rational& o)
+inline gmp_float<0>::gmp_float(const gmp_rational& o) : requested_precision(get_default_precision())
{
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
mpf_set_q(this->data(), o.data());
}
inline gmp_float<0>& gmp_float<0>::operator=(const gmp_int& o)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(this->get_default_precision()));
+ {
+ requested_precision = this->get_default_precision();
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
+ }
mpf_set_z(this->data(), o.data());
return *this;
}
inline gmp_float<0>& gmp_float<0>::operator=(const gmp_rational& o)
{
if (this->m_data[0]._mp_d == 0)
- mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(this->get_default_precision()));
+ {
+ requested_precision = this->get_default_precision();
+ mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(requested_precision));
+ }
mpf_set_q(this->data(), o.data());
return *this;
}
}
return value.second;
}
- BOOST_STATIC_CONSTEXPR long min_exponent = LONG_MIN;
- BOOST_STATIC_CONSTEXPR long min_exponent10 = (LONG_MIN / 1000) * 301L;
- BOOST_STATIC_CONSTEXPR long max_exponent = LONG_MAX;
- BOOST_STATIC_CONSTEXPR long max_exponent10 = (LONG_MAX / 1000) * 301L;
- BOOST_STATIC_CONSTEXPR bool has_infinity = false;
- BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
- BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
- BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
- BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
- BOOST_STATIC_CONSTEXPR number_type infinity() { return number_type(); }
- BOOST_STATIC_CONSTEXPR number_type quiet_NaN() { return number_type(); }
- BOOST_STATIC_CONSTEXPR number_type signaling_NaN() { return number_type(); }
- BOOST_STATIC_CONSTEXPR number_type denorm_min() { return number_type(); }
- BOOST_STATIC_CONSTEXPR bool is_iec559 = false;
- BOOST_STATIC_CONSTEXPR bool is_bounded = true;
- BOOST_STATIC_CONSTEXPR bool is_modulo = false;
- BOOST_STATIC_CONSTEXPR bool traps = true;
- BOOST_STATIC_CONSTEXPR bool tinyness_before = false;
- BOOST_STATIC_CONSTEXPR float_round_style round_style = round_indeterminate;
+ BOOST_STATIC_CONSTEXPR long min_exponent = LONG_MIN;
+ BOOST_STATIC_CONSTEXPR long min_exponent10 = (LONG_MIN / 1000) * 301L;
+ BOOST_STATIC_CONSTEXPR long max_exponent = LONG_MAX;
+ BOOST_STATIC_CONSTEXPR long max_exponent10 = (LONG_MAX / 1000) * 301L;
+ BOOST_STATIC_CONSTEXPR bool has_infinity = false;
+ BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
+ BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
+ BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
+ BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
+ BOOST_STATIC_CONSTEXPR number_type infinity() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR number_type quiet_NaN() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR number_type signaling_NaN() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR number_type denorm_min() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR bool is_iec559 = false;
+ BOOST_STATIC_CONSTEXPR bool is_bounded = true;
+ BOOST_STATIC_CONSTEXPR bool is_modulo = false;
+ BOOST_STATIC_CONSTEXPR bool traps = true;
+ BOOST_STATIC_CONSTEXPR bool tinyness_before = false;
+ BOOST_STATIC_CONSTEXPR float_round_style round_style = round_indeterminate;
private:
struct data_initializer
BOOST_STATIC_CONSTEXPR bool is_specialized = false;
static number_type(min)() { return number_type(); }
static number_type(max)() { return number_type(); }
- static number_type lowest() { return number_type(); }
- BOOST_STATIC_CONSTEXPR int digits = 0;
- BOOST_STATIC_CONSTEXPR int digits10 = 0;
- BOOST_STATIC_CONSTEXPR int max_digits10 = 0;
- BOOST_STATIC_CONSTEXPR bool is_signed = false;
- BOOST_STATIC_CONSTEXPR bool is_integer = false;
- BOOST_STATIC_CONSTEXPR bool is_exact = false;
- BOOST_STATIC_CONSTEXPR int radix = 0;
- static number_type epsilon() { return number_type(); }
- static number_type round_error() { return number_type(); }
- BOOST_STATIC_CONSTEXPR int min_exponent = 0;
- BOOST_STATIC_CONSTEXPR int min_exponent10 = 0;
- BOOST_STATIC_CONSTEXPR int max_exponent = 0;
- BOOST_STATIC_CONSTEXPR int max_exponent10 = 0;
- BOOST_STATIC_CONSTEXPR bool has_infinity = false;
- BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
- BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
- BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
- BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
+ static number_type lowest() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR int digits = 0;
+ BOOST_STATIC_CONSTEXPR int digits10 = 0;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = 0;
+ BOOST_STATIC_CONSTEXPR bool is_signed = false;
+ BOOST_STATIC_CONSTEXPR bool is_integer = false;
+ BOOST_STATIC_CONSTEXPR bool is_exact = false;
+ BOOST_STATIC_CONSTEXPR int radix = 0;
+ static number_type epsilon() { return number_type(); }
+ static number_type round_error() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR int min_exponent = 0;
+ BOOST_STATIC_CONSTEXPR int min_exponent10 = 0;
+ BOOST_STATIC_CONSTEXPR int max_exponent = 0;
+ BOOST_STATIC_CONSTEXPR int max_exponent10 = 0;
+ BOOST_STATIC_CONSTEXPR bool has_infinity = false;
+ BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
+ BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
+ BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
+ BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
static number_type infinity() { return number_type(); }
static number_type quiet_NaN() { return number_type(); }
static number_type signaling_NaN() { return number_type(); }
BOOST_STATIC_CONSTEXPR bool is_modulo = false;
BOOST_STATIC_CONSTEXPR bool traps = false;
BOOST_STATIC_CONSTEXPR bool tinyness_before = false;
- BOOST_STATIC_CONSTEXPR float_round_style round_style = round_indeterminate;
+ BOOST_STATIC_CONSTEXPR float_round_style round_style = round_indeterminate;
};
#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
{
return number_type();
}
- static number_type lowest() { return (min)(); }
- BOOST_STATIC_CONSTEXPR int digits = INT_MAX;
- BOOST_STATIC_CONSTEXPR int digits10 = (INT_MAX / 1000) * 301L;
- BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
- BOOST_STATIC_CONSTEXPR bool is_signed = true;
- BOOST_STATIC_CONSTEXPR bool is_integer = true;
- BOOST_STATIC_CONSTEXPR bool is_exact = true;
- BOOST_STATIC_CONSTEXPR int radix = 2;
- static number_type epsilon() { return number_type(); }
- static number_type round_error() { return number_type(); }
- BOOST_STATIC_CONSTEXPR int min_exponent = 0;
- BOOST_STATIC_CONSTEXPR int min_exponent10 = 0;
- BOOST_STATIC_CONSTEXPR int max_exponent = 0;
- BOOST_STATIC_CONSTEXPR int max_exponent10 = 0;
- BOOST_STATIC_CONSTEXPR bool has_infinity = false;
- BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
- BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
- BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
- BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
+ static number_type lowest() { return (min)(); }
+ BOOST_STATIC_CONSTEXPR int digits = INT_MAX;
+ BOOST_STATIC_CONSTEXPR int digits10 = (INT_MAX / 1000) * 301L;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
+ BOOST_STATIC_CONSTEXPR bool is_signed = true;
+ BOOST_STATIC_CONSTEXPR bool is_integer = true;
+ BOOST_STATIC_CONSTEXPR bool is_exact = true;
+ BOOST_STATIC_CONSTEXPR int radix = 2;
+ static number_type epsilon() { return number_type(); }
+ static number_type round_error() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR int min_exponent = 0;
+ BOOST_STATIC_CONSTEXPR int min_exponent10 = 0;
+ BOOST_STATIC_CONSTEXPR int max_exponent = 0;
+ BOOST_STATIC_CONSTEXPR int max_exponent10 = 0;
+ BOOST_STATIC_CONSTEXPR bool has_infinity = false;
+ BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
+ BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
+ BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
+ BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
static number_type infinity() { return number_type(); }
static number_type quiet_NaN() { return number_type(); }
static number_type signaling_NaN() { return number_type(); }
BOOST_STATIC_CONSTEXPR bool is_modulo = false;
BOOST_STATIC_CONSTEXPR bool traps = false;
BOOST_STATIC_CONSTEXPR bool tinyness_before = false;
- BOOST_STATIC_CONSTEXPR float_round_style round_style = round_toward_zero;
+ BOOST_STATIC_CONSTEXPR float_round_style round_style = round_toward_zero;
};
#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
}
static number_type lowest() { return (min)(); }
// Digits are unbounded, use zero for now:
- BOOST_STATIC_CONSTEXPR int digits = INT_MAX;
- BOOST_STATIC_CONSTEXPR int digits10 = (INT_MAX / 1000) * 301L;
- BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
- BOOST_STATIC_CONSTEXPR bool is_signed = true;
- BOOST_STATIC_CONSTEXPR bool is_integer = false;
- BOOST_STATIC_CONSTEXPR bool is_exact = true;
- BOOST_STATIC_CONSTEXPR int radix = 2;
- static number_type epsilon() { return number_type(); }
- static number_type round_error() { return number_type(); }
- BOOST_STATIC_CONSTEXPR int min_exponent = 0;
- BOOST_STATIC_CONSTEXPR int min_exponent10 = 0;
- BOOST_STATIC_CONSTEXPR int max_exponent = 0;
- BOOST_STATIC_CONSTEXPR int max_exponent10 = 0;
- BOOST_STATIC_CONSTEXPR bool has_infinity = false;
- BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
- BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
- BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
- BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
+ BOOST_STATIC_CONSTEXPR int digits = INT_MAX;
+ BOOST_STATIC_CONSTEXPR int digits10 = (INT_MAX / 1000) * 301L;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
+ BOOST_STATIC_CONSTEXPR bool is_signed = true;
+ BOOST_STATIC_CONSTEXPR bool is_integer = false;
+ BOOST_STATIC_CONSTEXPR bool is_exact = true;
+ BOOST_STATIC_CONSTEXPR int radix = 2;
+ static number_type epsilon() { return number_type(); }
+ static number_type round_error() { return number_type(); }
+ BOOST_STATIC_CONSTEXPR int min_exponent = 0;
+ BOOST_STATIC_CONSTEXPR int min_exponent10 = 0;
+ BOOST_STATIC_CONSTEXPR int max_exponent = 0;
+ BOOST_STATIC_CONSTEXPR int max_exponent10 = 0;
+ BOOST_STATIC_CONSTEXPR bool has_infinity = false;
+ BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false;
+ BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
+ BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent;
+ BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
static number_type infinity() { return number_type(); }
static number_type quiet_NaN() { return number_type(); }
static number_type signaling_NaN() { return number_type(); }
BOOST_STATIC_CONSTEXPR bool is_modulo = false;
BOOST_STATIC_CONSTEXPR bool traps = false;
BOOST_STATIC_CONSTEXPR bool tinyness_before = false;
- BOOST_STATIC_CONSTEXPR float_round_style round_style = round_toward_zero;
+ BOOST_STATIC_CONSTEXPR float_round_style round_style = round_toward_zero;
};
#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION