88 lines · plain
1///////////////////////////////////////////////////////////////////////////////2// Copyright Christopher Kormanyos 2014.3// Copyright John Maddock 2014.4// Copyright Paul Bristow 2014.5// Distributed under the Boost Software License,6// Version 1.0. (See accompanying file LICENSE_1_0.txt7// or copy at http://www.boost.org/LICENSE_1_0.txt)8//9 10// Implement quadruple-precision std::numeric_limits<> support.11 12#ifndef BOOST_MATH_CSTDFLOAT_LIMITS_2014_01_09_HPP_13 #define BOOST_MATH_CSTDFLOAT_LIMITS_2014_01_09_HPP_14 15 #include <boost/math/cstdfloat/cstdfloat_types.hpp>16 17 #if defined(__GNUC__) && defined(BOOST_MATH_USE_FLOAT128)18 //19 // This is the only way we can avoid20 // warning: non-standard suffix on floating constant [-Wpedantic]21 // when building with -Wall -pedantic. Neither __extension__22 // nor #pragma diagnostic ignored work :(23 //24 #pragma GCC system_header25 #endif26 27 #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT) && (!defined(_GLIBCXX_RELEASE) || (defined(_GLIBCXX_RELEASE) && _GLIBCXX_RELEASE < 14))28 29 #include <limits>30 #include <boost/math/tools/nothrow.hpp>31 32 // Define the name of the global quadruple-precision function to be used for33 // calculating quiet_NaN() in the specialization of std::numeric_limits<>.34 #if defined(__INTEL_COMPILER)35 #define BOOST_CSTDFLOAT_FLOAT128_SQRT __sqrtq36 #elif defined(__GNUC__)37 #define BOOST_CSTDFLOAT_FLOAT128_SQRT sqrtq38 #endif39 40 // Forward declaration of the quadruple-precision square root function.41 extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT(boost::math::cstdfloat::detail::float_internal128_t) BOOST_MATH_NOTHROW;42 43 namespace std44 {45 template<>46 class numeric_limits<boost::math::cstdfloat::detail::float_internal128_t>47 {48 public:49 static constexpr bool is_specialized = true;50 static boost::math::cstdfloat::detail::float_internal128_t (min) () noexcept { return BOOST_CSTDFLOAT_FLOAT128_MIN; }51 static boost::math::cstdfloat::detail::float_internal128_t (max) () noexcept { return BOOST_CSTDFLOAT_FLOAT128_MAX; }52 static boost::math::cstdfloat::detail::float_internal128_t lowest() noexcept { return -(max)(); }53 static constexpr int digits = 113;54 static constexpr int digits10 = 33;55 static constexpr int max_digits10 = 36;56 static constexpr bool is_signed = true;57 static constexpr bool is_integer = false;58 static constexpr bool is_exact = false;59 static constexpr int radix = 2;60 static boost::math::cstdfloat::detail::float_internal128_t epsilon () { return BOOST_CSTDFLOAT_FLOAT128_EPS; }61 static boost::math::cstdfloat::detail::float_internal128_t round_error() { return BOOST_FLOAT128_C(0.5); }62 static constexpr int min_exponent = -16381;63 static constexpr int min_exponent10 = static_cast<int>((min_exponent * 301L) / 1000L);64 static constexpr int max_exponent = +16384;65 static constexpr int max_exponent10 = static_cast<int>((max_exponent * 301L) / 1000L);66 static constexpr bool has_infinity = true;67 static constexpr bool has_quiet_NaN = true;68 static constexpr bool has_signaling_NaN = false;69 static constexpr float_denorm_style has_denorm = denorm_present;70 static constexpr bool has_denorm_loss = false;71 static boost::math::cstdfloat::detail::float_internal128_t infinity () { return BOOST_FLOAT128_C(1.0) / BOOST_FLOAT128_C(0.0); }72 static boost::math::cstdfloat::detail::float_internal128_t quiet_NaN () { return -(::BOOST_CSTDFLOAT_FLOAT128_SQRT(BOOST_FLOAT128_C(-1.0))); }73 static boost::math::cstdfloat::detail::float_internal128_t signaling_NaN() { return BOOST_FLOAT128_C(0.0); }74 static boost::math::cstdfloat::detail::float_internal128_t denorm_min () { return BOOST_CSTDFLOAT_FLOAT128_DENORM_MIN; }75 static constexpr bool is_iec559 = true;76 static constexpr bool is_bounded = true;77 static constexpr bool is_modulo = false;78 static constexpr bool traps = false;79 static constexpr bool tinyness_before = false;80 static constexpr float_round_style round_style = round_to_nearest;81 };82 } // namespace std83 84 #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)85 86#endif // BOOST_MATH_CSTDFLOAT_LIMITS_2014_01_09_HPP_87 88