인프런 커뮤니티 질문&답변

양주원님의 프로필 이미지
양주원

작성한 질문수

홍정모의 따라하며 배우는 C언어

3.11 부동소수점형

float f5, double d5

작성

·

144

1

16진수 0x1.1p1에서 0xb.ap1로 바뀌는 게 대응하는 문자라서 그런 건가요? 같은 1인데 왜 바뀌는 문자가 다른지 모르겠어요.

f5와 d5를 출력할 때 %a는 정수 출력할 때 %d와 똑같은 역할인가요?

그리고 f5와 d5를 출력했을 때 나오는 수를 어떻게 해석하는 건지 잘 모르겠습니다.

 

답변 1

1

안녕하세요, 질문&답변 도우미 Soobak 입니다.

 

강의 21:34 부분에서 float f5 = 0x1.1p1;float f5 = 0xb.ap1 으로 변경하는 부분은,
C언어에서 부동소수점 숫자의 16진수 표기 이해를 위한 예시입니다.
즉, 같은 1을 다른 문자로 바꾸는 것이 아니라, 16진수 표기법으로 '숫자' 가 아닌 '문자' 로도 값을 표현할 수 있는 것에 대한 예시를 들어주신 것입니다.

 

덧붙여 설명드리면, 16진수 부동소수점 표현 방식은 접두사 0x 로 시작하여, 16진수 숫자(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f) 가 오고, p 또는 P 로 '지수' 부분이 시작됩니다.
이 때, 지수 부분은 2 의 거듭제곱을 의미합니다.
예를 들어, 0x1.1p 은 16진수 1.12의 1승 을 곱한 값으로, 10진수로는 1.0625 * 2 ^ 1 = 2.125 가 됩니다.
(당연히 아직 익숙하지 않은 내용이실 것이므로, 가볍게 들어만 두시고 편하게 이어서 진도를 나아가시는 것을 개인적으로 권장 드립니다.)

int main()
{
  float f5 = 0x1.1p1;
  printf("\n");
  printf("f5 출력 결과 : %f\n", f5);
  printf("\n");

  return 0;
}

image

%a 에 대해 이해하신 내용도 맞습니다.
printf() 함수에는 '형식 지정자' 라는 것이 존재하는데요, 변수의 자료형과 출력하려는 '형식' 따라서 다양한 형식 지정자들이 존재합니다.
이 때, %a 는 '부동소수점 수' 를 '16진수' 형태로 출력하는 데 사용되는 형식지정자 입니다.
질문자님께서 말씀해주신 %d 역시 '정수' 를 '10진수' 형태로 출력하기 위해 사용하는 형식지정자 입니다.

즉, 둘은 printf() 함수에서 '형식 지정자' 라는 같은 역할을 합니다.

 

이어서, f5d5 를 출력할 때, %a 를 사용하면 해당 값들이 '부동 소수점 수' 로 해석되어 '16진수' 형태로 출력됩니다.
출력 결과는 위에서 설명드린 것과 같습니다.
0x 다음은 부동소수점 수의 가수부, p 다음은 '2 의 거듭제곱 지수' 를 나타냅니다.

양주원님의 프로필 이미지
양주원

작성한 질문수

질문하기