Floating constant
부동 소수점 타입의 값을 표현식에서 직접 사용할 수 있도록 합니다.
목차 |
구문
부동 소수점 상수는 다음과 같은 형태를 가진 비좌측값 표현식입니다:
| significand exponent (선택사항) suffix (선택사항) | |||||||||
여기서 significand 는 다음과 같은 형태를 가집니다
정수부
(선택사항)
.
(선택사항)
소수부
(선택사항)
|
|||||||||
지수는 다음과 같은 형태를 가집니다
e
|
E
지수-부호
(선택사항)
숫자-시퀀스
|
(1) | ||||||||
p
|
P
지수-부호
(선택사항)
숫자-시퀀스
|
(2) | (C99부터) | |||||||
|
선택적 단일 따옴표(
|
(C23부터) |
설명
|
significand
가 문자 시퀀스
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
타입을 가집니다.
|
구현체가 매크로
10진 부동 소수점 타입에 대한 접미사는 16진 부동 소수점 상수에서는 허용되지 않습니다. |
(C23부터) |
선택적 부분
지수가 존재하고 소수 부분이 사용되지 않는 경우, 소수점 구분자를 생략할 수 있습니다:
double x = 1e0; // 부동 소수점 1.0 (마침표 사용 안 함)
십진 부동 소수점 상수의 경우 exponent 부분은 선택 사항입니다. 생략할 경우 마침표는 생략할 수 없으며, whole-number 또는 fraction 중 하나는 반드시 존재해야 합니다.
double x = 1.; // 부동 소수점 1.0 (소수 부분 선택적) double y = .1; // 부동 소수점 0.1 (정수 부분 선택적)
|
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
|
(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 로 구성될 수 있습니다.
예제
출력:
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++ 문서
참조:
부동 소수점 리터럴
|