• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.txt
7 // 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 avoid
20 // 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_header
25 #endif
26 
27   #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
28 
29     #include <limits>
30 
31     // Define the name of the global quadruple-precision function to be used for
32     // calculating quiet_NaN() in the specialization of std::numeric_limits<>.
33     #if defined(BOOST_INTEL)
34       #define BOOST_CSTDFLOAT_FLOAT128_SQRT   __sqrtq
35     #elif defined(__GNUC__)
36       #define BOOST_CSTDFLOAT_FLOAT128_SQRT   sqrtq
37     #endif
38 
39     // Forward declaration of the quadruple-precision square root function.
40     extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT(boost::math::cstdfloat::detail::float_internal128_t) throw();
41 
42     namespace std
43     {
44       template<>
45       class numeric_limits<boost::math::cstdfloat::detail::float_internal128_t>
46       {
47       public:
48         BOOST_STATIC_CONSTEXPR bool                                                 is_specialized           = true;
float_internal128_t(min)49         static                 boost::math::cstdfloat::detail::float_internal128_t  (min) () BOOST_NOEXCEPT  { return BOOST_CSTDFLOAT_FLOAT128_MIN; }
float_internal128_t(max)50         static                 boost::math::cstdfloat::detail::float_internal128_t  (max) () BOOST_NOEXCEPT  { return BOOST_CSTDFLOAT_FLOAT128_MAX; }
lowest()51         static                 boost::math::cstdfloat::detail::float_internal128_t  lowest() BOOST_NOEXCEPT  { return -(max)(); }
52         BOOST_STATIC_CONSTEXPR int                                                  digits                   = 113;
53         BOOST_STATIC_CONSTEXPR int                                                  digits10                 = 33;
54         BOOST_STATIC_CONSTEXPR int                                                  max_digits10             = 36;
55         BOOST_STATIC_CONSTEXPR bool                                                 is_signed                = true;
56         BOOST_STATIC_CONSTEXPR bool                                                 is_integer               = false;
57         BOOST_STATIC_CONSTEXPR bool                                                 is_exact                 = false;
58         BOOST_STATIC_CONSTEXPR int                                                  radix                    = 2;
epsilon()59         static                 boost::math::cstdfloat::detail::float_internal128_t  epsilon    ()            { return BOOST_CSTDFLOAT_FLOAT128_EPS; }
round_error()60         static                 boost::math::cstdfloat::detail::float_internal128_t  round_error()            { return BOOST_FLOAT128_C(0.5); }
61         BOOST_STATIC_CONSTEXPR int                                                  min_exponent             = -16381;
62         BOOST_STATIC_CONSTEXPR int                                                  min_exponent10           = static_cast<int>((min_exponent * 301L) / 1000L);
63         BOOST_STATIC_CONSTEXPR int                                                  max_exponent             = +16384;
64         BOOST_STATIC_CONSTEXPR int                                                  max_exponent10           = static_cast<int>((max_exponent * 301L) / 1000L);
65         BOOST_STATIC_CONSTEXPR bool                                                 has_infinity             = true;
66         BOOST_STATIC_CONSTEXPR bool                                                 has_quiet_NaN            = true;
67         BOOST_STATIC_CONSTEXPR bool                                                 has_signaling_NaN        = false;
68         BOOST_STATIC_CONSTEXPR float_denorm_style                                   has_denorm               = denorm_present;
69         BOOST_STATIC_CONSTEXPR bool                                                 has_denorm_loss          = false;
infinity()70         static                 boost::math::cstdfloat::detail::float_internal128_t  infinity     ()          { return BOOST_FLOAT128_C(1.0) / BOOST_FLOAT128_C(0.0); }
quiet_NaN()71         static                 boost::math::cstdfloat::detail::float_internal128_t  quiet_NaN    ()          { return -(::BOOST_CSTDFLOAT_FLOAT128_SQRT(BOOST_FLOAT128_C(-1.0))); }
signaling_NaN()72         static                 boost::math::cstdfloat::detail::float_internal128_t  signaling_NaN()          { return BOOST_FLOAT128_C(0.0); }
denorm_min()73         static                 boost::math::cstdfloat::detail::float_internal128_t  denorm_min   ()          { return BOOST_CSTDFLOAT_FLOAT128_DENORM_MIN; }
74         BOOST_STATIC_CONSTEXPR bool                                                 is_iec559                = true;
75         BOOST_STATIC_CONSTEXPR bool                                                 is_bounded               = true;
76         BOOST_STATIC_CONSTEXPR bool                                                 is_modulo                = false;
77         BOOST_STATIC_CONSTEXPR bool                                                 traps                    = false;
78         BOOST_STATIC_CONSTEXPR bool                                                 tinyness_before          = false;
79         BOOST_STATIC_CONSTEXPR float_round_style                                    round_style              = round_to_nearest;
80       };
81     } // namespace std
82 
83   #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
84 
85 #endif // BOOST_MATH_CSTDFLOAT_LIMITS_2014_01_09_HPP_
86 
87