529 lines · plain
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCPP_LIMITS11#define _LIBCPP_LIMITS12 13/*14 limits synopsis15 16namespace std17{18 19template<class T>20class numeric_limits21{22public:23 static constexpr bool is_specialized = false;24 static constexpr T min() noexcept;25 static constexpr T max() noexcept;26 static constexpr T lowest() noexcept;27 28 static constexpr int digits = 0;29 static constexpr int digits10 = 0;30 static constexpr int max_digits10 = 0;31 static constexpr bool is_signed = false;32 static constexpr bool is_integer = false;33 static constexpr bool is_exact = false;34 static constexpr int radix = 0;35 static constexpr T epsilon() noexcept;36 static constexpr T round_error() noexcept;37 38 static constexpr int min_exponent = 0;39 static constexpr int min_exponent10 = 0;40 static constexpr int max_exponent = 0;41 static constexpr int max_exponent10 = 0;42 43 static constexpr bool has_infinity = false;44 static constexpr bool has_quiet_NaN = false;45 static constexpr bool has_signaling_NaN = false;46 static constexpr float_denorm_style has_denorm = denorm_absent; // deprecated in C++2347 static constexpr bool has_denorm_loss = false; // deprecated in C++2348 static constexpr T infinity() noexcept;49 static constexpr T quiet_NaN() noexcept;50 static constexpr T signaling_NaN() noexcept;51 static constexpr T denorm_min() noexcept;52 53 static constexpr bool is_iec559 = false;54 static constexpr bool is_bounded = false;55 static constexpr bool is_modulo = false;56 57 static constexpr bool traps = false;58 static constexpr bool tinyness_before = false;59 static constexpr float_round_style round_style = round_toward_zero;60};61 62enum float_round_style63{64 round_indeterminate = -1,65 round_toward_zero = 0,66 round_to_nearest = 1,67 round_toward_infinity = 2,68 round_toward_neg_infinity = 369};70 71enum float_denorm_style // deprecated in C++2372{73 denorm_indeterminate = -1,74 denorm_absent = 0,75 denorm_present = 176};77 78template<> class numeric_limits<cv bool>;79 80template<> class numeric_limits<cv char>;81template<> class numeric_limits<cv signed char>;82template<> class numeric_limits<cv unsigned char>;83template<> class numeric_limits<cv wchar_t>;84template<> class numeric_limits<cv char8_t>; // C++2085template<> class numeric_limits<cv char16_t>;86template<> class numeric_limits<cv char32_t>;87 88template<> class numeric_limits<cv short>;89template<> class numeric_limits<cv int>;90template<> class numeric_limits<cv long>;91template<> class numeric_limits<cv long long>;92template<> class numeric_limits<cv unsigned short>;93template<> class numeric_limits<cv unsigned int>;94template<> class numeric_limits<cv unsigned long>;95template<> class numeric_limits<cv unsigned long long>;96 97template<> class numeric_limits<cv float>;98template<> class numeric_limits<cv double>;99template<> class numeric_limits<cv long double>;100 101} // std102 103*/104 105#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)106# include <__cxx03/limits>107#else108# include <__config>109# include <__type_traits/is_arithmetic.h>110# include <__type_traits/is_same.h>111 112# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)113# pragma GCC system_header114# endif115 116_LIBCPP_PUSH_MACROS117# include <__undef_macros>118# include <version>119 120_LIBCPP_BEGIN_NAMESPACE_STD121 122enum float_round_style {123 round_indeterminate = -1,124 round_toward_zero = 0,125 round_to_nearest = 1,126 round_toward_infinity = 2,127 round_toward_neg_infinity = 3128};129 130enum _LIBCPP_DEPRECATED_IN_CXX23 float_denorm_style {131 denorm_indeterminate = -1,132 denorm_absent = 0,133 denorm_present = 1134};135 136template <class _Tp, bool = is_arithmetic<_Tp>::value>137class __libcpp_numeric_limits {138protected:139 typedef _Tp type;140 141 static _LIBCPP_CONSTEXPR const bool is_specialized = false;142 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return type(); }143 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return type(); }144 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return type(); }145 146 static _LIBCPP_CONSTEXPR const int digits = 0;147 static _LIBCPP_CONSTEXPR const int digits10 = 0;148 static _LIBCPP_CONSTEXPR const int max_digits10 = 0;149 static _LIBCPP_CONSTEXPR const bool is_signed = false;150 static _LIBCPP_CONSTEXPR const bool is_integer = false;151 static _LIBCPP_CONSTEXPR const bool is_exact = false;152 static _LIBCPP_CONSTEXPR const int radix = 0;153 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return type(); }154 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return type(); }155 156 static _LIBCPP_CONSTEXPR const int min_exponent = 0;157 static _LIBCPP_CONSTEXPR const int min_exponent10 = 0;158 static _LIBCPP_CONSTEXPR const int max_exponent = 0;159 static _LIBCPP_CONSTEXPR const int max_exponent10 = 0;160 161 static _LIBCPP_CONSTEXPR const bool has_infinity = false;162 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;163 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;164 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;165 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;166 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return type(); }167 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return type(); }168 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return type(); }169 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return type(); }170 171 static _LIBCPP_CONSTEXPR const bool is_iec559 = false;172 static _LIBCPP_CONSTEXPR const bool is_bounded = false;173 static _LIBCPP_CONSTEXPR const bool is_modulo = false;174 175 static _LIBCPP_CONSTEXPR const bool traps = false;176 static _LIBCPP_CONSTEXPR const bool tinyness_before = false;177 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;178};179 180template <class _Tp>181class __libcpp_numeric_limits<_Tp, true> {182protected:183 typedef _Tp type;184 185 static _LIBCPP_CONSTEXPR const bool is_specialized = true;186 187 static _LIBCPP_CONSTEXPR const bool is_signed = type(-1) < type(0);188 static _LIBCPP_CONSTEXPR const int digits = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed);189 static _LIBCPP_CONSTEXPR const int digits10 = digits * 3 / 10;190 static _LIBCPP_CONSTEXPR const int max_digits10 = 0;191 static _LIBCPP_CONSTEXPR const type __min = is_signed ? _Tp(_Tp(1) << digits) : 0;192 static _LIBCPP_CONSTEXPR const type __max = is_signed ? type(type(~0) ^ __min) : type(~0);193 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __min; }194 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __max; }195 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return min(); }196 197 static _LIBCPP_CONSTEXPR const bool is_integer = true;198 static _LIBCPP_CONSTEXPR const bool is_exact = true;199 static _LIBCPP_CONSTEXPR const int radix = 2;200 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return type(0); }201 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return type(0); }202 203 static _LIBCPP_CONSTEXPR const int min_exponent = 0;204 static _LIBCPP_CONSTEXPR const int min_exponent10 = 0;205 static _LIBCPP_CONSTEXPR const int max_exponent = 0;206 static _LIBCPP_CONSTEXPR const int max_exponent10 = 0;207 208 static _LIBCPP_CONSTEXPR const bool has_infinity = false;209 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;210 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;211 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;212 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;213 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return type(0); }214 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return type(0); }215 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return type(0); }216 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return type(0); }217 218 static _LIBCPP_CONSTEXPR const bool is_iec559 = false;219 static _LIBCPP_CONSTEXPR const bool is_bounded = true;220 static _LIBCPP_CONSTEXPR const bool is_modulo = !is_signed;221 222# if defined(__i386__) || defined(__x86_64__) || defined(__wasm__)223 static _LIBCPP_CONSTEXPR const bool traps = is_same<decltype(+_Tp(0)), _Tp>::value;224# else225 static _LIBCPP_CONSTEXPR const bool traps = false;226# endif227 static _LIBCPP_CONSTEXPR const bool tinyness_before = false;228 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;229};230 231template <>232class __libcpp_numeric_limits<bool, true> {233protected:234 typedef bool type;235 236 static _LIBCPP_CONSTEXPR const bool is_specialized = true;237 238 static _LIBCPP_CONSTEXPR const bool is_signed = false;239 static _LIBCPP_CONSTEXPR const int digits = 1;240 static _LIBCPP_CONSTEXPR const int digits10 = 0;241 static _LIBCPP_CONSTEXPR const int max_digits10 = 0;242 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return false; }243 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return true; }244 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return min(); }245 246 static _LIBCPP_CONSTEXPR const bool is_integer = true;247 static _LIBCPP_CONSTEXPR const bool is_exact = true;248 static _LIBCPP_CONSTEXPR const int radix = 2;249 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return type(0); }250 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return type(0); }251 252 static _LIBCPP_CONSTEXPR const int min_exponent = 0;253 static _LIBCPP_CONSTEXPR const int min_exponent10 = 0;254 static _LIBCPP_CONSTEXPR const int max_exponent = 0;255 static _LIBCPP_CONSTEXPR const int max_exponent10 = 0;256 257 static _LIBCPP_CONSTEXPR const bool has_infinity = false;258 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false;259 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false;260 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent;261 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;262 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return type(0); }263 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return type(0); }264 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return type(0); }265 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return type(0); }266 267 static _LIBCPP_CONSTEXPR const bool is_iec559 = false;268 static _LIBCPP_CONSTEXPR const bool is_bounded = true;269 static _LIBCPP_CONSTEXPR const bool is_modulo = false;270 271 static _LIBCPP_CONSTEXPR const bool traps = false;272 static _LIBCPP_CONSTEXPR const bool tinyness_before = false;273 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero;274};275 276template <>277class __libcpp_numeric_limits<float, true> {278protected:279 typedef float type;280 281 static _LIBCPP_CONSTEXPR const bool is_specialized = true;282 283 static _LIBCPP_CONSTEXPR const bool is_signed = true;284 static _LIBCPP_CONSTEXPR const int digits = __FLT_MANT_DIG__;285 static _LIBCPP_CONSTEXPR const int digits10 = __FLT_DIG__;286 static _LIBCPP_CONSTEXPR const int max_digits10 = 2 + (digits * 30103l) / 100000l;287 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __FLT_MIN__; }288 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __FLT_MAX__; }289 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return -max(); }290 291 static _LIBCPP_CONSTEXPR const bool is_integer = false;292 static _LIBCPP_CONSTEXPR const bool is_exact = false;293 static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__;294 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __FLT_EPSILON__; }295 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return 0.5F; }296 297 static _LIBCPP_CONSTEXPR const int min_exponent = __FLT_MIN_EXP__;298 static _LIBCPP_CONSTEXPR const int min_exponent10 = __FLT_MIN_10_EXP__;299 static _LIBCPP_CONSTEXPR const int max_exponent = __FLT_MAX_EXP__;300 static _LIBCPP_CONSTEXPR const int max_exponent10 = __FLT_MAX_10_EXP__;301 302 static _LIBCPP_CONSTEXPR const bool has_infinity = true;303 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;304 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;305 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;306 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;307 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {308 return __builtin_huge_valf();309 }310 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {311 return __builtin_nanf("");312 }313 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {314 return __builtin_nansf("");315 }316 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {317 return __FLT_DENORM_MIN__;318 }319 320 static _LIBCPP_CONSTEXPR const bool is_iec559 = true;321 static _LIBCPP_CONSTEXPR const bool is_bounded = true;322 static _LIBCPP_CONSTEXPR const bool is_modulo = false;323 324 static _LIBCPP_CONSTEXPR const bool traps = false;325# if (defined(__arm__) || defined(__aarch64__))326 static _LIBCPP_CONSTEXPR const bool tinyness_before = true;327# else328 static _LIBCPP_CONSTEXPR const bool tinyness_before = false;329# endif330 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;331};332 333template <>334class __libcpp_numeric_limits<double, true> {335protected:336 typedef double type;337 338 static _LIBCPP_CONSTEXPR const bool is_specialized = true;339 340 static _LIBCPP_CONSTEXPR const bool is_signed = true;341 static _LIBCPP_CONSTEXPR const int digits = __DBL_MANT_DIG__;342 static _LIBCPP_CONSTEXPR const int digits10 = __DBL_DIG__;343 static _LIBCPP_CONSTEXPR const int max_digits10 = 2 + (digits * 30103l) / 100000l;344 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __DBL_MIN__; }345 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __DBL_MAX__; }346 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return -max(); }347 348 static _LIBCPP_CONSTEXPR const bool is_integer = false;349 static _LIBCPP_CONSTEXPR const bool is_exact = false;350 static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__;351 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __DBL_EPSILON__; }352 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return 0.5; }353 354 static _LIBCPP_CONSTEXPR const int min_exponent = __DBL_MIN_EXP__;355 static _LIBCPP_CONSTEXPR const int min_exponent10 = __DBL_MIN_10_EXP__;356 static _LIBCPP_CONSTEXPR const int max_exponent = __DBL_MAX_EXP__;357 static _LIBCPP_CONSTEXPR const int max_exponent10 = __DBL_MAX_10_EXP__;358 359 static _LIBCPP_CONSTEXPR const bool has_infinity = true;360 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;361 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;362 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;363 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;364 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {365 return __builtin_huge_val();366 }367 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {368 return __builtin_nan("");369 }370 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {371 return __builtin_nans("");372 }373 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {374 return __DBL_DENORM_MIN__;375 }376 377 static _LIBCPP_CONSTEXPR const bool is_iec559 = true;378 static _LIBCPP_CONSTEXPR const bool is_bounded = true;379 static _LIBCPP_CONSTEXPR const bool is_modulo = false;380 381 static _LIBCPP_CONSTEXPR const bool traps = false;382# if (defined(__arm__) || defined(__aarch64__))383 static _LIBCPP_CONSTEXPR const bool tinyness_before = true;384# else385 static _LIBCPP_CONSTEXPR const bool tinyness_before = false;386# endif387 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;388};389 390template <>391class __libcpp_numeric_limits<long double, true> {392protected:393 typedef long double type;394 395 static _LIBCPP_CONSTEXPR const bool is_specialized = true;396 397 static _LIBCPP_CONSTEXPR const bool is_signed = true;398 static _LIBCPP_CONSTEXPR const int digits = __LDBL_MANT_DIG__;399 static _LIBCPP_CONSTEXPR const int digits10 = __LDBL_DIG__;400 static _LIBCPP_CONSTEXPR const int max_digits10 = 2 + (digits * 30103l) / 100000l;401 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __LDBL_MIN__; }402 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __LDBL_MAX__; }403 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return -max(); }404 405 static _LIBCPP_CONSTEXPR const bool is_integer = false;406 static _LIBCPP_CONSTEXPR const bool is_exact = false;407 static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__;408 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __LDBL_EPSILON__; }409 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return 0.5L; }410 411 static _LIBCPP_CONSTEXPR const int min_exponent = __LDBL_MIN_EXP__;412 static _LIBCPP_CONSTEXPR const int min_exponent10 = __LDBL_MIN_10_EXP__;413 static _LIBCPP_CONSTEXPR const int max_exponent = __LDBL_MAX_EXP__;414 static _LIBCPP_CONSTEXPR const int max_exponent10 = __LDBL_MAX_10_EXP__;415 416 static _LIBCPP_CONSTEXPR const bool has_infinity = true;417 static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true;418 static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true;419 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present;420 static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false;421 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {422 return __builtin_huge_vall();423 }424 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {425 return __builtin_nanl("");426 }427 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {428 return __builtin_nansl("");429 }430 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {431 return __LDBL_DENORM_MIN__;432 }433 434# if defined(__powerpc__) && defined(__LONG_DOUBLE_IBM128__)435 static _LIBCPP_CONSTEXPR const bool is_iec559 = false;436# else437 static _LIBCPP_CONSTEXPR const bool is_iec559 = true;438# endif439 static _LIBCPP_CONSTEXPR const bool is_bounded = true;440 static _LIBCPP_CONSTEXPR const bool is_modulo = false;441 442 static _LIBCPP_CONSTEXPR const bool traps = false;443# if (defined(__arm__) || defined(__aarch64__))444 static _LIBCPP_CONSTEXPR const bool tinyness_before = true;445# else446 static _LIBCPP_CONSTEXPR const bool tinyness_before = false;447# endif448 static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest;449};450 451template <class _Tp>452class numeric_limits : private __libcpp_numeric_limits<_Tp> {453 typedef __libcpp_numeric_limits<_Tp> __base;454 typedef typename __base::type type;455 456public:457 static inline _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized;458 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __base::min(); }459 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __base::max(); }460 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return __base::lowest(); }461 462 static inline _LIBCPP_CONSTEXPR const int digits = __base::digits;463 static inline _LIBCPP_CONSTEXPR const int digits10 = __base::digits10;464 static inline _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10;465 static inline _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed;466 static inline _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer;467 static inline _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact;468 static inline _LIBCPP_CONSTEXPR const int radix = __base::radix;469 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT {470 return __base::epsilon();471 }472 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT {473 return __base::round_error();474 }475 476 static inline _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent;477 static inline _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10;478 static inline _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent;479 static inline _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10;480 481 static inline _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity;482 static inline _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN;483 static inline _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN;484 _LIBCPP_SUPPRESS_DEPRECATED_PUSH485 static inline _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm;486 static inline _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss;487 _LIBCPP_SUPPRESS_DEPRECATED_POP488 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT {489 return __base::infinity();490 }491 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT {492 return __base::quiet_NaN();493 }494 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT {495 return __base::signaling_NaN();496 }497 [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT {498 return __base::denorm_min();499 }500 501 static inline _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559;502 static inline _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded;503 static inline _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo;504 505 static inline _LIBCPP_CONSTEXPR const bool traps = __base::traps;506 static inline _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before;507 static inline _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style;508};509 510template <class _Tp>511class numeric_limits<const _Tp> : public numeric_limits<_Tp> {};512 513template <class _Tp>514class numeric_limits<volatile _Tp> : public numeric_limits<_Tp> {};515 516template <class _Tp>517class numeric_limits<const volatile _Tp> : public numeric_limits<_Tp> {};518 519_LIBCPP_END_NAMESPACE_STD520 521_LIBCPP_POP_MACROS522 523# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20524# include <type_traits>525# endif526#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)527 528#endif // _LIBCPP_LIMITS529