brintos

brintos / llvm-project-archived public Read only

0
0
Text · 56.1 KiB · 87a7802 Raw
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