1// -*- C++ -*- 2//===---------------------------- limits ----------------------------------===// 3// 4// The LLVM Compiler Infrastructure 5// 6// This file is dual licensed under the MIT and the University of Illinois Open 7// Source Licenses. See LICENSE.TXT for details. 8// 9//===----------------------------------------------------------------------===// 10 11#ifndef _LIBCPP_LIMITS 12#define _LIBCPP_LIMITS 13 14/* 15 limits synopsis 16 17namespace std 18{ 19 20template<class T> 21class numeric_limits 22{ 23public: 24 static constexpr bool is_specialized = false; 25 static constexpr T min() noexcept; 26 static constexpr T max() noexcept; 27 static constexpr T lowest() noexcept; 28 29 static constexpr int digits = 0; 30 static constexpr int digits10 = 0; 31 static constexpr int max_digits10 = 0; 32 static constexpr bool is_signed = false; 33 static constexpr bool is_integer = false; 34 static constexpr bool is_exact = false; 35 static constexpr int radix = 0; 36 static constexpr T epsilon() noexcept; 37 static constexpr T round_error() noexcept; 38 39 static constexpr int min_exponent = 0; 40 static constexpr int min_exponent10 = 0; 41 static constexpr int max_exponent = 0; 42 static constexpr int max_exponent10 = 0; 43 44 static constexpr bool has_infinity = false; 45 static constexpr bool has_quiet_NaN = false; 46 static constexpr bool has_signaling_NaN = false; 47 static constexpr float_denorm_style has_denorm = denorm_absent; 48 static constexpr bool has_denorm_loss = false; 49 static constexpr T infinity() noexcept; 50 static constexpr T quiet_NaN() noexcept; 51 static constexpr T signaling_NaN() noexcept; 52 static constexpr T denorm_min() noexcept; 53 54 static constexpr bool is_iec559 = false; 55 static constexpr bool is_bounded = false; 56 static constexpr bool is_modulo = false; 57 58 static constexpr bool traps = false; 59 static constexpr bool tinyness_before = false; 60 static constexpr float_round_style round_style = round_toward_zero; 61}; 62 63enum float_round_style 64{ 65 round_indeterminate = -1, 66 round_toward_zero = 0, 67 round_to_nearest = 1, 68 round_toward_infinity = 2, 69 round_toward_neg_infinity = 3 70}; 71 72enum float_denorm_style 73{ 74 denorm_indeterminate = -1, 75 denorm_absent = 0, 76 denorm_present = 1 77}; 78 79template<> class numeric_limits<cv bool>; 80 81template<> class numeric_limits<cv char>; 82template<> class numeric_limits<cv signed char>; 83template<> class numeric_limits<cv unsigned char>; 84template<> class numeric_limits<cv wchar_t>; 85template<> class numeric_limits<cv char8_t>; // C++20 86template<> class numeric_limits<cv char16_t>; 87template<> class numeric_limits<cv char32_t>; 88 89template<> class numeric_limits<cv short>; 90template<> class numeric_limits<cv int>; 91template<> class numeric_limits<cv long>; 92template<> class numeric_limits<cv long long>; 93template<> class numeric_limits<cv unsigned short>; 94template<> class numeric_limits<cv unsigned int>; 95template<> class numeric_limits<cv unsigned long>; 96template<> class numeric_limits<cv unsigned long long>; 97 98template<> class numeric_limits<cv float>; 99template<> class numeric_limits<cv double>; 100template<> class numeric_limits<cv long double>; 101 102} // std 103 104*/ 105#include <__config> 106#include <type_traits> 107 108#if defined(_LIBCPP_COMPILER_MSVC) 109#include "support/win32/limits_msvc_win32.h" 110#endif // _LIBCPP_MSVCRT 111 112#if defined(__IBMCPP__) 113#include "support/ibm/limits.h" 114#endif // __IBMCPP__ 115 116#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 117#pragma GCC system_header 118#endif 119 120_LIBCPP_PUSH_MACROS 121#include <__undef_macros> 122#include <version> 123 124 125_LIBCPP_BEGIN_NAMESPACE_STD 126 127enum float_round_style 128{ 129 round_indeterminate = -1, 130 round_toward_zero = 0, 131 round_to_nearest = 1, 132 round_toward_infinity = 2, 133 round_toward_neg_infinity = 3 134}; 135 136enum float_denorm_style 137{ 138 denorm_indeterminate = -1, 139 denorm_absent = 0, 140 denorm_present = 1 141}; 142 143template <class _Tp, bool = is_arithmetic<_Tp>::value> 144class __libcpp_numeric_limits 145{ 146protected: 147 typedef _Tp type; 148 149 static _LIBCPP_CONSTEXPR const bool is_specialized = false; 150 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return type();} 151 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return type();} 152 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return type();} 153 154 static _LIBCPP_CONSTEXPR const int digits = 0; 155 static _LIBCPP_CONSTEXPR const int digits10 = 0; 156 static _LIBCPP_CONSTEXPR const int max_digits10 = 0; 157 static _LIBCPP_CONSTEXPR const bool is_signed = false; 158 static _LIBCPP_CONSTEXPR const bool is_integer = false; 159 static _LIBCPP_CONSTEXPR const bool is_exact = false; 160 static _LIBCPP_CONSTEXPR const int radix = 0; 161 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type();} 162 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type();} 163 164 static _LIBCPP_CONSTEXPR const int min_exponent = 0; 165 static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; 166 static _LIBCPP_CONSTEXPR const int max_exponent = 0; 167 static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; 168 169 static _LIBCPP_CONSTEXPR const bool has_infinity = false; 170 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; 171 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; 172 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; 173 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 174 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type();} 175 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type();} 176 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type();} 177 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type();} 178 179 static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 180 static _LIBCPP_CONSTEXPR const bool is_bounded = false; 181 static _LIBCPP_CONSTEXPR const bool is_modulo = false; 182 183 static _LIBCPP_CONSTEXPR const bool traps = false; 184 static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 185 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; 186}; 187 188template <class _Tp, int __digits, bool _IsSigned> 189struct __libcpp_compute_min 190{ 191 static _LIBCPP_CONSTEXPR const _Tp value = _Tp(_Tp(1) << __digits); 192}; 193 194template <class _Tp, int __digits> 195struct __libcpp_compute_min<_Tp, __digits, false> 196{ 197 static _LIBCPP_CONSTEXPR const _Tp value = _Tp(0); 198}; 199 200template <class _Tp> 201class __libcpp_numeric_limits<_Tp, true> 202{ 203protected: 204 typedef _Tp type; 205 206 static _LIBCPP_CONSTEXPR const bool is_specialized = true; 207 208 static _LIBCPP_CONSTEXPR const bool is_signed = type(-1) < type(0); 209 static _LIBCPP_CONSTEXPR const int digits = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed); 210 static _LIBCPP_CONSTEXPR const int digits10 = digits * 3 / 10; 211 static _LIBCPP_CONSTEXPR const int max_digits10 = 0; 212 static _LIBCPP_CONSTEXPR const type __min = __libcpp_compute_min<type, digits, is_signed>::value; 213 static _LIBCPP_CONSTEXPR const type __max = is_signed ? type(type(~0) ^ __min) : type(~0); 214 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;} 215 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;} 216 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();} 217 218 static _LIBCPP_CONSTEXPR const bool is_integer = true; 219 static _LIBCPP_CONSTEXPR const bool is_exact = true; 220 static _LIBCPP_CONSTEXPR const int radix = 2; 221 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);} 222 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);} 223 224 static _LIBCPP_CONSTEXPR const int min_exponent = 0; 225 static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; 226 static _LIBCPP_CONSTEXPR const int max_exponent = 0; 227 static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; 228 229 static _LIBCPP_CONSTEXPR const bool has_infinity = false; 230 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; 231 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; 232 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; 233 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 234 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);} 235 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);} 236 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);} 237 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);} 238 239 static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 240 static _LIBCPP_CONSTEXPR const bool is_bounded = true; 241 static _LIBCPP_CONSTEXPR const bool is_modulo = !_VSTD::is_signed<_Tp>::value; 242 243#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || \ 244 defined(__wasm__) 245 static _LIBCPP_CONSTEXPR const bool traps = true; 246#else 247 static _LIBCPP_CONSTEXPR const bool traps = false; 248#endif 249 static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 250 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; 251}; 252 253template <> 254class __libcpp_numeric_limits<bool, true> 255{ 256protected: 257 typedef bool type; 258 259 static _LIBCPP_CONSTEXPR const bool is_specialized = true; 260 261 static _LIBCPP_CONSTEXPR const bool is_signed = false; 262 static _LIBCPP_CONSTEXPR const int digits = 1; 263 static _LIBCPP_CONSTEXPR const int digits10 = 0; 264 static _LIBCPP_CONSTEXPR const int max_digits10 = 0; 265 static _LIBCPP_CONSTEXPR const type __min = false; 266 static _LIBCPP_CONSTEXPR const type __max = true; 267 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __min;} 268 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __max;} 269 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return min();} 270 271 static _LIBCPP_CONSTEXPR const bool is_integer = true; 272 static _LIBCPP_CONSTEXPR const bool is_exact = true; 273 static _LIBCPP_CONSTEXPR const int radix = 2; 274 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return type(0);} 275 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return type(0);} 276 277 static _LIBCPP_CONSTEXPR const int min_exponent = 0; 278 static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; 279 static _LIBCPP_CONSTEXPR const int max_exponent = 0; 280 static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; 281 282 static _LIBCPP_CONSTEXPR const bool has_infinity = false; 283 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; 284 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; 285 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; 286 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 287 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return type(0);} 288 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return type(0);} 289 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return type(0);} 290 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return type(0);} 291 292 static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 293 static _LIBCPP_CONSTEXPR const bool is_bounded = true; 294 static _LIBCPP_CONSTEXPR const bool is_modulo = false; 295 296 static _LIBCPP_CONSTEXPR const bool traps = false; 297 static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 298 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; 299}; 300 301template <> 302class __libcpp_numeric_limits<float, true> 303{ 304protected: 305 typedef float type; 306 307 static _LIBCPP_CONSTEXPR const bool is_specialized = true; 308 309 static _LIBCPP_CONSTEXPR const bool is_signed = true; 310 static _LIBCPP_CONSTEXPR const int digits = __FLT_MANT_DIG__; 311 static _LIBCPP_CONSTEXPR const int digits10 = __FLT_DIG__; 312 static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l; 313 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __FLT_MIN__;} 314 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __FLT_MAX__;} 315 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();} 316 317 static _LIBCPP_CONSTEXPR const bool is_integer = false; 318 static _LIBCPP_CONSTEXPR const bool is_exact = false; 319 static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; 320 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __FLT_EPSILON__;} 321 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5F;} 322 323 static _LIBCPP_CONSTEXPR const int min_exponent = __FLT_MIN_EXP__; 324 static _LIBCPP_CONSTEXPR const int min_exponent10 = __FLT_MIN_10_EXP__; 325 static _LIBCPP_CONSTEXPR const int max_exponent = __FLT_MAX_EXP__; 326 static _LIBCPP_CONSTEXPR const int max_exponent10 = __FLT_MAX_10_EXP__; 327 328 static _LIBCPP_CONSTEXPR const bool has_infinity = true; 329 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; 330 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; 331 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; 332 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 333 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_valf();} 334 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanf("");} 335 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansf("");} 336 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __FLT_DENORM_MIN__;} 337 338 static _LIBCPP_CONSTEXPR const bool is_iec559 = true; 339 static _LIBCPP_CONSTEXPR const bool is_bounded = true; 340 static _LIBCPP_CONSTEXPR const bool is_modulo = false; 341 342 static _LIBCPP_CONSTEXPR const bool traps = false; 343 static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 344 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; 345}; 346 347template <> 348class __libcpp_numeric_limits<double, true> 349{ 350protected: 351 typedef double type; 352 353 static _LIBCPP_CONSTEXPR const bool is_specialized = true; 354 355 static _LIBCPP_CONSTEXPR const bool is_signed = true; 356 static _LIBCPP_CONSTEXPR const int digits = __DBL_MANT_DIG__; 357 static _LIBCPP_CONSTEXPR const int digits10 = __DBL_DIG__; 358 static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l; 359 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __DBL_MIN__;} 360 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __DBL_MAX__;} 361 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();} 362 363 static _LIBCPP_CONSTEXPR const bool is_integer = false; 364 static _LIBCPP_CONSTEXPR const bool is_exact = false; 365 static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; 366 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __DBL_EPSILON__;} 367 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;} 368 369 static _LIBCPP_CONSTEXPR const int min_exponent = __DBL_MIN_EXP__; 370 static _LIBCPP_CONSTEXPR const int min_exponent10 = __DBL_MIN_10_EXP__; 371 static _LIBCPP_CONSTEXPR const int max_exponent = __DBL_MAX_EXP__; 372 static _LIBCPP_CONSTEXPR const int max_exponent10 = __DBL_MAX_10_EXP__; 373 374 static _LIBCPP_CONSTEXPR const bool has_infinity = true; 375 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; 376 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; 377 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; 378 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 379 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_val();} 380 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nan("");} 381 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nans("");} 382 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __DBL_DENORM_MIN__;} 383 384 static _LIBCPP_CONSTEXPR const bool is_iec559 = true; 385 static _LIBCPP_CONSTEXPR const bool is_bounded = true; 386 static _LIBCPP_CONSTEXPR const bool is_modulo = false; 387 388 static _LIBCPP_CONSTEXPR const bool traps = false; 389 static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 390 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; 391}; 392 393template <> 394class __libcpp_numeric_limits<long double, true> 395{ 396protected: 397 typedef long double type; 398 399 static _LIBCPP_CONSTEXPR const bool is_specialized = true; 400 401 static _LIBCPP_CONSTEXPR const bool is_signed = true; 402 static _LIBCPP_CONSTEXPR const int digits = __LDBL_MANT_DIG__; 403 static _LIBCPP_CONSTEXPR const int digits10 = __LDBL_DIG__; 404 static _LIBCPP_CONSTEXPR const int max_digits10 = 2+(digits * 30103l)/100000l; 405 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __LDBL_MIN__;} 406 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __LDBL_MAX__;} 407 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return -max();} 408 409 static _LIBCPP_CONSTEXPR const bool is_integer = false; 410 static _LIBCPP_CONSTEXPR const bool is_exact = false; 411 static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; 412 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __LDBL_EPSILON__;} 413 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return 0.5;} 414 415 static _LIBCPP_CONSTEXPR const int min_exponent = __LDBL_MIN_EXP__; 416 static _LIBCPP_CONSTEXPR const int min_exponent10 = __LDBL_MIN_10_EXP__; 417 static _LIBCPP_CONSTEXPR const int max_exponent = __LDBL_MAX_EXP__; 418 static _LIBCPP_CONSTEXPR const int max_exponent10 = __LDBL_MAX_10_EXP__; 419 420 static _LIBCPP_CONSTEXPR const bool has_infinity = true; 421 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; 422 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; 423 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; 424 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 425 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __builtin_huge_vall();} 426 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __builtin_nanl("");} 427 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __builtin_nansl("");} 428 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __LDBL_DENORM_MIN__;} 429 430#if (defined(__ppc__) || defined(__ppc64__)) 431 static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 432#else 433 static _LIBCPP_CONSTEXPR const bool is_iec559 = true; 434#endif 435 static _LIBCPP_CONSTEXPR const bool is_bounded = true; 436 static _LIBCPP_CONSTEXPR const bool is_modulo = false; 437 438 static _LIBCPP_CONSTEXPR const bool traps = false; 439 static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 440 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; 441}; 442 443template <class _Tp> 444class _LIBCPP_TEMPLATE_VIS numeric_limits 445 : private __libcpp_numeric_limits<typename remove_cv<_Tp>::type> 446{ 447 typedef __libcpp_numeric_limits<typename remove_cv<_Tp>::type> __base; 448 typedef typename __base::type type; 449public: 450 static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; 451 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} 452 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} 453 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} 454 455 static _LIBCPP_CONSTEXPR const int digits = __base::digits; 456 static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; 457 static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; 458 static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; 459 static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; 460 static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; 461 static _LIBCPP_CONSTEXPR const int radix = __base::radix; 462 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} 463 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} 464 465 static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; 466 static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; 467 static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; 468 static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; 469 470 static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; 471 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; 472 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; 473 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; 474 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; 475 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} 476 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} 477 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} 478 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} 479 480 static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; 481 static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; 482 static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; 483 484 static _LIBCPP_CONSTEXPR const bool traps = __base::traps; 485 static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; 486 static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; 487}; 488 489template <class _Tp> 490 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_specialized; 491template <class _Tp> 492 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits; 493template <class _Tp> 494 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits10; 495template <class _Tp> 496 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_digits10; 497template <class _Tp> 498 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_signed; 499template <class _Tp> 500 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_integer; 501template <class _Tp> 502 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_exact; 503template <class _Tp> 504 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::radix; 505template <class _Tp> 506 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent; 507template <class _Tp> 508 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent10; 509template <class _Tp> 510 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent; 511template <class _Tp> 512 _LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent10; 513template <class _Tp> 514 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_infinity; 515template <class _Tp> 516 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_quiet_NaN; 517template <class _Tp> 518 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_signaling_NaN; 519template <class _Tp> 520 _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<_Tp>::has_denorm; 521template <class _Tp> 522 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_denorm_loss; 523template <class _Tp> 524 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_iec559; 525template <class _Tp> 526 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_bounded; 527template <class _Tp> 528 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_modulo; 529template <class _Tp> 530 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::traps; 531template <class _Tp> 532 _LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::tinyness_before; 533template <class _Tp> 534 _LIBCPP_CONSTEXPR const float_round_style numeric_limits<_Tp>::round_style; 535 536template <class _Tp> 537class _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp> 538 : private numeric_limits<_Tp> 539{ 540 typedef numeric_limits<_Tp> __base; 541 typedef _Tp type; 542public: 543 static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; 544 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} 545 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} 546 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} 547 548 static _LIBCPP_CONSTEXPR const int digits = __base::digits; 549 static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; 550 static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; 551 static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; 552 static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; 553 static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; 554 static _LIBCPP_CONSTEXPR const int radix = __base::radix; 555 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} 556 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} 557 558 static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; 559 static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; 560 static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; 561 static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; 562 563 static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; 564 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; 565 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; 566 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; 567 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; 568 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} 569 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} 570 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} 571 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} 572 573 static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; 574 static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; 575 static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; 576 577 static _LIBCPP_CONSTEXPR const bool traps = __base::traps; 578 static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; 579 static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; 580}; 581 582template <class _Tp> 583 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_specialized; 584template <class _Tp> 585 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits; 586template <class _Tp> 587 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::digits10; 588template <class _Tp> 589 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_digits10; 590template <class _Tp> 591 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_signed; 592template <class _Tp> 593 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_integer; 594template <class _Tp> 595 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_exact; 596template <class _Tp> 597 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::radix; 598template <class _Tp> 599 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent; 600template <class _Tp> 601 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::min_exponent10; 602template <class _Tp> 603 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent; 604template <class _Tp> 605 _LIBCPP_CONSTEXPR const int numeric_limits<const _Tp>::max_exponent10; 606template <class _Tp> 607 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_infinity; 608template <class _Tp> 609 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_quiet_NaN; 610template <class _Tp> 611 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_signaling_NaN; 612template <class _Tp> 613 _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const _Tp>::has_denorm; 614template <class _Tp> 615 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::has_denorm_loss; 616template <class _Tp> 617 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_iec559; 618template <class _Tp> 619 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_bounded; 620template <class _Tp> 621 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::is_modulo; 622template <class _Tp> 623 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::traps; 624template <class _Tp> 625 _LIBCPP_CONSTEXPR const bool numeric_limits<const _Tp>::tinyness_before; 626template <class _Tp> 627 _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const _Tp>::round_style; 628 629template <class _Tp> 630class _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp> 631 : private numeric_limits<_Tp> 632{ 633 typedef numeric_limits<_Tp> __base; 634 typedef _Tp type; 635public: 636 static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; 637 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} 638 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} 639 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} 640 641 static _LIBCPP_CONSTEXPR const int digits = __base::digits; 642 static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; 643 static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; 644 static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; 645 static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; 646 static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; 647 static _LIBCPP_CONSTEXPR const int radix = __base::radix; 648 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} 649 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} 650 651 static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; 652 static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; 653 static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; 654 static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; 655 656 static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; 657 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; 658 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; 659 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; 660 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; 661 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} 662 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} 663 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} 664 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} 665 666 static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; 667 static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; 668 static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; 669 670 static _LIBCPP_CONSTEXPR const bool traps = __base::traps; 671 static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; 672 static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; 673}; 674 675template <class _Tp> 676 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_specialized; 677template <class _Tp> 678 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits; 679template <class _Tp> 680 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::digits10; 681template <class _Tp> 682 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_digits10; 683template <class _Tp> 684 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_signed; 685template <class _Tp> 686 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_integer; 687template <class _Tp> 688 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_exact; 689template <class _Tp> 690 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::radix; 691template <class _Tp> 692 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent; 693template <class _Tp> 694 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::min_exponent10; 695template <class _Tp> 696 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent; 697template <class _Tp> 698 _LIBCPP_CONSTEXPR const int numeric_limits<volatile _Tp>::max_exponent10; 699template <class _Tp> 700 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_infinity; 701template <class _Tp> 702 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_quiet_NaN; 703template <class _Tp> 704 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_signaling_NaN; 705template <class _Tp> 706 _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<volatile _Tp>::has_denorm; 707template <class _Tp> 708 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::has_denorm_loss; 709template <class _Tp> 710 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_iec559; 711template <class _Tp> 712 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_bounded; 713template <class _Tp> 714 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::is_modulo; 715template <class _Tp> 716 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::traps; 717template <class _Tp> 718 _LIBCPP_CONSTEXPR const bool numeric_limits<volatile _Tp>::tinyness_before; 719template <class _Tp> 720 _LIBCPP_CONSTEXPR const float_round_style numeric_limits<volatile _Tp>::round_style; 721 722template <class _Tp> 723class _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp> 724 : private numeric_limits<_Tp> 725{ 726 typedef numeric_limits<_Tp> __base; 727 typedef _Tp type; 728public: 729 static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; 730 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type min() _NOEXCEPT {return __base::min();} 731 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type max() _NOEXCEPT {return __base::max();} 732 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT {return __base::lowest();} 733 734 static _LIBCPP_CONSTEXPR const int digits = __base::digits; 735 static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; 736 static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; 737 static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; 738 static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; 739 static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; 740 static _LIBCPP_CONSTEXPR const int radix = __base::radix; 741 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {return __base::epsilon();} 742 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {return __base::round_error();} 743 744 static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; 745 static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; 746 static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; 747 static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; 748 749 static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; 750 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; 751 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; 752 static _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; 753 static _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; 754 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {return __base::infinity();} 755 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} 756 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} 757 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {return __base::denorm_min();} 758 759 static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; 760 static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; 761 static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; 762 763 static _LIBCPP_CONSTEXPR const bool traps = __base::traps; 764 static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; 765 static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; 766}; 767 768template <class _Tp> 769 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_specialized; 770template <class _Tp> 771 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits; 772template <class _Tp> 773 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::digits10; 774template <class _Tp> 775 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_digits10; 776template <class _Tp> 777 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_signed; 778template <class _Tp> 779 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_integer; 780template <class _Tp> 781 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_exact; 782template <class _Tp> 783 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::radix; 784template <class _Tp> 785 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent; 786template <class _Tp> 787 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::min_exponent10; 788template <class _Tp> 789 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent; 790template <class _Tp> 791 _LIBCPP_CONSTEXPR const int numeric_limits<const volatile _Tp>::max_exponent10; 792template <class _Tp> 793 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_infinity; 794template <class _Tp> 795 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_quiet_NaN; 796template <class _Tp> 797 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_signaling_NaN; 798template <class _Tp> 799 _LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<const volatile _Tp>::has_denorm; 800template <class _Tp> 801 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::has_denorm_loss; 802template <class _Tp> 803 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_iec559; 804template <class _Tp> 805 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_bounded; 806template <class _Tp> 807 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::is_modulo; 808template <class _Tp> 809 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::traps; 810template <class _Tp> 811 _LIBCPP_CONSTEXPR const bool numeric_limits<const volatile _Tp>::tinyness_before; 812template <class _Tp> 813 _LIBCPP_CONSTEXPR const float_round_style numeric_limits<const volatile _Tp>::round_style; 814 815_LIBCPP_END_NAMESPACE_STD 816 817_LIBCPP_POP_MACROS 818 819#endif // _LIBCPP_LIMITS 820