cstdfloat_limits.hpp 6.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. // Implement quadruple-precision std::numeric_limits<> support.
  10. #ifndef _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
  11. #define _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_
  12. #include <boost/math/cstdfloat/cstdfloat_types.hpp>
  13. #if defined(__GNUC__) && defined(BOOST_MATH_USE_FLOAT128)
  14. //
  15. // This is the only way we can avoid
  16. // warning: non-standard suffix on floating constant [-Wpedantic]
  17. // when building with -Wall -pedantic. Neither __extension__
  18. // nor #pragma dianostic ignored work :(
  19. //
  20. #pragma GCC system_header
  21. #endif
  22. #if defined(BOOST_CSTDFLOAT_HAS_INTERNAL_FLOAT128_T) && defined(BOOST_MATH_USE_FLOAT128) && !defined(BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT)
  23. #include <limits>
  24. // Define the name of the global quadruple-precision function to be used for
  25. // calculating quiet_NaN() in the specialization of std::numeric_limits<>.
  26. #if defined(BOOST_INTEL)
  27. #define BOOST_CSTDFLOAT_FLOAT128_SQRT __sqrtq
  28. #elif defined(__GNUC__)
  29. #define BOOST_CSTDFLOAT_FLOAT128_SQRT sqrtq
  30. #endif
  31. // Forward declaration of the quadruple-precision square root function.
  32. extern "C" boost::math::cstdfloat::detail::float_internal128_t BOOST_CSTDFLOAT_FLOAT128_SQRT(boost::math::cstdfloat::detail::float_internal128_t) throw();
  33. namespace std
  34. {
  35. template<>
  36. class numeric_limits<boost::math::cstdfloat::detail::float_internal128_t>
  37. {
  38. public:
  39. BOOST_STATIC_CONSTEXPR bool is_specialized = true;
  40. static boost::math::cstdfloat::detail::float_internal128_t (min) () BOOST_NOEXCEPT { return BOOST_CSTDFLOAT_FLOAT128_MIN; }
  41. static boost::math::cstdfloat::detail::float_internal128_t (max) () BOOST_NOEXCEPT { return BOOST_CSTDFLOAT_FLOAT128_MAX; }
  42. static boost::math::cstdfloat::detail::float_internal128_t lowest() BOOST_NOEXCEPT { return -(max)(); }
  43. BOOST_STATIC_CONSTEXPR int digits = 113;
  44. BOOST_STATIC_CONSTEXPR int digits10 = 33;
  45. BOOST_STATIC_CONSTEXPR int max_digits10 = 36;
  46. BOOST_STATIC_CONSTEXPR bool is_signed = true;
  47. BOOST_STATIC_CONSTEXPR bool is_integer = false;
  48. BOOST_STATIC_CONSTEXPR bool is_exact = false;
  49. BOOST_STATIC_CONSTEXPR int radix = 2;
  50. static boost::math::cstdfloat::detail::float_internal128_t epsilon () { return BOOST_CSTDFLOAT_FLOAT128_EPS; }
  51. static boost::math::cstdfloat::detail::float_internal128_t round_error() { return BOOST_FLOAT128_C(0.5); }
  52. BOOST_STATIC_CONSTEXPR int min_exponent = -16381;
  53. BOOST_STATIC_CONSTEXPR int min_exponent10 = static_cast<int>((min_exponent * 301L) / 1000L);
  54. BOOST_STATIC_CONSTEXPR int max_exponent = +16384;
  55. BOOST_STATIC_CONSTEXPR int max_exponent10 = static_cast<int>((max_exponent * 301L) / 1000L);
  56. BOOST_STATIC_CONSTEXPR bool has_infinity = true;
  57. BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = true;
  58. BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false;
  59. BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_present;
  60. BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false;
  61. static boost::math::cstdfloat::detail::float_internal128_t infinity () { return BOOST_FLOAT128_C(1.0) / BOOST_FLOAT128_C(0.0); }
  62. static boost::math::cstdfloat::detail::float_internal128_t quiet_NaN () { return -(::BOOST_CSTDFLOAT_FLOAT128_SQRT(BOOST_FLOAT128_C(-1.0))); }
  63. static boost::math::cstdfloat::detail::float_internal128_t signaling_NaN() { return BOOST_FLOAT128_C(0.0); }
  64. static boost::math::cstdfloat::detail::float_internal128_t denorm_min () { return BOOST_CSTDFLOAT_FLOAT128_DENORM_MIN; }
  65. BOOST_STATIC_CONSTEXPR bool is_iec559 = true;
  66. BOOST_STATIC_CONSTEXPR bool is_bounded = true;
  67. BOOST_STATIC_CONSTEXPR bool is_modulo = false;
  68. BOOST_STATIC_CONSTEXPR bool traps = false;
  69. BOOST_STATIC_CONSTEXPR bool tinyness_before = false;
  70. BOOST_STATIC_CONSTEXPR float_round_style round_style = round_to_nearest;
  71. };
  72. } // namespace std
  73. #endif // Not BOOST_CSTDFLOAT_NO_LIBQUADMATH_SUPPORT (i.e., the user would like to have libquadmath support)
  74. #endif // _BOOST_CSTDFLOAT_LIMITS_2014_01_09_HPP_