Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 컴파일러에서 부동 소수점(float)은 어떻게 저장될까?

C 프로그래밍 언어에서 float는 부동 소수점(floating point)을 줄여서 부르는 이름입니다. 부동 소수점 숫자는 일반적으로 IEEE(Institute of Electrical and Electronics Engineers, 전기전자공학회)에서 정의한 표준 형식에 따라 메모리에 저장됩니다.

부동 소수점의 저장 방식

  • 부동 소수점 숫자는 일반적으로 IEEE 형식으로 표현됩니다.
  • IEEE 형식은 부호 비트(sign bit), 가수(mantissa), 지수(exponent) 세 부분으로 구성되며, 이를 통해 2의 거듭제곱 형태로 실수를 나타냅니다.
  • 부호 비트는 숫자의 부호를 나타냅니다. 0이면 양수, 1이면 음수를 의미합니다.
  • 가수는 정규화(normalization) 과정을 거친 후 이진수로 변환되어 저장됩니다. 정규화가 완료되면 가수의 최상위 자릿수는 항상 1이 됩니다.
  • 지수는 양의 정수인 바이어스(bias)를 더한 뒤 부호 없는(unsigned) 이진수 형식으로 저장됩니다.
  • 이러한 방식 덕분에 저장되는 지수 값은 항상 양수가 됩니다.
  • float의 바이어스는 127이고, double의 바이어스는 1023입니다.

예제 1: 소수 넷째 자리까지 반올림하기

다음은 C 언어에서 부동 소수점 숫자를 소수 넷째 자리까지 반올림하여 출력하는 프로그램입니다.

#include <stdio.h>
int main(){
    float var = 37.66666;
    printf("%.4f", var); // 소수 넷째 자리까지 반올림
    return 0;
}

출력 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

37.6667

예제 2: 소수 여덟째 자리까지 출력하기

다음은 부동 소수점 숫자를 소수 여덟째 자리까지 출력하는 프로그램입니다.

#include <stdio.h>
int main(){
    float var = 78.67;
    printf("%.8f", var);
    return 0;
}

출력 결과

78.66999817

왜 78.67이 78.66999817로 출력될까?

78.67을 저장했는데 결과가 78.66999817로 출력된 이유는 float 자료형의 정밀도 한계 때문입니다. float는 32비트로 구성되어 있으며 약 7자리의 유효 숫자만 정확하게 표현할 수 있습니다. 또한 10진수 소수인 78.67은 이진수로 정확하게 표현할 수 없기 때문에, 가장 가까운 이진수 값으로 근사되어 저장됩니다. 따라서 소수점 아래 여덟째 자리까지 출력하면 이러한 미세한 오차가 그대로 드러나게 됩니다. 더 높은 정밀도가 필요하다면 double 자료형을 사용하는 것이 좋습니다.