Namespaces
Variants

Floating constant

From cppreference.net

부동 소수점 타입의 값을 표현식에서 직접 사용할 수 있도록 합니다.

목차

구문

부동 소수점 상수는 다음과 같은 형태를 가진 비좌측값 표현식입니다:

significand exponent  (선택사항) suffix  (선택사항)

여기서 significand 는 다음과 같은 형태를 가집니다

정수부  (선택사항) . (선택사항) 소수부  (선택사항)

지수는 다음과 같은 형태를 가집니다

e | E 지수-부호  (선택사항) 숫자-시퀀스 (1)
p | P 지수-부호  (선택사항) 숫자-시퀀스 (2) (C99부터)
1) 십진 부동 소수점 상수의 지수 구문
2) 헥사데시멀 부동 소수점 상수에 대한 지수 구문

선택적 단일 따옴표( ' )를 숫자 사이에 구분자로 삽입할 수 있으며, 컴파일 시 무시됩니다.

(C23부터)

설명

significand 가 문자 시퀀스 0x 또는 0X 로 시작하는 경우, 해당 부동 소수점 상수는 16진 부동 소수점 상수 입니다. 그렇지 않으면 10진 부동 소수점 상수 입니다.

16진 부동 소수점 상수 의 경우, significand 는 16진 유리수로 해석되며, 지수의 digit-sequence 는 significand를 스케일링해야 하는 2의 정수 거듭제곱으로 해석됩니다.

double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0
(since C99)

decimal floating constant 의 경우, significand 는 10진 유리수로 해석되며, 지수의 digit-sequence 는 significand에 곱해질 10의 정수 거듭제곱으로 해석됩니다.

double d = 1.2e3; // 10진 분수 1.2에 10^3을 곱한 값, 즉 1200.0

접미사

접미사가 없는 부동 소수점 상수는 double 타입을 가집니다. 만약 suffix 가 문자 f 또는 F 라면, 부동 소수점 상수는 float 타입을 가집니다. 만약 suffix 가 문자 l 또는 L 라면, 부동 소수점 상수는 long double 타입을 가집니다.

구현체가 매크로 __STDC_IEC_60559_BFP__ 를 미리 정의하는 경우, 다음 접미사와 해당 부동 소수점 상수가 추가로 지원됩니다:

  • 접미사 df 또는 DF 인 경우, 부동 소수점 상수의 타입은 _Decimal32 입니다;
  • 접미사 dd 또는 DD 인 경우, 부동 소수점 상수의 타입은 _Decimal64 입니다;
  • 접미사 dl 또는 DL 인 경우, 부동 소수점 상수의 타입은 _Decimal128 입니다.

10진 부동 소수점 타입에 대한 접미사는 16진 부동 소수점 상수에서는 허용되지 않습니다.

(C23부터)

선택적 부분

지수가 존재하고 소수 부분이 사용되지 않는 경우, 소수점 구분자를 생략할 수 있습니다:

double x = 1e0; // 부동 소수점 1.0 (마침표 사용 안 함)

십진 부동 소수점 상수의 경우 exponent 부분은 선택 사항입니다. 생략할 경우 마침표는 생략할 수 없으며, whole-number 또는 fraction 중 하나는 반드시 존재해야 합니다.

double x = 1.; // 부동 소수점 1.0 (소수 부분 선택적)
double y = .1; // 부동 소수점 0.1 (정수 부분 선택적)

16진수 부동 소수점 상수의 경우, 지수 부분은 생략할 수 없습니다. 이는 f 접미사가 16진수 숫자로 오인되는 모호함을 피하기 위함입니다.

(C99부터)

표현 가능한 값

부동 소수점 상수를 평가한 결과는 가장 가까운 표현 가능한 값이거나, 가장 가까운 표현 가능한 값에 인접한 더 크거나 더 작은 표현 가능한 값 중 구현에서 정의하는 방식으로 선택된 값입니다(다시 말해, 번역 중 기본 반올림 방향 은 구현에서 정의됩니다).

동일한 소스 형식을 가진 모든 부동 소수점 상수는 동일한 값과 동일한 내부 형식으로 변환됩니다. 서로 다른 소스 형식의 부동 소수점 상수, 예를 들어 1.23 1.230 는 반드시 동일한 내부 형식과 값으로 변환될 필요는 없습니다.

부동 소수점 상수는 해당 유형으로 표시된 것보다 더 넓은 범위와 정밀도로 변환될 수 있습니다. 이는 FLT_EVAL_METHOD 에 의해 지정됩니다. 예를 들어, 상수 0.1f 는 표현식 내에서 0.1L 인 것처럼 동작할 수 있습니다.

16진수 부동 소수점 상수를 평가한 결과는 FLT_RADIX 가 2인 경우, 부동 소수점 상수로 표현된 정확한 값을 대상 유형으로 올바르게 반올림한 값입니다.

(C99부터)

동일한 수치 값 x 을 가지지만 양자 지수(quantum exponent)가 다른 10진 부동 소수점 타입의 부동 소수점 상수들, 예를 들어 1230 . dd , 1230.0dd , 그리고 1.23e3dd 은 구별 가능한 내부 표현을 가집니다.

10진 부동 소수점 타입의 부동 소수점 상수의 양자 지수(quantum exponent) q 는 가능한 경우 significand 의 마지막 자리 위치에서 1을 나타내는 10 q
방식으로 결정됩니다. 만약 양자 지수 q 와 계수 c=x·10 -q
가 위에서 결정된 대로 부동 소수점 상수의 타입에 정확히 표현될 수 없다면, q 는 타입의 한도 내에서 필요에 따라 증가하고, c 는 이에 상응하여 필요한 반올림과 함께 감소합니다. 이 반올림은 0이나 무한대를 결과로 낳을 수 있습니다. 만약 (반올림이 가능하게 적용된) c q 가 최대값에 도달한 후에도 허용 범위를 벗어난다면, 결과 부동 소수점 상수는 양의 무한대 값을 가집니다.

(C23부터)

참고 사항

부동 소수점 상수가 내부 표현으로 변환될 때는 기본 반올림 방향 정밀도 가 적용되며, #pragma STDC FENV_ACCESS 가 활성화된 경우에도 부동 소수점 예외 가 발생하지 않습니다(문자열의 실행 시간 변환에는 strtod 를 사용할 수 있습니다). 이는 부동 소수점 타입의 산술 상수 표현식 과 다릅니다.

부동 소수점 상수의 문자들은 대소문자를 구분하지 않습니다 , 단 10진 부동 소수점 타입 접미사에서 대문자와 소문자를 동시에 사용할 수 없는 경우는 예외입니다 (since C23) : 0x1 . ep + 3 0X1 . EP + 3 는 동일한 부동 소수점 값 15.0 을 나타냅니다.

setlocale 로 지정된 소수점은 부동 소수점 상수의 구문에 영향을 주지 않습니다: 소수점 문자는 항상 마침표입니다.

정수와 달리, 모든 부동 소수점 값을 십진법 또는 심지어 십육진법 (C99부터) 상수 구문으로 직접 표현할 수는 없습니다 : 매크로 NAN INFINITY 그리고 nan 같은 함수들은 그러한 특수 값들을 생성하는 방법을 제공합니다 (C99부터) . 0x1 . FFFFFEp128f 는 IEEE float NaN으로 보일 수 있지만, 실제로는 해당 형식에서 무한대로 오버플로됩니다.

음수 부동 소수점 상수는 존재하지 않습니다; - 1.2 와 같은 표현식은 부동 소수점 상수 1.2 에 적용된 산술 연산자 단항 마이너스입니다. 특수 값인 음의 영(zero)은 - 0.0 로 구성될 수 있습니다.

예제

#include <stdio.h>
int main(void)
{
    printf("15.0     = %a\n", 15.0);
    printf("0x1.ep+3 = %f\n", 0x1.ep+3);
    // double 타입 범위를 벗어나는 상수들
    printf("+2.0e+308 --> %g\n",  2.0e+308);
    printf("+1.0e-324 --> %g\n",  1.0e-324);
    printf("-1.0e-324 --> %g\n", -1.0e-324);
    printf("-2.0e+308 --> %g\n", -2.0e+308);
}

출력:

15.0     = 0x1.ep+3
0x1.ep+3 = 15.000000
+2.0e+308 --> inf
+1.0e-324 --> 0
-1.0e-324 --> -0
-2.0e+308 --> -inf

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 6.4.4.2 부동 소수점 상수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 6.4.4.2 부동 소수점 상수 (p: 47-48)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.4.4.2 부동 소수점 상수 (p: 65-66)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.4.4.2 부동 소수점 상수 (p: 57-58)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.1.3.1 부동 소수점 상수

참고 항목

C++ 문서 참조: 부동 소수점 리터럴