표준 라이브러리 헤더 <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>와 함께 확인해요.