std:: numeric_limits
|
헤더 파일에 정의됨
<limits>
|
||
|
template
<
class
T
>
class
numeric_limits
;
|
||
std::numeric_limits
클래스 템플릿은 산술 타입의 다양한 속성을 조회하기 위한 표준화된 방법을 제공합니다 (예:
int
타입의 가능한 최댓값은
std
::
numeric_limits
<
int
>
::
max
(
)
).
이 정보는
std::numeric_limits
템플릿의 특수화를 통해 제공됩니다.
표준 라이브러리
는 모든 산술 타입에 대한 특수화를 사용 가능하게 합니다 (cv-unqualified 산술 타입에 대한 특수화만 목록으로 표시):
|
헤더 파일에 정의됨
<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
특수화의 각 멤버 값은 비한정 타입
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 는 특수화를 가지고 있지 않습니다.
|
구현체가
정수형 타입
을 정의하는 경우,
|
(C++20부터) |
구현체들은 구현별 타입에 대해
std::numeric_limits
의 특수화를 제공할 수 있습니다: 예를 들어 GCC는
std::numeric_limits<__int128>
을 제공합니다. 비표준 라이브러리들은 라이브러리 제공 타입에 대해
특수화를 추가
할 수 있으며, 예를 들어
OpenEXR
은 16비트 부동소수점 타입을 위한
std::numeric_limits<half>
를 제공합니다.
목차 |
템플릿 매개변수
| T | - | 수치 속성을 검색할 타입 |
멤버 상수
|
[static]
|
std::numeric_limits
가 특수화된 타입들을 식별함
(public static member constant) |
|
[static]
|
부호 있는 타입을 식별함
(public static member constant) |
|
[static]
|
정수형 타입을 식별함
(public static member constant) |
|
[static]
|
정확한 타입을 식별합니다
(public static member constant) |
|
[static]
|
"양의 무한대" 특수 값을 표현할 수 있는 부동소수점 타입을 식별함
(public static member constant) |
|
[static]
|
부동 소수점 타입이 특수 값 "quiet not-a-number"(NaN)을 표현할 수 있는지 식별합니다
(public static member constant) |
|
[static]
|
부동소수점 타입이 특수 값 "신호 전달 NaN(Not-a-Number)"을 표현할 수 있는지 식별합니다
(public static member constant) |
|
[static]
|
부동소수점 타입이 사용하는 비정규화(denormalization) 스타일을 식별합니다
(public static member constant) |
|
[static]
|
정밀도 손실을 부정확한 결과가 아닌 비정규화 손실로 감지하는 부동소수점 타입을 식별합니다
(public static member constant) |
|
[static]
|
해당 타입이 사용하는 반올림 스타일을 식별합니다
(public static member constant) |
|
[static]
|
IEC 559/IEEE 754 부동소수점 타입을 식별합니다
(public static member constant) |
|
[static]
|
유한한 값들의 집합을 나타내는 타입들을 식별합니다
(public static member constant) |
|
[static]
|
모듈로 연산으로 오버플로우를 처리하는 타입을 식별합니다
(public static member constant) |
|
[static]
|
변경 없이 표현 가능한
radix
자릿수
(public static member constant) |
|
[static]
|
변경 없이 표현할 수 있는 십진수 자릿수
(public static member constant) |
|
[static]
(C++11)
|
이 타입의 모든 값을 구별하는 데 필요한 십진수 자릿수
(public static member constant) |
|
[static]
|
주어진 타입의 표현에 사용되는 기수 또는 정수 베이스
(public static member constant) |
|
[static]
|
기수의 유효한 정규화된 부동 소수점 값인 가장 작은 음의 거듭제곱보다 1 더 큰 값
(public static member constant) |
|
[static]
|
유효한 정규화된 부동소수점 값인 10의 가장 작은 음의 지수
(public static member constant) |
|
[static]
|
유효한 유한 부동소수점 값인 기수의 가장 큰 정수 거듭제곱보다 1 큰 값
(public static member constant) |
|
[static]
|
유효한 유한 부동소수점 값인 10의 가장 큰 정수 거듭제곱
(public static member constant) |
|
[static]
|
산술 연산이 트랩(trap)을 발생시킬 수 있는 타입들을 식별합니다
(public static member constant) |
|
[static]
|
반올림 전에 아주 작은 값을 감지하는 부동소수점 타입을 식별합니다
(public static member constant) |
멤버 함수
|
[static]
|
주어진 비부동소수점 타입의 가장 작은 유한값, 또는 주어진 부동소수점 타입의 가장 작은 양의 정규값을 반환합니다
(public static member function) |
|
[static]
(C++11)
|
주어진 타입의 가장 낮은 유한값을 반환합니다. 즉, 부호 있는 타입의 경우 가장 음의 값,
0
부호 없는 타입의 경우 0입니다
(public static member function) |
|
[static]
|
주어진 타입의 가장 큰 유한값을 반환합니다
(public static member function) |
|
[static]
|
1.0
과 주어진 부동소수점 타입의 다음 표현 가능한 값 사이의 차이를 반환합니다
(public static member function) |
|
[static]
|
주어진 부동소수점 타입의 최대 반올림 오차를 반환합니다
(public static member function) |
|
[static]
|
주어진 부동소수점 타입의 양의 무한대 값을 반환합니다
(public static member function) |
|
[static]
|
주어진 부동소수점 타입의 quiet NaN 값을 반환합니다
(public static member function) |
|
[static]
|
주어진 부동소수점 타입의 signaling NaN 값을 반환합니다
(public static member function) |
|
[static]
|
주어진 부동소수점 타입의 가장 작은 양의 비정규값을 반환합니다
(public static member function) |
헬퍼 클래스
|
부동소수점 반올림 모드를 나타냄
(enum) |
|
|
부동소수점 비정규화 모드를 나타냄
(enum) |
C 라이브러리 매크로 상수와의 관계
특수화
std::numeric_limits<T>
여기서
T
는
|
멤버 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min()
|
lowest()
(C++11) |
max()
|
radix
|
||||||||
| bool | false | false | true | 2 | |||||||
| char | CHAR_MIN | CHAR_MIN | CHAR_MAX | 2 | |||||||
| signed char | SCHAR_MIN | SCHAR_MIN | SCHAR_MAX | 2 | |||||||
| unsigned char | 0 | 0 | UCHAR_MAX | 2 | |||||||
| wchar_t | WCHAR_MIN | WCHAR_MIN | WCHAR_MAX | 2 | |||||||
| char8_t | 0 | 0 | UCHAR_MAX | 2 | |||||||
| char16_t | 0 | 0 | UINT_LEAST16_MAX | 2 | |||||||
| char32_t | 0 | 0 | UINT_LEAST32_MAX | 2 | |||||||
| short | SHRT_MIN | SHRT_MIN | SHRT_MAX | 2 | |||||||
| signed short | |||||||||||
| unsigned short | 0 | 0 | USHRT_MAX | 2 | |||||||
| int | INT_MIN | INT_MIN | INT_MAX | 2 | |||||||
| signed int | |||||||||||
| unsigned int | 0 | 0 | UINT_MAX | 2 | |||||||
| long | LONG_MIN | LONG_MIN | LONG_MAX | 2 | |||||||
| signed long | |||||||||||
| unsigned long | 0 | 0 | ULONG_MAX | 2 | |||||||
| long long | LLONG_MIN | LLONG_MIN | LLONG_MAX | 2 | |||||||
| signed long long | |||||||||||
| unsigned long long | 0 | 0 | ULLONG_MAX | 2 | |||||||
전문화
std::numeric_limits<T>
여기서
T
는
|
멤버 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
denorm_min()
|
min()
|
lowest()
(C++11) |
max()
|
epsilon()
|
digits
|
digits10
|
|||||
| float | FLT_TRUE_MIN | FLT_MIN | - FLT_MAX | FLT_MAX | FLT_EPSILON | FLT_MANT_DIG | FLT_DIG | ||||
| double | DBL_TRUE_MIN | DBL_MIN | - DBL_MAX | DBL_MAX | DBL_EPSILON | DBL_MANT_DIG | DBL_DIG | ||||
| long double | LDBL_TRUE_MIN | LDBL_MIN | - LDBL_MAX | LDBL_MAX | LDBL_EPSILON | LDBL_MANT_DIG | LDBL_DIG | ||||
특수화
std::numeric_limits<T>
여기서
T
는
|
멤버 (계속) | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
min_exponent
|
min_exponent10
|
max_exponent
|
max_exponent10
|
radix
|
|||||||
| float | FLT_MIN_EXP | FLT_MIN_10_EXP | FLT_MAX_EXP | FLT_MAX_10_EXP | FLT_RADIX | ||||||
| double | DBL_MIN_EXP | DBL_MIN_10_EXP | DBL_MAX_EXP | DBL_MAX_10_EXP | FLT_RADIX | ||||||
| long double | LDBL_MIN_EXP | LDBL_MIN_10_EXP | LDBL_MAX_EXP | LDBL_MAX_10_EXP | FLT_RADIX | ||||||
예제
#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-비한정 타입에 대한 해당 특수화와 동일하게 동작하는지 불분명했음 |
동일한
동작을 가짐 |