889 lines · plain
1// Copyright (c) 2024 Matt Borland2// Use, modification and distribution are subject to the3// Boost Software License, Version 1.0. (See accompanying file4// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)5//6// Regular use of std::numeric_limits functions can not be used on 7// GPU platforms like CUDA since they are missing the __device__ marker8// and libcu++ does not provide something analogous.9// Rather than using giant if else blocks make our own version of numeric limits10//11// On the CUDA NVRTC platform we use a best attempt at emulating the functions12// and values since we do not have any macros to go off of.13// Use the values as found on GCC 11.4 RHEL 9.4 x6414 15#ifndef BOOST_MATH_TOOLS_NUMERIC_LIMITS_HPP16#define BOOST_MATH_TOOLS_NUMERIC_LIMITS_HPP17 18#include <boost/math/tools/config.hpp>19 20#ifndef BOOST_MATH_HAS_NVRTC21 22#include <type_traits>23#include <limits>24#include <climits>25#include <cfloat>26 27#endif28 29namespace boost {30namespace math {31 32template <typename T>33struct numeric_limits 34#ifndef BOOST_MATH_HAS_NVRTC35: public std::numeric_limits<T> {};36#else37{};38#endif39 40#if defined(BOOST_MATH_HAS_GPU_SUPPORT) && !defined(BOOST_MATH_HAS_NVRTC)41 42template <>43struct numeric_limits<float>44{45 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<float>::is_specialized;46 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<float>::is_signed;47 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<float>::is_integer;48 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<float>::is_exact;49 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<float>::has_infinity;50 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<float>::has_quiet_NaN;51 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<float>::has_signaling_NaN;52 53 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<float>::round_style;54 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<float>::is_iec559;55 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<float>::is_bounded;56 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<float>::is_modulo;57 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<float>::digits;58 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<float>::digits10;59 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<float>::max_digits10;60 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<float>::radix;61 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<float>::min_exponent;62 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<float>::min_exponent10;63 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<float>::max_exponent;64 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<float>::max_exponent10;65 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<float>::traps;66 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<float>::tinyness_before;67 68 // Member Functions69 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float (min) () { return FLT_MIN; }70 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float (max) () { return FLT_MAX; }71 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float lowest () { return -FLT_MAX; }72 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float epsilon () { return FLT_EPSILON; }73 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float round_error () { return 0.5F; }74 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float infinity () { return static_cast<float>(INFINITY); }75 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float quiet_NaN () { return static_cast<float>(NAN); }76 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float signaling_NaN () 77 { 78 #ifdef FLT_SNAN79 return FLT_SNAN;80 #else81 return static_cast<float>(NAN);82 #endif83 }84 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float denorm_min () { return FLT_TRUE_MIN; }85};86 87template <>88struct numeric_limits<double>89{90 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<double>::is_specialized;91 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<double>::is_signed;92 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<double>::is_integer;93 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<double>::is_exact;94 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<double>::has_infinity;95 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<double>::has_quiet_NaN;96 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<double>::has_signaling_NaN;97 98 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<double>::round_style;99 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<double>::is_iec559;100 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<double>::is_bounded;101 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<double>::is_modulo;102 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<double>::digits;103 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<double>::digits10;104 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<double>::max_digits10;105 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<double>::radix;106 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<double>::min_exponent;107 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<double>::min_exponent10;108 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<double>::max_exponent;109 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<double>::max_exponent10;110 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<double>::traps;111 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<double>::tinyness_before;112 113 // Member Functions114 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double (min) () { return DBL_MIN; }115 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double (max) () { return DBL_MAX; }116 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double lowest () { return -DBL_MAX; }117 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double epsilon () { return DBL_EPSILON; }118 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double round_error () { return 0.5; }119 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double infinity () { return static_cast<double>(INFINITY); }120 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double quiet_NaN () { return static_cast<double>(NAN); }121 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double signaling_NaN () 122 { 123 #ifdef DBL_SNAN124 return DBL_SNAN;125 #else126 return static_cast<double>(NAN);127 #endif128 }129 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double denorm_min () { return DBL_TRUE_MIN; }130};131 132template <>133struct numeric_limits<short>134{135 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<short>::is_specialized;136 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<short>::is_signed;137 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<short>::is_integer;138 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<short>::is_exact;139 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<short>::has_infinity;140 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<short>::has_quiet_NaN;141 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<short>::has_signaling_NaN;142 143 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<short>::round_style;144 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<short>::is_iec559;145 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<short>::is_bounded;146 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<short>::is_modulo;147 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<short>::digits;148 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<short>::digits10;149 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<short>::max_digits10;150 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<short>::radix;151 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<short>::min_exponent;152 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<short>::min_exponent10;153 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<short>::max_exponent;154 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<short>::max_exponent10;155 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<short>::traps;156 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<short>::tinyness_before;157 158 // Member Functions159 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short (min) () { return SHRT_MIN; }160 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short (max) () { return SHRT_MAX; }161 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short lowest () { return SHRT_MIN; }162 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short epsilon () { return 0; }163 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short round_error () { return 0; }164 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short infinity () { return 0; }165 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short quiet_NaN () { return 0; }166 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short signaling_NaN () { return 0; }167 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short denorm_min () { return 0; }168};169 170template <>171struct numeric_limits<unsigned short>172{173 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<unsigned short>::is_specialized;174 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<unsigned short>::is_signed;175 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<unsigned short>::is_integer;176 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<unsigned short>::is_exact;177 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<unsigned short>::has_infinity;178 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<unsigned short>::has_quiet_NaN;179 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<unsigned short>::has_signaling_NaN;180 181 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<unsigned short>::round_style;182 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<unsigned short>::is_iec559;183 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<unsigned short>::is_bounded;184 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<unsigned short>::is_modulo;185 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<unsigned short>::digits;186 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<unsigned short>::digits10;187 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<unsigned short>::max_digits10;188 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<unsigned short>::radix;189 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<unsigned short>::min_exponent;190 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<unsigned short>::min_exponent10;191 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<unsigned short>::max_exponent;192 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<unsigned short>::max_exponent10;193 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<unsigned short>::traps;194 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<unsigned short>::tinyness_before;195 196 // Member Functions197 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short (min) () { return 0; }198 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short (max) () { return USHRT_MAX; }199 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short lowest () { return 0; }200 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short epsilon () { return 0; }201 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short round_error () { return 0; }202 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short infinity () { return 0; }203 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short quiet_NaN () { return 0; }204 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short signaling_NaN () { return 0; }205 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short denorm_min () { return 0; }206};207 208template <>209struct numeric_limits<int>210{211 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<int>::is_specialized;212 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<int>::is_signed;213 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<int>::is_integer;214 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<int>::is_exact;215 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<int>::has_infinity;216 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<int>::has_quiet_NaN;217 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<int>::has_signaling_NaN;218 219 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<int>::round_style;220 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<int>::is_iec559;221 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<int>::is_bounded;222 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<int>::is_modulo;223 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<int>::digits;224 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<int>::digits10;225 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<int>::max_digits10;226 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<int>::radix;227 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<int>::min_exponent;228 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<int>::min_exponent10;229 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<int>::max_exponent;230 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<int>::max_exponent10;231 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<int>::traps;232 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<int>::tinyness_before;233 234 // Member Functions235 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int (min) () { return INT_MIN; }236 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int (max) () { return INT_MAX; }237 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int lowest () { return INT_MIN; }238 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int epsilon () { return 0; }239 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int round_error () { return 0; }240 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int infinity () { return 0; }241 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int quiet_NaN () { return 0; }242 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int signaling_NaN () { return 0; }243 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int denorm_min () { return 0; }244};245 246template <>247struct numeric_limits<unsigned int>248{249 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<unsigned int>::is_specialized;250 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<unsigned int>::is_signed;251 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<unsigned int>::is_integer;252 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<unsigned int>::is_exact;253 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<unsigned int>::has_infinity;254 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<unsigned int>::has_quiet_NaN;255 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<unsigned int>::has_signaling_NaN;256 257 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<unsigned int>::round_style;258 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<unsigned int>::is_iec559;259 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<unsigned int>::is_bounded;260 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<unsigned int>::is_modulo;261 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<unsigned int>::digits;262 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<unsigned int>::digits10;263 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<unsigned int>::max_digits10;264 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<unsigned int>::radix;265 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<unsigned int>::min_exponent;266 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<unsigned int>::min_exponent10;267 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<unsigned int>::max_exponent;268 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<unsigned int>::max_exponent10;269 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<unsigned int>::traps;270 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<unsigned int>::tinyness_before;271 272 // Member Functions273 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int (min) () { return 0; }274 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int (max) () { return UINT_MAX; }275 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int lowest () { return 0; }276 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int epsilon () { return 0; }277 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int round_error () { return 0; }278 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int infinity () { return 0; }279 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int quiet_NaN () { return 0; }280 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int signaling_NaN () { return 0; }281 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int denorm_min () { return 0; }282};283 284template <>285struct numeric_limits<long>286{287 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<long>::is_specialized;288 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<long>::is_signed;289 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<long>::is_integer;290 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<long>::is_exact;291 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<long>::has_infinity;292 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<long>::has_quiet_NaN;293 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<long>::has_signaling_NaN;294 295 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<long>::round_style;296 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<long>::is_iec559;297 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<long>::is_bounded;298 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<long>::is_modulo;299 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<long>::digits;300 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<long>::digits10;301 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<long>::max_digits10;302 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<long>::radix;303 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<long>::min_exponent;304 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<long>::min_exponent10;305 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<long>::max_exponent;306 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<long>::max_exponent10;307 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<long>::traps;308 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<long>::tinyness_before;309 310 // Member Functions311 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long (min) () { return LONG_MIN; }312 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long (max) () { return LONG_MAX; }313 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long lowest () { return LONG_MIN; }314 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long epsilon () { return 0; }315 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long round_error () { return 0; }316 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long infinity () { return 0; }317 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long quiet_NaN () { return 0; }318 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long signaling_NaN () { return 0; }319 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long denorm_min () { return 0; }320};321 322template <>323struct numeric_limits<unsigned long>324{325 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<unsigned long>::is_specialized;326 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<unsigned long>::is_signed;327 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<unsigned long>::is_integer;328 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<unsigned long>::is_exact;329 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<unsigned long>::has_infinity;330 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<unsigned long>::has_quiet_NaN;331 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<unsigned long>::has_signaling_NaN;332 333 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<unsigned long>::round_style;334 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<unsigned long>::is_iec559;335 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<unsigned long>::is_bounded;336 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<unsigned long>::is_modulo;337 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<unsigned long>::digits;338 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<unsigned long>::digits10;339 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<unsigned long>::max_digits10;340 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<unsigned long>::radix;341 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<unsigned long>::min_exponent;342 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<unsigned long>::min_exponent10;343 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<unsigned long>::max_exponent;344 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<unsigned long>::max_exponent10;345 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<unsigned long>::traps;346 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<unsigned long>::tinyness_before;347 348 // Member Functions349 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long (min) () { return 0; }350 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long (max) () { return ULONG_MAX; }351 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long lowest () { return 0; }352 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long epsilon () { return 0; }353 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long round_error () { return 0; }354 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long infinity () { return 0; }355 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long quiet_NaN () { return 0; }356 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long signaling_NaN () { return 0; }357 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long denorm_min () { return 0; }358};359 360template <>361struct numeric_limits<long long>362{363 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<long long>::is_specialized;364 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<long long>::is_signed;365 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<long long>::is_integer;366 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<long long>::is_exact;367 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<long long>::has_infinity;368 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<long long>::has_quiet_NaN;369 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<long long>::has_signaling_NaN;370 371 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<long long>::round_style;372 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<long long>::is_iec559;373 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<long long>::is_bounded;374 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<long long>::is_modulo;375 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<long long>::digits;376 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<long long>::digits10;377 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<long long>::max_digits10;378 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<long long>::radix;379 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<long long>::min_exponent;380 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<long long>::min_exponent10;381 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<long long>::max_exponent;382 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<long long>::max_exponent10;383 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<long long>::traps;384 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<long long>::tinyness_before;385 386 // Member Functions387 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long (min) () { return LLONG_MIN; }388 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long (max) () { return LLONG_MAX; }389 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long lowest () { return LLONG_MIN; }390 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long epsilon () { return 0; }391 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long round_error () { return 0; }392 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long infinity () { return 0; }393 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long quiet_NaN () { return 0; }394 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long signaling_NaN () { return 0; }395 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long denorm_min () { return 0; }396};397 398template <>399struct numeric_limits<unsigned long long>400{401 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<unsigned long long>::is_specialized;402 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<unsigned long long>::is_signed;403 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<unsigned long long>::is_integer;404 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<unsigned long long>::is_exact;405 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<unsigned long long>::has_infinity;406 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<unsigned long long>::has_quiet_NaN;407 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<unsigned long long>::has_signaling_NaN;408 409 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<unsigned long long>::round_style;410 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<unsigned long long>::is_iec559;411 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<unsigned long long>::is_bounded;412 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<unsigned long long>::is_modulo;413 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<unsigned long long>::digits;414 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<unsigned long long>::digits10;415 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<unsigned long long>::max_digits10;416 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<unsigned long long>::radix;417 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<unsigned long long>::min_exponent;418 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<unsigned long long>::min_exponent10;419 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<unsigned long long>::max_exponent;420 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<unsigned long long>::max_exponent10;421 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<unsigned long long>::traps;422 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<unsigned long long>::tinyness_before;423 424 // Member Functions425 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long (min) () { return 0; }426 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long (max) () { return ULLONG_MAX; }427 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long lowest () { return 0; }428 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long epsilon () { return 0; }429 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long round_error () { return 0; }430 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long infinity () { return 0; }431 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long quiet_NaN () { return 0; }432 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long signaling_NaN () { return 0; }433 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long denorm_min () { return 0; }434};435 436template <>437struct numeric_limits<bool>438{439 BOOST_MATH_STATIC constexpr bool is_specialized = std::numeric_limits<bool>::is_specialized;440 BOOST_MATH_STATIC constexpr bool is_signed = std::numeric_limits<bool>::is_signed;441 BOOST_MATH_STATIC constexpr bool is_integer = std::numeric_limits<bool>::is_integer;442 BOOST_MATH_STATIC constexpr bool is_exact = std::numeric_limits<bool>::is_exact;443 BOOST_MATH_STATIC constexpr bool has_infinity = std::numeric_limits<bool>::has_infinity;444 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = std::numeric_limits<bool>::has_quiet_NaN;445 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = std::numeric_limits<bool>::has_signaling_NaN;446 447 BOOST_MATH_STATIC constexpr std::float_round_style round_style = std::numeric_limits<bool>::round_style;448 BOOST_MATH_STATIC constexpr bool is_iec559 = std::numeric_limits<bool>::is_iec559;449 BOOST_MATH_STATIC constexpr bool is_bounded = std::numeric_limits<bool>::is_bounded;450 BOOST_MATH_STATIC constexpr bool is_modulo = std::numeric_limits<bool>::is_modulo;451 BOOST_MATH_STATIC constexpr int digits = std::numeric_limits<bool>::digits;452 BOOST_MATH_STATIC constexpr int digits10 = std::numeric_limits<bool>::digits10;453 BOOST_MATH_STATIC constexpr int max_digits10 = std::numeric_limits<bool>::max_digits10;454 BOOST_MATH_STATIC constexpr int radix = std::numeric_limits<bool>::radix;455 BOOST_MATH_STATIC constexpr int min_exponent = std::numeric_limits<bool>::min_exponent;456 BOOST_MATH_STATIC constexpr int min_exponent10 = std::numeric_limits<bool>::min_exponent10;457 BOOST_MATH_STATIC constexpr int max_exponent = std::numeric_limits<bool>::max_exponent;458 BOOST_MATH_STATIC constexpr int max_exponent10 = std::numeric_limits<bool>::max_exponent10;459 BOOST_MATH_STATIC constexpr bool traps = std::numeric_limits<bool>::traps;460 BOOST_MATH_STATIC constexpr bool tinyness_before = std::numeric_limits<bool>::tinyness_before;461 462 // Member Functions463 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool (min) () { return false; }464 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool (max) () { return true; }465 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool lowest () { return false; }466 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool epsilon () { return false; }467 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool round_error () { return false; }468 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool infinity () { return false; }469 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool quiet_NaN () { return false; }470 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool signaling_NaN () { return false; }471 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool denorm_min () { return false; }472};473 474#elif defined(BOOST_MATH_HAS_NVRTC) // Pure NVRTC support - Removes rounding style and approximates the traits475 476template <>477struct numeric_limits<float>478{479 BOOST_MATH_STATIC constexpr bool is_specialized = true;480 BOOST_MATH_STATIC constexpr bool is_signed = true;481 BOOST_MATH_STATIC constexpr bool is_integer = false;482 BOOST_MATH_STATIC constexpr bool is_exact = false;483 BOOST_MATH_STATIC constexpr bool has_infinity = true;484 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = true;485 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = true;486 487 BOOST_MATH_STATIC constexpr bool is_iec559 = true;488 BOOST_MATH_STATIC constexpr bool is_bounded = true;489 BOOST_MATH_STATIC constexpr bool is_modulo = false;490 BOOST_MATH_STATIC constexpr int digits = 24;491 BOOST_MATH_STATIC constexpr int digits10 = 6;492 BOOST_MATH_STATIC constexpr int max_digits10 = 9;493 BOOST_MATH_STATIC constexpr int radix = 2;494 BOOST_MATH_STATIC constexpr int min_exponent = -125;495 BOOST_MATH_STATIC constexpr int min_exponent10 = -37;496 BOOST_MATH_STATIC constexpr int max_exponent = 128;497 BOOST_MATH_STATIC constexpr int max_exponent10 = 38;498 BOOST_MATH_STATIC constexpr bool traps = false;499 BOOST_MATH_STATIC constexpr bool tinyness_before = false;500 501 // Member Functions502 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float (min) () { return 1.17549435e-38F; }503 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float (max) () { return 3.40282347e+38F; }504 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float lowest () { return -3.40282347e+38F; }505 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float epsilon () { return 1.1920929e-07; }506 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float round_error () { return 0.5F; }507 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float infinity () { return __int_as_float(0x7f800000); }508 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float quiet_NaN () { return __int_as_float(0x7fc00000); }509 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float signaling_NaN () { return __int_as_float(0x7fa00000); }510 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr float denorm_min () { return 1.4013e-45F; }511};512 513template <>514struct numeric_limits<double>515{516 BOOST_MATH_STATIC constexpr bool is_specialized = true;517 BOOST_MATH_STATIC constexpr bool is_signed = true;518 BOOST_MATH_STATIC constexpr bool is_integer = false;519 BOOST_MATH_STATIC constexpr bool is_exact = false;520 BOOST_MATH_STATIC constexpr bool has_infinity = true;521 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = true;522 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = true;523 524 BOOST_MATH_STATIC constexpr bool is_iec559 = true;525 BOOST_MATH_STATIC constexpr bool is_bounded = true;526 BOOST_MATH_STATIC constexpr bool is_modulo = false;527 BOOST_MATH_STATIC constexpr int digits = 53;528 BOOST_MATH_STATIC constexpr int digits10 = 15;529 BOOST_MATH_STATIC constexpr int max_digits10 = 21;530 BOOST_MATH_STATIC constexpr int radix = 2;531 BOOST_MATH_STATIC constexpr int min_exponent = -1021;532 BOOST_MATH_STATIC constexpr int min_exponent10 = -307;533 BOOST_MATH_STATIC constexpr int max_exponent = 1024;534 BOOST_MATH_STATIC constexpr int max_exponent10 = 308;535 BOOST_MATH_STATIC constexpr bool traps = false;536 BOOST_MATH_STATIC constexpr bool tinyness_before = false;537 538 // Member Functions539 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double (min) () { return 2.2250738585072014e-308; }540 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double (max) () { return 1.7976931348623157e+308; }541 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double lowest () { return -1.7976931348623157e+308; }542 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double epsilon () { return 2.2204460492503131e-16; }543 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double round_error () { return 0.5; }544 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double infinity () { return __longlong_as_double(0x7ff0000000000000ULL); }545 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double quiet_NaN () { return __longlong_as_double(0x7ff8000000000000ULL); }546 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double signaling_NaN () { return __longlong_as_double(0x7ff4000000000000ULL); }547 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr double denorm_min () { return 4.9406564584124654e-324; }548};549 550template <>551struct numeric_limits<short>552{553 BOOST_MATH_STATIC constexpr bool is_specialized = true;554 BOOST_MATH_STATIC constexpr bool is_signed = true;555 BOOST_MATH_STATIC constexpr bool is_integer = true;556 BOOST_MATH_STATIC constexpr bool is_exact = true;557 BOOST_MATH_STATIC constexpr bool has_infinity = false;558 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;559 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;560 561 BOOST_MATH_STATIC constexpr bool is_iec559 = false;562 BOOST_MATH_STATIC constexpr bool is_bounded = true;563 BOOST_MATH_STATIC constexpr bool is_modulo = false;564 BOOST_MATH_STATIC constexpr int digits = 15;565 BOOST_MATH_STATIC constexpr int digits10 = 4;566 BOOST_MATH_STATIC constexpr int max_digits10 = 0;567 BOOST_MATH_STATIC constexpr int radix = 2;568 BOOST_MATH_STATIC constexpr int min_exponent = 0;569 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;570 BOOST_MATH_STATIC constexpr int max_exponent = 0;571 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;572 BOOST_MATH_STATIC constexpr bool traps = true;573 BOOST_MATH_STATIC constexpr bool tinyness_before = false;574 575 // Member Functions576 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short (min) () { return -32768; }577 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short (max) () { return 32767; }578 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short lowest () { return -32768; }579 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short epsilon () { return 0; }580 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short round_error () { return 0; }581 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short infinity () { return 0; }582 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short quiet_NaN () { return 0; }583 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short signaling_NaN () { return 0; }584 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr short denorm_min () { return 0; }585};586 587template <>588struct numeric_limits<unsigned short>589{590 BOOST_MATH_STATIC constexpr bool is_specialized = true;591 BOOST_MATH_STATIC constexpr bool is_signed = false;592 BOOST_MATH_STATIC constexpr bool is_integer = true;593 BOOST_MATH_STATIC constexpr bool is_exact = true;594 BOOST_MATH_STATIC constexpr bool has_infinity = false;595 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;596 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;597 598 BOOST_MATH_STATIC constexpr bool is_iec559 = false;599 BOOST_MATH_STATIC constexpr bool is_bounded = true;600 BOOST_MATH_STATIC constexpr bool is_modulo = true;601 BOOST_MATH_STATIC constexpr int digits = 16;602 BOOST_MATH_STATIC constexpr int digits10 = 4;603 BOOST_MATH_STATIC constexpr int max_digits10 = 0;604 BOOST_MATH_STATIC constexpr int radix = 2;605 BOOST_MATH_STATIC constexpr int min_exponent = 0;606 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;607 BOOST_MATH_STATIC constexpr int max_exponent = 0;608 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;609 BOOST_MATH_STATIC constexpr bool traps = true;610 BOOST_MATH_STATIC constexpr bool tinyness_before = false;611 612 // Member Functions613 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short (min) () { return 0; }614 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short (max) () { return 65535U; }615 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short lowest () { return 0; }616 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short epsilon () { return 0; }617 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short round_error () { return 0; }618 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short infinity () { return 0; }619 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short quiet_NaN () { return 0; }620 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short signaling_NaN () { return 0; }621 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned short denorm_min () { return 0; }622};623 624template <>625struct numeric_limits<int>626{627 BOOST_MATH_STATIC constexpr bool is_specialized = true;628 BOOST_MATH_STATIC constexpr bool is_signed = true;629 BOOST_MATH_STATIC constexpr bool is_integer = true;630 BOOST_MATH_STATIC constexpr bool is_exact = true;631 BOOST_MATH_STATIC constexpr bool has_infinity = false;632 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;633 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;634 635 BOOST_MATH_STATIC constexpr bool is_iec559 = false;636 BOOST_MATH_STATIC constexpr bool is_bounded = true;637 BOOST_MATH_STATIC constexpr bool is_modulo = false;638 BOOST_MATH_STATIC constexpr int digits = 31;639 BOOST_MATH_STATIC constexpr int digits10 = 9;640 BOOST_MATH_STATIC constexpr int max_digits10 = 0;641 BOOST_MATH_STATIC constexpr int radix = 2;642 BOOST_MATH_STATIC constexpr int min_exponent = 0;643 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;644 BOOST_MATH_STATIC constexpr int max_exponent = 0;645 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;646 BOOST_MATH_STATIC constexpr bool traps = true;647 BOOST_MATH_STATIC constexpr bool tinyness_before = false;648 649 // Member Functions650 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int (min) () { return -2147483648; }651 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int (max) () { return 2147483647; }652 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int lowest () { return -2147483648; }653 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int epsilon () { return 0; }654 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int round_error () { return 0; }655 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int infinity () { return 0; }656 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int quiet_NaN () { return 0; }657 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int signaling_NaN () { return 0; }658 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr int denorm_min () { return 0; }659};660 661template <>662struct numeric_limits<unsigned int>663{664 BOOST_MATH_STATIC constexpr bool is_specialized = true;665 BOOST_MATH_STATIC constexpr bool is_signed = false;666 BOOST_MATH_STATIC constexpr bool is_integer = true;667 BOOST_MATH_STATIC constexpr bool is_exact = true;668 BOOST_MATH_STATIC constexpr bool has_infinity = false;669 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;670 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;671 672 BOOST_MATH_STATIC constexpr bool is_iec559 = false;673 BOOST_MATH_STATIC constexpr bool is_bounded = true;674 BOOST_MATH_STATIC constexpr bool is_modulo = true;675 BOOST_MATH_STATIC constexpr int digits = 32;676 BOOST_MATH_STATIC constexpr int digits10 = 9;677 BOOST_MATH_STATIC constexpr int max_digits10 = 0;678 BOOST_MATH_STATIC constexpr int radix = 2;679 BOOST_MATH_STATIC constexpr int min_exponent = 0;680 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;681 BOOST_MATH_STATIC constexpr int max_exponent = 0;682 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;683 BOOST_MATH_STATIC constexpr bool traps = true;684 BOOST_MATH_STATIC constexpr bool tinyness_before = false;685 686 // Member Functions687 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int (min) () { return 0; }688 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int (max) () { return 4294967295U; }689 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int lowest () { return 0; }690 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int epsilon () { return 0; }691 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int round_error () { return 0; }692 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int infinity () { return 0; }693 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int quiet_NaN () { return 0; }694 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int signaling_NaN () { return 0; }695 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned int denorm_min () { return 0; }696};697 698template <>699struct numeric_limits<long>700{701 BOOST_MATH_STATIC constexpr bool is_specialized = true;702 BOOST_MATH_STATIC constexpr bool is_signed = true;703 BOOST_MATH_STATIC constexpr bool is_integer = true;704 BOOST_MATH_STATIC constexpr bool is_exact = true;705 BOOST_MATH_STATIC constexpr bool has_infinity = false;706 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;707 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;708 709 BOOST_MATH_STATIC constexpr bool is_iec559 = false;710 BOOST_MATH_STATIC constexpr bool is_bounded = true;711 BOOST_MATH_STATIC constexpr bool is_modulo = false;712 BOOST_MATH_STATIC constexpr int digits = 63;713 BOOST_MATH_STATIC constexpr int digits10 = 18;714 BOOST_MATH_STATIC constexpr int max_digits10 = 0;715 BOOST_MATH_STATIC constexpr int radix = 2;716 BOOST_MATH_STATIC constexpr int min_exponent = 0;717 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;718 BOOST_MATH_STATIC constexpr int max_exponent = 0;719 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;720 BOOST_MATH_STATIC constexpr bool traps = true;721 BOOST_MATH_STATIC constexpr bool tinyness_before = false;722 723 // Member Functions724 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long (min) () { return -9223372036854775808L; }725 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long (max) () { return 9223372036854775807L; }726 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long lowest () { return -9223372036854775808L; }727 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long epsilon () { return 0; }728 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long round_error () { return 0; }729 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long infinity () { return 0; }730 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long quiet_NaN () { return 0; }731 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long signaling_NaN () { return 0; }732 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long denorm_min () { return 0; }733};734 735template <>736struct numeric_limits<unsigned long>737{738 BOOST_MATH_STATIC constexpr bool is_specialized = true;739 BOOST_MATH_STATIC constexpr bool is_signed = false;740 BOOST_MATH_STATIC constexpr bool is_integer = true;741 BOOST_MATH_STATIC constexpr bool is_exact = true;742 BOOST_MATH_STATIC constexpr bool has_infinity = false;743 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;744 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;745 746 BOOST_MATH_STATIC constexpr bool is_iec559 = false;747 BOOST_MATH_STATIC constexpr bool is_bounded = true;748 BOOST_MATH_STATIC constexpr bool is_modulo = true;749 BOOST_MATH_STATIC constexpr int digits = 64;750 BOOST_MATH_STATIC constexpr int digits10 = 19;751 BOOST_MATH_STATIC constexpr int max_digits10 = 0;752 BOOST_MATH_STATIC constexpr int radix = 2;753 BOOST_MATH_STATIC constexpr int min_exponent = 0;754 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;755 BOOST_MATH_STATIC constexpr int max_exponent = 0;756 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;757 BOOST_MATH_STATIC constexpr bool traps = true;758 BOOST_MATH_STATIC constexpr bool tinyness_before = false;759 760 // Member Functions761 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long (min) () { return 0; }762 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long (max) () { return 18446744073709551615UL; }763 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long lowest () { return 0; }764 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long epsilon () { return 0; }765 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long round_error () { return 0; }766 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long infinity () { return 0; }767 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long quiet_NaN () { return 0; }768 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long signaling_NaN () { return 0; }769 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long denorm_min () { return 0; }770};771 772template <>773struct numeric_limits<long long>774{775 BOOST_MATH_STATIC constexpr bool is_specialized = true;776 BOOST_MATH_STATIC constexpr bool is_signed = true;777 BOOST_MATH_STATIC constexpr bool is_integer = true;778 BOOST_MATH_STATIC constexpr bool is_exact = true;779 BOOST_MATH_STATIC constexpr bool has_infinity = false;780 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;781 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;782 783 BOOST_MATH_STATIC constexpr bool is_iec559 = false;784 BOOST_MATH_STATIC constexpr bool is_bounded = true;785 BOOST_MATH_STATIC constexpr bool is_modulo = false;786 BOOST_MATH_STATIC constexpr int digits = 63;787 BOOST_MATH_STATIC constexpr int digits10 = 18;788 BOOST_MATH_STATIC constexpr int max_digits10 = 0;789 BOOST_MATH_STATIC constexpr int radix = 2;790 BOOST_MATH_STATIC constexpr int min_exponent = 0;791 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;792 BOOST_MATH_STATIC constexpr int max_exponent = 0;793 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;794 BOOST_MATH_STATIC constexpr bool traps = true;795 BOOST_MATH_STATIC constexpr bool tinyness_before = false;796 797 // Member Functions798 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long (min) () { return -9223372036854775808LL; }799 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long (max) () { return 9223372036854775807LL; }800 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long lowest () { return -9223372036854775808LL; }801 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long epsilon () { return 0; }802 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long round_error () { return 0; }803 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long infinity () { return 0; }804 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long quiet_NaN () { return 0; }805 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long signaling_NaN () { return 0; }806 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr long long denorm_min () { return 0; }807};808 809template <>810struct numeric_limits<unsigned long long>811{812 BOOST_MATH_STATIC constexpr bool is_specialized = true;813 BOOST_MATH_STATIC constexpr bool is_signed = false;814 BOOST_MATH_STATIC constexpr bool is_integer = true;815 BOOST_MATH_STATIC constexpr bool is_exact = true;816 BOOST_MATH_STATIC constexpr bool has_infinity = false;817 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;818 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;819 820 BOOST_MATH_STATIC constexpr bool is_iec559 = false;821 BOOST_MATH_STATIC constexpr bool is_bounded = true;822 BOOST_MATH_STATIC constexpr bool is_modulo = true;823 BOOST_MATH_STATIC constexpr int digits = 64;824 BOOST_MATH_STATIC constexpr int digits10 = 19;825 BOOST_MATH_STATIC constexpr int max_digits10 = 0;826 BOOST_MATH_STATIC constexpr int radix = 2;827 BOOST_MATH_STATIC constexpr int min_exponent = 0;828 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;829 BOOST_MATH_STATIC constexpr int max_exponent = 0;830 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;831 BOOST_MATH_STATIC constexpr bool traps = true;832 BOOST_MATH_STATIC constexpr bool tinyness_before = false;833 834 // Member Functions835 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long (min) () { return 0; }836 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long (max) () { return 18446744073709551615UL; }837 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long lowest () { return 0; }838 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long epsilon () { return 0; }839 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long round_error () { return 0; }840 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long infinity () { return 0; }841 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long quiet_NaN () { return 0; }842 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long signaling_NaN () { return 0; }843 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr unsigned long long denorm_min () { return 0; }844};845 846template <>847struct numeric_limits<bool>848{849 BOOST_MATH_STATIC constexpr bool is_specialized = true;850 BOOST_MATH_STATIC constexpr bool is_signed = false;851 BOOST_MATH_STATIC constexpr bool is_integer = true;852 BOOST_MATH_STATIC constexpr bool is_exact = true;853 BOOST_MATH_STATIC constexpr bool has_infinity = false;854 BOOST_MATH_STATIC constexpr bool has_quiet_NaN = false;855 BOOST_MATH_STATIC constexpr bool has_signaling_NaN = false;856 857 BOOST_MATH_STATIC constexpr bool is_iec559 = false;858 BOOST_MATH_STATIC constexpr bool is_bounded = true;859 BOOST_MATH_STATIC constexpr bool is_modulo = false;860 BOOST_MATH_STATIC constexpr int digits = 1;861 BOOST_MATH_STATIC constexpr int digits10 = 0;862 BOOST_MATH_STATIC constexpr int max_digits10 = 0;863 BOOST_MATH_STATIC constexpr int radix = 2;864 BOOST_MATH_STATIC constexpr int min_exponent = 0;865 BOOST_MATH_STATIC constexpr int min_exponent10 = 0;866 BOOST_MATH_STATIC constexpr int max_exponent = 0;867 BOOST_MATH_STATIC constexpr int max_exponent10 = 0;868 BOOST_MATH_STATIC constexpr bool traps = false;869 BOOST_MATH_STATIC constexpr bool tinyness_before = false;870 871 // Member Functions872 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool (min) () { return false; }873 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool (max) () { return true; }874 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool lowest () { return false; }875 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool epsilon () { return false; }876 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool round_error () { return false; }877 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool infinity () { return false; }878 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool quiet_NaN () { return false; }879 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool signaling_NaN () { return false; }880 BOOST_MATH_GPU_ENABLED BOOST_MATH_STATIC constexpr bool denorm_min () { return false; }881};882 883#endif // BOOST_MATH_HAS_GPU_SUPPORT884 885} // namespace math886} // namespace boost887 888#endif889