diff --git a/include/boost/multiprecision/cpp_bin_float.hpp b/include/boost/multiprecision/cpp_bin_float.hpp index 0b1e194e..c8cf06bc 100644 --- a/include/boost/multiprecision/cpp_bin_float.hpp +++ b/include/boost/multiprecision/cpp_bin_float.hpp @@ -104,6 +104,9 @@ public: && (std::numeric_limits::digits <= (int)bit_count) && (std::numeric_limits::radix == 2) && (std::numeric_limits::is_specialized) +#ifdef BOOST_HAS_FLOAT128 + && !boost::is_same::value +#endif >::type const* = 0) : m_data(), m_exponent(0), m_sign(false) { @@ -117,7 +120,10 @@ public: && (std::numeric_limits::digits > (int)bit_count) && (std::numeric_limits::radix == 2) && (std::numeric_limits::is_specialized) - >::type const* = 0) +#ifdef BOOST_HAS_FLOAT128 + && !boost::is_same::value +#endif +>::type const* = 0) : m_data(), m_exponent(0), m_sign(false) { this->assign_float(f); diff --git a/include/boost/multiprecision/cpp_dec_float.hpp b/include/boost/multiprecision/cpp_dec_float.hpp index 2826538d..6e150928 100644 --- a/include/boost/multiprecision/cpp_dec_float.hpp +++ b/include/boost/multiprecision/cpp_dec_float.hpp @@ -2896,7 +2896,7 @@ template inline void eval_scalbn(cpp_dec_float& result, const cpp_dec_float& val, ArgType e_) { using default_ops::eval_multiply; - const ExponentType e = e_; + const ExponentType e = static_cast(e_); cpp_dec_float t(1.0, e); eval_multiply(result, val, t); } diff --git a/include/boost/multiprecision/detail/default_ops.hpp b/include/boost/multiprecision/detail/default_ops.hpp index 3b6038df..bfdb8bd3 100644 --- a/include/boost/multiprecision/detail/default_ops.hpp +++ b/include/boost/multiprecision/detail/default_ops.hpp @@ -1479,7 +1479,7 @@ inline typename B::exponent_type eval_ilogb(const B& val) { case FP_NAN: #ifdef FP_ILOGBNAN - return FP_ILOGBNAN; + return FP_ILOGBNAN > 0 ? (std::numeric_limits::max)() : (std::numeric_limits::min)(); #else return (std::numeric_limits::max)(); #endif diff --git a/include/boost/multiprecision/detail/number_base.hpp b/include/boost/multiprecision/detail/number_base.hpp index a977d525..ca065bb5 100644 --- a/include/boost/multiprecision/detail/number_base.hpp +++ b/include/boost/multiprecision/detail/number_base.hpp @@ -38,8 +38,9 @@ // // Thread local storage: +// Note fails on Mingw, see https://sourceforge.net/p/mingw-w64/bugs/527/ // -#if !defined(BOOST_NO_CXX11_THREAD_LOCAL) && !defined(BOOST_INTEL) +#if !defined(BOOST_NO_CXX11_THREAD_LOCAL) && !defined(BOOST_INTEL) && !defined(__MINGW32__) # define BOOST_MP_THREAD_LOCAL thread_local #else # define BOOST_MP_THREAD_LOCAL diff --git a/test/test_sf_import_c99.cpp b/test/test_sf_import_c99.cpp index 4b60c516..2e45b5e7 100644 --- a/test/test_sf_import_c99.cpp +++ b/test/test_sf_import_c99.cpp @@ -1263,7 +1263,7 @@ void test_c99_appendix_F() typename T::backend_type::exponent_type fp_ilogb0 = (std::numeric_limits::min)(); typename T::backend_type::exponent_type fp_ilogbnan = #ifdef FP_ILOGBNAN - FP_ILOGBNAN; + FP_ILOGBNAN < 0 ? (std::numeric_limits::min)() : (std::numeric_limits::max)(); #else INT_MAX; #endif