types_numeric_limits
types_numeric_limits (numeric_limits 타입 특성)
std::numeric_limits 클래스 템플릿은 산술 타입의 다양한 속성을 표준화된 방식으로 조회할 수 있게 해주는 C++ 표준 라이브러리 도구예요. 예를 들어 int 타입이 가질 수 있는 가장 큰 값은 std::numeric_limits<int>::max()로 얻을 수 있어요. 이 정보는 std::numeric_limits 템플릿의 특수화를 통해 제공되며, 표준 라이브러리는 모든 산술 타입에 대해 특수화를 제공해요.
출처: cppreference
본문
<limits> 헤더에 정의된 std::numeric_limits 클래스 템플릿은 산술 타입의 속성을 질의하기 위한 표준화된 방법을 제공해요. 이 정보는 std::numeric_limits 템플릿의 특수화를 통해 제공되며, 표준 라이브러리는 모든 산술 타입에 대해 특수화를 제공해요. 아래 표는 cv 한정이 없는 산술 타입에 대한 특수화 목록이에요.
<limits> 헤더에 정의됨 |
||
|---|---|---|
template < class T > class numeric_limits ; |
std::numeric_limits 클래스 템플릿은 산술 타입의 다양한 속성을 표준화된 방식으로 조회할 수 있게 해줘요. 예를 들어 int 타입의 최댓값은 std::numeric_limits<int>::max()로 얻을 수 있어요. 이 정보는 std::numeric_limits 템플릿의 특수화를 통해 제공돼요. 표준 라이브러리는 모든 산술 타입에 대해 특수화를 제공해요. 아래는 cv 한정이 없는 산술 타입에 대한 특수화 목록이에요.
<limits> 헤더에 정의됨 |
||
|---|---|---|
template <> class numeric_limits < bool > ; |
||
template <> class numeric_limits < char > ; |
||
template <> class numeric_limits < signed char > ; |
||
template <> class numeric_limits < unsigned char > ; |
||
template <> class numeric_limits < wchar_t > ; |
||
template <> class numeric_limits < char8_t > ; |
(C++20부터) | |
template <> class numeric_limits < char16_t > ; |
(C++11부터) | |
template <> class numeric_limits < char32_t > ; |
(C++11부터) | |
template <> class numeric_limits < short > ; |
||
template <> class numeric_limits < unsigned short > ; |
||
template <> class numeric_limits < int > ; |
||
template <> class numeric_limits < unsigned int > ; |
||
template <> class numeric_limits < long > ; |
||
template <> class numeric_limits < unsigned long > ; |
||
template <> class numeric_limits < long long > ; |
(C++11부터) | |
template <> class numeric_limits < unsigned long long > ; |
(C++11부터) | |
template <> class numeric_limits < float > ; |
||
template <> class numeric_limits < double > ; |
||
template <> class numeric_limits < long double > ; |
cv 한정 타입 cv T에 대한 std::numeric_limits 특수화의 각 멤버 값은 cv 한정이 없는 타입 T에 대한 특수화의 해당 멤버 값과 같아요. 예를 들어 std::numeric_limits<int>::digits는 std::numeric_limits<const int>::digits와 같아요.
std::size_t나 std::streamsize 같은 산술 타입의 별칭도 std::numeric_limits 타입 특성으로 조회할 수 있어요.
std::complex<T>나 std::nullptr_t 같은 비산술 표준 타입에는 특수화가 없어요.
구현이 정수 클래스 타입을 정의하는 경우, 그 타입에 대해서도 std::numeric_limits 특수화를 제공해야 해요. |
(C++20부터) |
|---|
구현은 구현 고유 타입에 대해 std::numeric_limits 특수화를 제공할 수 있어요. 예를 들어 GCC는 std::numeric_limits<__int128>을 제공해요. 비표준 라이브러리도 자체 제공 타입에 대해 특수화를 추가할 수 있어요. 예를 들어 OpenEXR은 16비트 부동소수점 타입을 위해 std::numeric_limits<half>를 제공해요.
템플릿 매개변수
| T | - | 숫자 속성을 조회할 타입 |
|---|
멤버 상수
is_specialized [static] |
std::numeric_limits가 특수화된 타입인지 식별해요 (공용 정적 멤버 상수) |
|---|---|
is_signed [static] |
부호 있는 타입인지 식별해요 (공용 정적 멤버 상수) |
is_integer [static] |
정수 타입인지 식별해요 (공용 정적 멤버 상수) |
is_exact [static] |
정확한 타입인지 식별해요 (공용 정적 멤버 상수) |
has_infinity [static] |
"양의 무한대" 특수 값을 표현할 수 있는 부동소수점 타입인지 식별해요 (공용 정적 멤버 상수) |
has_quiet_NaN [static] |
"조용한 NaN(quiet not-a-number)" 특수 값을 표현할 수 있는 부동소수점 타입인지 식별해요 (공용 정적 멤버 상수) |
has_signaling_NaN [static] |
"신호 NaN(signaling not-a-number)" 특수 값을 표현할 수 있는 부동소수점 타입인지 식별해요 (공용 정적 멤버 상수) |
has_denorm [static] |
부동소수점 타입이 사용하는 비정규화(denormalization) 방식을 식별해요 (공용 정적 멤버 상수) |
has_denorm_loss [static] |
정밀도 손실을 부정확한 결과가 아닌 비정규화 손실로 감지하는 부동소수점 타입인지 식별해요 (공용 정적 멤버 상수) |
round_style [static] |
타입이 사용하는 반올림 방식을 식별해요 (공용 정적 멤버 상수) |
is_iec559 [static] |
IEC 559/IEEE 754 부동소수점 타입인지 식별해요 (공용 정적 멤버 상수) |
is_bounded [static] |
유한한 값 집합을 표현하는 타입인지 식별해요 (공용 정적 멤버 상수) |
is_modulo [static] |
오버플로를 모듈로 연산으로 처리하는 타입인지 식별해요 (공용 정적 멤버 상수) |
digits [static] |
변경 없이 표현할 수 있는 기수(radix) 자릿수예요 (공용 정적 멤버 상수) |
digits10 [static] |
변경 없이 표현할 수 있는 십진 자릿수예요 (공용 정적 멤버 상수) |
max_digits10 [static] (C++11) |
이 타입의 모든 값을 구별하는 데 필요한 십진 자릿수예요 (공용 정적 멤버 상수) |
radix [static] |
주어진 타입의 표현에 사용되는 기수 또는 정수 밑이에요 (공용 정적 멤버 상수) |
min_exponent [static] |
유효한 정규화 부동소수점 값이 되는 기수의 가장 작은 음의 거듭제곱보다 1 큰 값이에요 (공용 정적 멤버 상수) |
min_exponent10 [static] |
유효한 정규화 부동소수점 값이 되는 10의 가장 작은 음의 거듭제곱이에요 (공용 정적 멤버 상수) |
max_exponent [static] |
유효한 유한 부동소수점 값이 되는 기수의 가장 큰 정수 거듭제곱보다 1 큰 값이에요 (공용 정적 멤버 상수) |
max_exponent10 [static] |
유효한 유한 부동소수점 값이 되는 10의 가장 큰 정수 거듭제곱이에요 (공용 정적 멤버 상수) |
traps [static] |
산술 연산이 트랩을 발생시킬 수 있는 타입인지 식별해요 (공용 정적 멤버 상수) |
tinyness_before [static] |
반올림 전에 작음(tinyness)을 감지하는 부동소수점 타입인지 식별해요 (공용 정적 멤버 상수) |
멤버 함수
min [static] |
주어진 비부동소수점 타입의 가장 작은 유한 값을, 주어진 부동소수점 타입의 가장 작은 양의 정규 값을 반환해요 (공용 정적 멤버 함수) |
|---|---|
lowest [static] (C++11) |
주어진 타입의 가장 낮은 유한 값을 반환해요. 부호 있는 타입에서는 가장 음수 값, 부호 없는 타입에서는 0이에요 (공용 정적 멤버 함수) |
max [static] |
주어진 타입의 가장 큰 유한 값을 반환해요 (공용 정적 멤버 함수) |
epsilon [static] |
1.0과 주어진 부동소수점 타입의 다음 표현 가능한 값 사이의 차이를 반환해요 (공용 정적 멤버 함수) |
round_error [static] |
주어진 부동소수점 타입의 최대 반올림 오차를 반환해요 (공용 정적 멤버 함수) |
infinity [static] |
주어진 부동소수점 타입의 양의 무한대 값을 반환해요 (공용 정적 멤버 함수) |
quiet_NaN [static] |
주어진 부동소수점 타입의 조용한 NaN 값을 반환해요 (공용 정적 멤버 함수) |
signaling_NaN [static] |
주어진 부동소수점 타입의 신호 NaN 값을 반환해요 (공용 정적 멤버 함수) |
denorm_min [static] |
주어진 부동소수점 타입의 가장 작은 양의 비정규(subnormal) 값을 반환해요 (공용 정적 멤버 함수) |
헬퍼 클래스
float_round_style |
부동소수점 반올림 모드를 나타내요 (열거형) |
|---|---|
float_denorm_style |
부동소수점 비정규화 모드를 나타내요 (열거형) |
C 라이브러리 매크로 상수와의 관계
T가 정수 타입인 std::numeric_limits<T> 특수화의 멤버는 다음과 같이 C 라이브러리 매크로와 대응해요.
T가 다음과 같은 경우 |
멤버 |
|---|---|
min() |
|
bool |
false |
char |
CHAR_MIN |
signed char |
SCHAR_MIN |
unsigned char |
0 |
wchar_t |
WCHAR_MIN |
char8_t |
0 |
char16_t |
0 |
char32_t |
0 |
short |
SHRT_MIN |
signed short |
|
unsigned short |
0 |
int |
INT_MIN |
signed int |
|
unsigned int |
0 |
long |
LONG_MIN |
signed long |
|
unsigned long |
0 |
long long |
LLONG_MIN |
signed long long |
|
unsigned long long |
0 |
T가 부동소수점 타입인 경우의 멤버 대응은 다음과 같아요.
T가 다음과 같은 경우 |
멤버 |
|---|---|
denorm_min() |
|
float |
FLT_TRUE_MIN |
double |
DBL_TRUE_MIN |
long double |
LDBL_TRUE_MIN |
계속해서 나머지 멤버 대응은 다음과 같아요.
T가 다음과 같은 경우 |
멤버 (계속) |
|---|---|
min_exponent |
|
float |
FLT_MIN_EXP |
double |
DBL_MIN_EXP |
long double |
LDBL_MIN_EXP |
예제
#include <iostream>
#include <limits>
int main()
{
std::cout << "type\t│ lowest()\t│ min()\t\t│ max()\n"
<< "bool\t│ "
<< std::numeric_limits<bool>::lowest() << "\t\t│ "
<< std::numeric_limits<bool>::min() << "\t\t│ "
<< std::numeric_limits<bool>::max() << '\n'
<< "uchar\t│ "
<< +std::numeric_limits<unsigned char>::lowest() << "\t\t│ "
<< +std::numeric_limits<unsigned char>::min() << "\t\t│ "
<< +std::numeric_limits<unsigned char>::max() << '\n'
<< "int\t│ "
<< std::numeric_limits<int>::lowest() << "\t│ "
<< std::numeric_limits<int>::min() << "\t│ "
<< std::numeric_limits<int>::max() << '\n'
<< "float\t│ "
<< std::numeric_limits<float>::lowest() << "\t│ "
<< std::numeric_limits<float>::min() << "\t│ "
<< std::numeric_limits<float>::max() << '\n'
<< "double\t│ "
<< std::numeric_limits<double>::lowest() << "\t│ "
<< std::numeric_limits<double>::min() << "\t│ "
<< std::numeric_limits<double>::max() << '\n';
}
가능한 출력은 다음과 같아요.
type │ lowest() │ min() │ max()
bool │ 0 │ 0 │ 1
uchar │ 0 │ 0 │ 255
int │ -2147483648 │ -2147483648 │ 2147483647
float │ -3.40282e+38 │ 1.17549e-38 │ 3.40282e+38
double │ -1.79769e+308 │ 2.22507e-308 │ 1.79769e+308
결함 보고서
다음과 같은 동작 변경 결함 보고서가 이전에 공개된 C++ 표준에 소급 적용되었어요.
| DR | 적용 대상 | 공개 당시 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 201 | C++98 | 모든 기본 타입에 대한 특수화를 제공해야 한다고 명시됨 | 비산술 타입은 제외됨 |
| LWG 559 | C++98 | cv 한정 타입에 대한 std::numeric_limits 특수화가 cv 한정이 없는 타입에 대한 특수화와 동일하게 동작하는지 불명확했음 |
동일하게 동작함 |
같이 보기
- 고정 폭 정수 타입
- 산술 타입
- C++ 타입 시스템 개요
- 타입 지원 (기본 타입, RTTI, 타입 특성)
- C 수치 한계 인터페이스