brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 59c6147 Raw
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