표준 라이브러리 헤더 <float.h>
표준 라이브러리 헤더 <float.h>
부동소수점 타입(float, double, long double)은 얼마나 큰 값을 표현할 수 있고, 정밀도는 어느 정도일까요? 이건 표준이 정해 주는 게 아니라 실행되는 하드웨어에 따라 달라져요. 그래서 코드가 "이 장비에서는 이 타입의 최댓값이 얼마이고 정밀도가 몇 자리인가"를 알아야 할 때가 있어요. <float.h>는 타입 지원 라이브러리의 수치 한계 인터페이스로, 부동소수점 타입의 특성·한계를 알려주는 매크로를 정의해요.
출처: cppreference
본문
매크로
특성(Characteristics)
| 매크로 | 설명 |
|---|---|
__STDC_VERSION_FLOAT_H__ |
(C23) 202311L로 확장 |
FLT_ROUNDS |
부동소수점 연산의 기본 반올림 모드 |
FLT_EVAL_METHOD |
(C99) 모든 산술 연산이 어떤 정밀도로 수행되는지 지정 |
FLT_HAS_SUBNORM / DBL_HAS_SUBNORM / LDBL_HAS_SUBNORM |
(C11)(C23에서 폐기) 타입이 비정규(subnormal/denormal) 수를 지원하는지 지정: -1은 판별 불가, 0은 없음, 1은 있음 |
FLT_RADIX |
세 부동소수점 타입 모두가 사용하는 밑(기수) |
FLT_MANT_DIG / DBL_MANT_DIG / LDBL_MANT_DIG |
정밀도 손실 없이 표현 가능한 FLT_RADIX 자리 수 (각 타입별) |
FLT_DECIMAL_DIG / DBL_DECIMAL_DIG / LDBL_DECIMAL_DIG |
(C11) 이 자릿수 이상의 10진수로 변환했다가 다시 돌아오면 값이 그대로 보존됨. 직렬화/역직렬화에 필요한 10진 정밀도 |
DECIMAL_DIG |
(C99)(C23에서 폐기) long double 직렬화에 필요한 10진 정밀도 |
CR_DECIMAL_DIG |
(C23) 지원되는 모든 IEC 60559 이진 부동소수점 타입과 이 유효숫자 자릿수 이하의 문자 시퀀스 간 변환이 올바르게 반올림됨 |
FLT_IS_IEC_60559 / DBL_IS_IEC_60559 / LDBL_IS_IEC_60559 |
(C23) 타입이 IEC 60559 형식의 정밀도·지수 범위를 가지는지 지정 |
FLT_DIG / DBL_DIG / LDBL_DIG |
반올림·넘침으로 인한 변경 없이 텍스트 → 부동소수점 → 텍스트 왕복이 보장되는 10진 자릿수 |
FLT_MIN_EXP / DBL_MIN_EXP / LDBL_MIN_EXP |
그 정수보다 1 작은 거듭제곱이 정규화된 값을 만드는 최소 음의 정수 |
FLT_MIN_10_EXP / DBL_MIN_10_EXP / LDBL_MIN_10_EXP |
10의 그 거듭제곱이 정규화된 값을 만드는 최소 음의 정수 |
FLT_MAX_EXP / DBL_MAX_EXP / LDBL_MAX_EXP |
그 정수보다 1 작은 거듭제곱이 유한 값을 만드는 최대 양의 정수 |
FLT_MAX_10_EXP / DBL_MAX_10_EXP / LDBL_MAX_10_EXP |
10의 그 거듭제곱이 유한 값을 만드는 최대 양의 정수 |
FLT_MAX / DBL_MAX / LDBL_MAX |
각 타입의 최대 유한 값 |
FLT_NORM_MAX / DBL_NORM_MAX / LDBL_NORM_MAX |
(C23) 각 타입의 최대 정규화 값 |
FLT_EPSILON / DBL_EPSILON / LDBL_EPSILON |
1.0과 그 다음 표현 가능한 값 사이의 차이 |
FLT_MIN / DBL_MIN / LDBL_MIN |
각 타입의 최소 정규화 양수 값 |
FLT_TRUE_MIN / DBL_TRUE_MIN / LDBL_TRUE_MIN |
(C11) 각 타입의 최소 양수 값 |
특수 값(Special values, C23부터)
| 매크로 | 설명 |
|---|---|
INFINITY |
(C99) 양의 무한대(존재하면)로 평가 |
NAN |
(C99) float 타입의 조용한 NaN(존재하면)으로 평가 |
FLT_SNAN / DBL_SNAN / LDBL_SNAN |
(C23) 각 타입의 신호 NaN(존재하면)으로 평가 |
시그니처(Synopsis)
#define FLT_ROUNDS /* see definition */
#define FLT_EVAL_METHOD /* see definition */
#define FLT_HAS_SUBNORM /* see definition */
#define DBL_HAS_SUBNORM /* see definition */
#define LDBL_HAS_SUBNORM /* see definition */
#define FLT_RADIX /* see definition */
#define FLT_MANT_DIG /* see definition */
#define DBL_MANT_DIG /* see definition */
#define LDBL_MANT_DIG /* see definition */
#define FLT_DECIMAL_DIG /* see definition */
#define DBL_DECIMAL_DIG /* see definition */
#define LDBL_DECIMAL_DIG /* see definition */
#define DECIMAL_DIG /* see definition */
#define FLT_DIG /* see definition */
#define DBL_DIG /* see definition */
#define LDBL_DIG /* see definition */
#define FLT_MIN_EXP /* see definition */
#define DBL_MIN_EXP /* see definition */
#define LDBL_MIN_EXP /* see definition */
#define FLT_MIN_10_EXP /* see definition */
#define DBL_MIN_10_EXP /* see definition */
#define LDBL_MIN_10_EXP /* see definition */
#define FLT_MAX_EXP /* see definition */
#define DBL_MAX_EXP /* see definition */
#define LDBL_MAX_EXP /* see definition */
#define FLT_MAX_10_EXP /* see definition */
#define DBL_MAX_10_EXP /* see definition */
#define LDBL_MAX_10_EXP /* see definition */
#define FLT_MAX /* see definition */
#define DBL_MAX /* see definition */
#define LDBL_MAX /* see definition */
#define FLT_EPSILON /* see definition */
#define DBL_EPSILON /* see definition */
#define LDBL_EPSILON /* see definition */
#define FLT_MIN /* see definition */
#define DBL_MIN /* see definition */
#define LDBL_MIN /* see definition */
#define FLT_TRUE_MIN /* see definition */
#define DBL_TRUE_MIN /* see definition */
#define LDBL_TRUE_MIN /* see definition */
#define INFINITY /* see definition */
#define NAN /* see definition */
#define FLT_SNAN /* see definition */
#define DBL_SNAN /* see definition */
#define LDBL_SNAN /* see definition */
대부분의 매크로가 FLT_/DBL_/LDBL_ 접두사로 세 타입을 각각 다뤄요. 부동소수점 값 크기에 의존하는 코드를 짤 때 이 매크로를 쓰면, 어떤 하드웨어에서 컴파일해도 안전한 기준값을 얻을 수 있어요.
더 알아보기
- 정수 타입의 한계를 알고 싶다면
<limits.h>를 봐요. - 타입 지원 라이브러리 전반은
<stdint.h>와 함께 확인해요.