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>::digitsstd::numeric_limits<const int>::digits와 같아요.

std::size_tstd::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 수치 한계 인터페이스

더 알아보기 (Learn more)

cppreference