10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_LIMITS 110b57cec5SDimitry Andric#define _LIBCPP_LIMITS 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric limits synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andricnamespace std 170b57cec5SDimitry Andric{ 180b57cec5SDimitry Andric 190b57cec5SDimitry Andrictemplate<class T> 200b57cec5SDimitry Andricclass numeric_limits 210b57cec5SDimitry Andric{ 220b57cec5SDimitry Andricpublic: 230b57cec5SDimitry Andric static constexpr bool is_specialized = false; 240b57cec5SDimitry Andric static constexpr T min() noexcept; 250b57cec5SDimitry Andric static constexpr T max() noexcept; 260b57cec5SDimitry Andric static constexpr T lowest() noexcept; 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric static constexpr int digits = 0; 290b57cec5SDimitry Andric static constexpr int digits10 = 0; 300b57cec5SDimitry Andric static constexpr int max_digits10 = 0; 310b57cec5SDimitry Andric static constexpr bool is_signed = false; 320b57cec5SDimitry Andric static constexpr bool is_integer = false; 330b57cec5SDimitry Andric static constexpr bool is_exact = false; 340b57cec5SDimitry Andric static constexpr int radix = 0; 350b57cec5SDimitry Andric static constexpr T epsilon() noexcept; 360b57cec5SDimitry Andric static constexpr T round_error() noexcept; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric static constexpr int min_exponent = 0; 390b57cec5SDimitry Andric static constexpr int min_exponent10 = 0; 400b57cec5SDimitry Andric static constexpr int max_exponent = 0; 410b57cec5SDimitry Andric static constexpr int max_exponent10 = 0; 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric static constexpr bool has_infinity = false; 440b57cec5SDimitry Andric static constexpr bool has_quiet_NaN = false; 450b57cec5SDimitry Andric static constexpr bool has_signaling_NaN = false; 465f757f3fSDimitry Andric static constexpr float_denorm_style has_denorm = denorm_absent; // deprecated in C++23 475f757f3fSDimitry Andric static constexpr bool has_denorm_loss = false; // deprecated in C++23 480b57cec5SDimitry Andric static constexpr T infinity() noexcept; 490b57cec5SDimitry Andric static constexpr T quiet_NaN() noexcept; 500b57cec5SDimitry Andric static constexpr T signaling_NaN() noexcept; 510b57cec5SDimitry Andric static constexpr T denorm_min() noexcept; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric static constexpr bool is_iec559 = false; 540b57cec5SDimitry Andric static constexpr bool is_bounded = false; 550b57cec5SDimitry Andric static constexpr bool is_modulo = false; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric static constexpr bool traps = false; 580b57cec5SDimitry Andric static constexpr bool tinyness_before = false; 590b57cec5SDimitry Andric static constexpr float_round_style round_style = round_toward_zero; 600b57cec5SDimitry Andric}; 610b57cec5SDimitry Andric 620b57cec5SDimitry Andricenum float_round_style 630b57cec5SDimitry Andric{ 640b57cec5SDimitry Andric round_indeterminate = -1, 650b57cec5SDimitry Andric round_toward_zero = 0, 660b57cec5SDimitry Andric round_to_nearest = 1, 670b57cec5SDimitry Andric round_toward_infinity = 2, 680b57cec5SDimitry Andric round_toward_neg_infinity = 3 690b57cec5SDimitry Andric}; 700b57cec5SDimitry Andric 715f757f3fSDimitry Andricenum float_denorm_style // deprecated in C++23 720b57cec5SDimitry Andric{ 730b57cec5SDimitry Andric denorm_indeterminate = -1, 740b57cec5SDimitry Andric denorm_absent = 0, 750b57cec5SDimitry Andric denorm_present = 1 760b57cec5SDimitry Andric}; 770b57cec5SDimitry Andric 780b57cec5SDimitry Andrictemplate<> class numeric_limits<cv bool>; 790b57cec5SDimitry Andric 800b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char>; 810b57cec5SDimitry Andrictemplate<> class numeric_limits<cv signed char>; 820b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned char>; 830b57cec5SDimitry Andrictemplate<> class numeric_limits<cv wchar_t>; 840b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char8_t>; // C++20 850b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char16_t>; 860b57cec5SDimitry Andrictemplate<> class numeric_limits<cv char32_t>; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andrictemplate<> class numeric_limits<cv short>; 890b57cec5SDimitry Andrictemplate<> class numeric_limits<cv int>; 900b57cec5SDimitry Andrictemplate<> class numeric_limits<cv long>; 910b57cec5SDimitry Andrictemplate<> class numeric_limits<cv long long>; 920b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned short>; 930b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned int>; 940b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned long>; 950b57cec5SDimitry Andrictemplate<> class numeric_limits<cv unsigned long long>; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andrictemplate<> class numeric_limits<cv float>; 980b57cec5SDimitry Andrictemplate<> class numeric_limits<cv double>; 990b57cec5SDimitry Andrictemplate<> class numeric_limits<cv long double>; 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric} // std 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric*/ 10481ad6265SDimitry Andric 1050b57cec5SDimitry Andric#include <__config> 106bdd1243dSDimitry Andric#include <__type_traits/is_arithmetic.h> 107bdd1243dSDimitry Andric#include <__type_traits/is_signed.h> 108bdd1243dSDimitry Andric#include <__type_traits/remove_cv.h> 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1110b57cec5SDimitry Andric# pragma GCC system_header 1120b57cec5SDimitry Andric#endif 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 1150b57cec5SDimitry Andric#include <__undef_macros> 1160b57cec5SDimitry Andric#include <version> 1170b57cec5SDimitry Andric 1180b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1190b57cec5SDimitry Andric 120cb14a3feSDimitry Andricenum float_round_style { 1210b57cec5SDimitry Andric round_indeterminate = -1, 1220b57cec5SDimitry Andric round_toward_zero = 0, 1230b57cec5SDimitry Andric round_to_nearest = 1, 1240b57cec5SDimitry Andric round_toward_infinity = 2, 1250b57cec5SDimitry Andric round_toward_neg_infinity = 3 1260b57cec5SDimitry Andric}; 1270b57cec5SDimitry Andric 128cb14a3feSDimitry Andricenum _LIBCPP_DEPRECATED_IN_CXX23 float_denorm_style { 1290b57cec5SDimitry Andric denorm_indeterminate = -1, 1300b57cec5SDimitry Andric denorm_absent = 0, 1310b57cec5SDimitry Andric denorm_present = 1 1320b57cec5SDimitry Andric}; 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andrictemplate <class _Tp, bool = is_arithmetic<_Tp>::value> 135cb14a3feSDimitry Andricclass __libcpp_numeric_limits { 1360b57cec5SDimitry Andricprotected: 1370b57cec5SDimitry Andric typedef _Tp type; 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_specialized = false; 140*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return type(); } 141*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return type(); } 142*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return type(); } 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits = 0; 1450b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits10 = 0; 1460b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_digits10 = 0; 1470b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_signed = false; 1480b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_integer = false; 1490b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_exact = false; 1500b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int radix = 0; 151*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return type(); } 152*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return type(); } 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent = 0; 1550b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; 1560b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent = 0; 1570b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; 1580b57cec5SDimitry Andric 1590b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_infinity = false; 1600b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; 1610b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; 1625f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; 1635f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 164*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return type(); } 165*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return type(); } 166*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return type(); } 167*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return type(); } 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 1700b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_bounded = false; 1710b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_modulo = false; 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = false; 1740b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 1750b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; 1760b57cec5SDimitry Andric}; 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andrictemplate <class _Tp, int __digits, bool _IsSigned> 179cb14a3feSDimitry Andricstruct __libcpp_compute_min { 1800b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const _Tp value = _Tp(_Tp(1) << __digits); 1810b57cec5SDimitry Andric}; 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andrictemplate <class _Tp, int __digits> 184cb14a3feSDimitry Andricstruct __libcpp_compute_min<_Tp, __digits, false> { 1850b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const _Tp value = _Tp(0); 1860b57cec5SDimitry Andric}; 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andrictemplate <class _Tp> 189cb14a3feSDimitry Andricclass __libcpp_numeric_limits<_Tp, true> { 1900b57cec5SDimitry Andricprotected: 1910b57cec5SDimitry Andric typedef _Tp type; 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_specialized = true; 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_signed = type(-1) < type(0); 1960b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed); 1970b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits10 = digits * 3 / 10; 1980b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_digits10 = 0; 1990b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const type __min = __libcpp_compute_min<type, digits, is_signed>::value; 2000b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const type __max = is_signed ? type(type(~0) ^ __min) : type(~0); 201*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __min; } 202*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __max; } 203*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return min(); } 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_integer = true; 2060b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_exact = true; 2070b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int radix = 2; 208*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return type(0); } 209*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return type(0); } 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent = 0; 2120b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; 2130b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent = 0; 2140b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_infinity = false; 2170b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; 2180b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; 2195f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; 2205f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 221*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return type(0); } 222*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return type(0); } 223*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return type(0); } 224*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return type(0); } 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 2270b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_bounded = true; 2285f757f3fSDimitry Andric static _LIBCPP_CONSTEXPR const bool is_modulo = !std::is_signed<_Tp>::value; 2290b57cec5SDimitry Andric 230cb14a3feSDimitry Andric#if defined(__i386__) || defined(__x86_64__) || defined(__pnacl__) || defined(__wasm__) 2310b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = true; 2320b57cec5SDimitry Andric#else 2330b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = false; 2340b57cec5SDimitry Andric#endif 2350b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 2360b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; 2370b57cec5SDimitry Andric}; 2380b57cec5SDimitry Andric 2390b57cec5SDimitry Andrictemplate <> 240cb14a3feSDimitry Andricclass __libcpp_numeric_limits<bool, true> { 2410b57cec5SDimitry Andricprotected: 2420b57cec5SDimitry Andric typedef bool type; 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_specialized = true; 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_signed = false; 2470b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits = 1; 2480b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits10 = 0; 2490b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_digits10 = 0; 2500b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const type __min = false; 2510b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const type __max = true; 252*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __min; } 253*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __max; } 254*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return min(); } 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_integer = true; 2570b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_exact = true; 2580b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int radix = 2; 259*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return type(0); } 260*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return type(0); } 2610b57cec5SDimitry Andric 2620b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent = 0; 2630b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent10 = 0; 2640b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent = 0; 2650b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent10 = 0; 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_infinity = false; 2680b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = false; 2690b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = false; 2705f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_absent; 2715f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 272*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { return type(0); } 273*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { return type(0); } 274*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { return type(0); } 275*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { return type(0); } 2760b57cec5SDimitry Andric 2770b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 2780b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_bounded = true; 2790b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_modulo = false; 2800b57cec5SDimitry Andric 2810b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = false; 2820b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 2830b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const float_round_style round_style = round_toward_zero; 2840b57cec5SDimitry Andric}; 2850b57cec5SDimitry Andric 2860b57cec5SDimitry Andrictemplate <> 287cb14a3feSDimitry Andricclass __libcpp_numeric_limits<float, true> { 2880b57cec5SDimitry Andricprotected: 2890b57cec5SDimitry Andric typedef float type; 2900b57cec5SDimitry Andric 2910b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_specialized = true; 2920b57cec5SDimitry Andric 2930b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_signed = true; 2940b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits = __FLT_MANT_DIG__; 2950b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits10 = __FLT_DIG__; 2960b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_digits10 = 2 + (digits * 30103l) / 100000l; 297*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __FLT_MIN__; } 298*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __FLT_MAX__; } 299*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return -max(); } 3000b57cec5SDimitry Andric 3010b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_integer = false; 3020b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_exact = false; 3030b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; 304*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __FLT_EPSILON__; } 305*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return 0.5F; } 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent = __FLT_MIN_EXP__; 3080b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent10 = __FLT_MIN_10_EXP__; 3090b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent = __FLT_MAX_EXP__; 3100b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent10 = __FLT_MAX_10_EXP__; 3110b57cec5SDimitry Andric 3120b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_infinity = true; 3130b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; 3140b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; 3155f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; 3165f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 317*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { 318*0fca6ea1SDimitry Andric return __builtin_huge_valf(); 319*0fca6ea1SDimitry Andric } 320*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { 321*0fca6ea1SDimitry Andric return __builtin_nanf(""); 322*0fca6ea1SDimitry Andric } 323*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { 324*0fca6ea1SDimitry Andric return __builtin_nansf(""); 325*0fca6ea1SDimitry Andric } 326*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { 327*0fca6ea1SDimitry Andric return __FLT_DENORM_MIN__; 328*0fca6ea1SDimitry Andric } 3290b57cec5SDimitry Andric 3300b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = true; 3310b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_bounded = true; 3320b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_modulo = false; 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = false; 33581ad6265SDimitry Andric#if (defined(__arm__) || defined(__aarch64__)) 33681ad6265SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = true; 33781ad6265SDimitry Andric#else 3380b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 33981ad6265SDimitry Andric#endif 3400b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; 3410b57cec5SDimitry Andric}; 3420b57cec5SDimitry Andric 3430b57cec5SDimitry Andrictemplate <> 344cb14a3feSDimitry Andricclass __libcpp_numeric_limits<double, true> { 3450b57cec5SDimitry Andricprotected: 3460b57cec5SDimitry Andric typedef double type; 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_specialized = true; 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_signed = true; 3510b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits = __DBL_MANT_DIG__; 3520b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits10 = __DBL_DIG__; 3530b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_digits10 = 2 + (digits * 30103l) / 100000l; 354*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __DBL_MIN__; } 355*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __DBL_MAX__; } 356*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return -max(); } 3570b57cec5SDimitry Andric 3580b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_integer = false; 3590b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_exact = false; 3600b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; 361*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __DBL_EPSILON__; } 362*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return 0.5; } 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent = __DBL_MIN_EXP__; 3650b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent10 = __DBL_MIN_10_EXP__; 3660b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent = __DBL_MAX_EXP__; 3670b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent10 = __DBL_MAX_10_EXP__; 3680b57cec5SDimitry Andric 3690b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_infinity = true; 3700b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; 3710b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; 3725f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; 3735f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 374*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { 375*0fca6ea1SDimitry Andric return __builtin_huge_val(); 376*0fca6ea1SDimitry Andric } 377*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { 378*0fca6ea1SDimitry Andric return __builtin_nan(""); 379*0fca6ea1SDimitry Andric } 380*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { 381*0fca6ea1SDimitry Andric return __builtin_nans(""); 382*0fca6ea1SDimitry Andric } 383*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { 384*0fca6ea1SDimitry Andric return __DBL_DENORM_MIN__; 385*0fca6ea1SDimitry Andric } 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = true; 3880b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_bounded = true; 3890b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_modulo = false; 3900b57cec5SDimitry Andric 3910b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = false; 39281ad6265SDimitry Andric#if (defined(__arm__) || defined(__aarch64__)) 39381ad6265SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = true; 39481ad6265SDimitry Andric#else 3950b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 39681ad6265SDimitry Andric#endif 3970b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; 3980b57cec5SDimitry Andric}; 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andrictemplate <> 401cb14a3feSDimitry Andricclass __libcpp_numeric_limits<long double, true> { 4020b57cec5SDimitry Andricprotected: 4030b57cec5SDimitry Andric typedef long double type; 4040b57cec5SDimitry Andric 4050b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_specialized = true; 4060b57cec5SDimitry Andric 4070b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_signed = true; 4080b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits = __LDBL_MANT_DIG__; 4090b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits10 = __LDBL_DIG__; 4100b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_digits10 = 2 + (digits * 30103l) / 100000l; 411*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __LDBL_MIN__; } 412*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __LDBL_MAX__; } 413*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return -max(); } 4140b57cec5SDimitry Andric 4150b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_integer = false; 4160b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_exact = false; 4170b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int radix = __FLT_RADIX__; 418*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { return __LDBL_EPSILON__; } 419*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { return 0.5L; } 4200b57cec5SDimitry Andric 4210b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent = __LDBL_MIN_EXP__; 4220b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent10 = __LDBL_MIN_10_EXP__; 4230b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent = __LDBL_MAX_EXP__; 4240b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent10 = __LDBL_MAX_10_EXP__; 4250b57cec5SDimitry Andric 4260b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_infinity = true; 4270b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = true; 4280b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = true; 4295f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = denorm_present; 4305f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = false; 431*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { 432*0fca6ea1SDimitry Andric return __builtin_huge_vall(); 433*0fca6ea1SDimitry Andric } 434*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { 435*0fca6ea1SDimitry Andric return __builtin_nanl(""); 436*0fca6ea1SDimitry Andric } 437*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { 438*0fca6ea1SDimitry Andric return __builtin_nansl(""); 439*0fca6ea1SDimitry Andric } 440*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { 441*0fca6ea1SDimitry Andric return __LDBL_DENORM_MIN__; 442*0fca6ea1SDimitry Andric } 4430b57cec5SDimitry Andric 444bdd1243dSDimitry Andric#if defined(__powerpc__) && defined(__LONG_DOUBLE_IBM128__) 4450b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = false; 4460b57cec5SDimitry Andric#else 4470b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = true; 4480b57cec5SDimitry Andric#endif 4490b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_bounded = true; 4500b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_modulo = false; 4510b57cec5SDimitry Andric 4520b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = false; 45381ad6265SDimitry Andric#if (defined(__arm__) || defined(__aarch64__)) 45481ad6265SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = true; 45581ad6265SDimitry Andric#else 4560b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = false; 45781ad6265SDimitry Andric#endif 4580b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const float_round_style round_style = round_to_nearest; 4590b57cec5SDimitry Andric}; 4600b57cec5SDimitry Andric 4610b57cec5SDimitry Andrictemplate <class _Tp> 462*0fca6ea1SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits : private __libcpp_numeric_limits<_Tp> { 463*0fca6ea1SDimitry Andric typedef __libcpp_numeric_limits<_Tp> __base; 4640b57cec5SDimitry Andric typedef typename __base::type type; 465cb14a3feSDimitry Andric 4660b57cec5SDimitry Andricpublic: 4670b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_specialized = __base::is_specialized; 468*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type min() _NOEXCEPT { return __base::min(); } 469*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type max() _NOEXCEPT { return __base::max(); } 470*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type lowest() _NOEXCEPT { return __base::lowest(); } 4710b57cec5SDimitry Andric 4720b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits = __base::digits; 4730b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int digits10 = __base::digits10; 4740b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_digits10 = __base::max_digits10; 4750b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_signed = __base::is_signed; 4760b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_integer = __base::is_integer; 4770b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_exact = __base::is_exact; 4780b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int radix = __base::radix; 479*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type epsilon() _NOEXCEPT { 480*0fca6ea1SDimitry Andric return __base::epsilon(); 481*0fca6ea1SDimitry Andric } 482*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type round_error() _NOEXCEPT { 483*0fca6ea1SDimitry Andric return __base::round_error(); 484*0fca6ea1SDimitry Andric } 4850b57cec5SDimitry Andric 4860b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent = __base::min_exponent; 4870b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int min_exponent10 = __base::min_exponent10; 4880b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent = __base::max_exponent; 4890b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const int max_exponent10 = __base::max_exponent10; 4900b57cec5SDimitry Andric 4910b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_infinity = __base::has_infinity; 4920b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_quiet_NaN = __base::has_quiet_NaN; 4930b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool has_signaling_NaN = __base::has_signaling_NaN; 4945f757f3fSDimitry Andric _LIBCPP_SUPPRESS_DEPRECATED_PUSH 4955f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const float_denorm_style has_denorm = __base::has_denorm; 4965f757f3fSDimitry Andric static _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_CONSTEXPR const bool has_denorm_loss = __base::has_denorm_loss; 4975f757f3fSDimitry Andric _LIBCPP_SUPPRESS_DEPRECATED_POP 498*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type infinity() _NOEXCEPT { 499*0fca6ea1SDimitry Andric return __base::infinity(); 500*0fca6ea1SDimitry Andric } 501*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type quiet_NaN() _NOEXCEPT { 502*0fca6ea1SDimitry Andric return __base::quiet_NaN(); 503*0fca6ea1SDimitry Andric } 504*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type signaling_NaN() _NOEXCEPT { 505*0fca6ea1SDimitry Andric return __base::signaling_NaN(); 506*0fca6ea1SDimitry Andric } 507*0fca6ea1SDimitry Andric _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR type denorm_min() _NOEXCEPT { 508*0fca6ea1SDimitry Andric return __base::denorm_min(); 509*0fca6ea1SDimitry Andric } 5100b57cec5SDimitry Andric 5110b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_iec559 = __base::is_iec559; 5120b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_bounded = __base::is_bounded; 5130b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool is_modulo = __base::is_modulo; 5140b57cec5SDimitry Andric 5150b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool traps = __base::traps; 5160b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const bool tinyness_before = __base::tinyness_before; 5170b57cec5SDimitry Andric static _LIBCPP_CONSTEXPR const float_round_style round_style = __base::round_style; 5180b57cec5SDimitry Andric}; 5190b57cec5SDimitry Andric 5200b57cec5SDimitry Andrictemplate <class _Tp> 5210b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_specialized; 5220b57cec5SDimitry Andrictemplate <class _Tp> 5230b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits; 5240b57cec5SDimitry Andrictemplate <class _Tp> 5250b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::digits10; 5260b57cec5SDimitry Andrictemplate <class _Tp> 5270b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_digits10; 5280b57cec5SDimitry Andrictemplate <class _Tp> 5290b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_signed; 5300b57cec5SDimitry Andrictemplate <class _Tp> 5310b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_integer; 5320b57cec5SDimitry Andrictemplate <class _Tp> 5330b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_exact; 5340b57cec5SDimitry Andrictemplate <class _Tp> 5350b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::radix; 5360b57cec5SDimitry Andrictemplate <class _Tp> 5370b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent; 5380b57cec5SDimitry Andrictemplate <class _Tp> 5390b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::min_exponent10; 5400b57cec5SDimitry Andrictemplate <class _Tp> 5410b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent; 5420b57cec5SDimitry Andrictemplate <class _Tp> 5430b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const int numeric_limits<_Tp>::max_exponent10; 5440b57cec5SDimitry Andrictemplate <class _Tp> 5450b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_infinity; 5460b57cec5SDimitry Andrictemplate <class _Tp> 5470b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_quiet_NaN; 5480b57cec5SDimitry Andrictemplate <class _Tp> 5490b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_signaling_NaN; 5500b57cec5SDimitry Andrictemplate <class _Tp> 5510b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const float_denorm_style numeric_limits<_Tp>::has_denorm; 5520b57cec5SDimitry Andrictemplate <class _Tp> 5530b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::has_denorm_loss; 5540b57cec5SDimitry Andrictemplate <class _Tp> 5550b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_iec559; 5560b57cec5SDimitry Andrictemplate <class _Tp> 5570b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_bounded; 5580b57cec5SDimitry Andrictemplate <class _Tp> 5590b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::is_modulo; 5600b57cec5SDimitry Andrictemplate <class _Tp> 5610b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::traps; 5620b57cec5SDimitry Andrictemplate <class _Tp> 5630b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const bool numeric_limits<_Tp>::tinyness_before; 5640b57cec5SDimitry Andrictemplate <class _Tp> 5650b57cec5SDimitry Andric_LIBCPP_CONSTEXPR const float_round_style numeric_limits<_Tp>::round_style; 5660b57cec5SDimitry Andric 5670b57cec5SDimitry Andrictemplate <class _Tp> 568*0fca6ea1SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits<const _Tp> : public numeric_limits<_Tp> {}; 5690b57cec5SDimitry Andric 5700b57cec5SDimitry Andrictemplate <class _Tp> 571*0fca6ea1SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits<volatile _Tp> : public numeric_limits<_Tp> {}; 5720b57cec5SDimitry Andric 5730b57cec5SDimitry Andrictemplate <class _Tp> 574*0fca6ea1SDimitry Andricclass _LIBCPP_TEMPLATE_VIS numeric_limits<const volatile _Tp> : public numeric_limits<_Tp> {}; 5750b57cec5SDimitry Andric 5760b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andric_LIBCPP_POP_MACROS 5790b57cec5SDimitry Andric 580bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 581bdd1243dSDimitry Andric# include <type_traits> 582bdd1243dSDimitry Andric#endif 583bdd1243dSDimitry Andric 5840b57cec5SDimitry Andric#endif // _LIBCPP_LIMITS 585