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 자료형을 사용하는 것이 좋습니다.