• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

5-11 형변환 질문

23.07.06 11:53 작성 조회수 175

1

안녕하세요! 형변환 공부 중 예상치 못한 결과가 나와서 질문드립니다.

11행의 float 자료형을 갖는 변수 f에 double 표현식의 값이 들어갔습니다.

그래서 '분명 표현식의 값이 커지면 절삭되겠군?' 이라는 생각을 갖고, 변수 d와 비교하며 그 값을 크게 설정했습니다.

그런데 그 크기를 늘리니 둘 다 똑같은 값이 절삭되어 나오는 것 같습니다.

왜 이런 현상이 일어났는지 설명해주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.07.06

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

우선, float 자료형과 double 자료형은 둘 다 실수를 표현하기 위해 사용되지만,
float 자료형은 일반적으로 4 바이트의 메모리를 사용하고, double 자료형은 일반적으로 8 바이트의 메모리를 사용합니다.
따라서, float 자료형은 일반적으로 대략 7 자리의 정밀도를 가지며, double 자료형은 일반적으로 대략 15 ~ 16 자리의 정밀도를 가집니다.

따라서, printf() 함수에서 소수점 아래 8 자리까지 출력하도록 설정하신 후 결과를 확인해보시면 두 값이 다른 것을 확인하실 수 있으실 겁니다.

  • 동일한 값의 소수점 아래 8 자리 까지의 출력 결과

    image

또한, C 언어의 형변환 규칙에 따라서 f + 1.23411111 에서 floatfdouble1.23411111 의 연산이 일어나면, 컴파일러는 더 높은 정밀도를 가진 형태로 현변환을 진행하게 됩니다.
따라서, f + 1.23411111 의 결과는 실제로 double 형태로 계산이 된 후, 그 결과가 다시 floatf 에 저장될 때, float 의 정밀도에 맞게 절삭되어 저장됩니다.

이재완님의 프로필

이재완

질문자

2023.07.06

선생님의 설명은 잘 이해가 됐습니다!

그런데 다시 코드를 입력해도

image이렇게 출력이 되는데, 제가 무언가 잘 못한걸까요? ㅜㅜ..

Soobak님의 프로필

Soobak

2023.07.06

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

printf() 소수점 아래 8 자리까지 출력하기 위해서는 변환 지정자의 수식어 .를 사용해야 합니다.
관련 내용은 강의 4.8 변환 지정자의 수식어들 을 참고하시면 도움이 되실 것 같습니다.

우선은, 간단한 예제 코드를 첨부드리오니, 한 번 컴파일 후 실행해보시길 바랍니다.
만약, 계속 막히시거나 궁금하신 점이 있으시면 편하게 댓글 남겨주세요.

#include <stdio.h>

int main()
{
  double d = 0;
  float f = 3.0f;

  d = f + 1.23411111;
  f = f + 1.23411111;

  printf("%.8f\n", d);
  printf("%.8f\n", f);

  return 0;
}