실수형 자료형은 C 언어에서 소수점이 포함된 숫자를 다룰 때 사용됩니다. 실수형 데이터 타입은 정수형보다 복잡한 구조를 가지며, 소수점 이하의 값을 정확히 표현하거나, 매우 큰 숫자 또는 작은 숫자를 표현하는 데 적합합니다.
C 언어의 주요 실수형 자료형
1. float : 단정밀도 부동 소수점 (4바이트)
2. double : 배정밀도 부동 소수점 (8바이트)
3. long double : 확장 정밀도 부동 소수점 (보통 8바이트 이상, 시스템에 따라 다름)
실수형 자료형의 특징
실수형 데이터 타입은 부동 소수점(floating-point) 형식을 사용하여 소수점을 포함한 숫자를 표현합니다.
실수는 부호(sign), 지수(exponent), 가수(mantissa)로 구성되어 있으며, 이진수로 변환되어 저장됩니다.
float, double, long double의 차이점
- float : 단정밀도(float)는 4바이트를 사용하며, 소수점 이하 6~7자리까지 정확도를 보장합니다.
- double : 배정밀도(double)는 8바이트를 사용하며, 소수점 이하 15자리까지 정확도를 제공합니다.
- long double : 확장 정밀도(long double)는 보통 10바이트 이상을 사용하며, 더 높은 정확도를 제공합니다.
실수형 자료형 예제
#include <stdio.h>
int main() {
float floatValue = 3.141592f; // 단정밀도 실수
double doubleValue = 3.141592653589793; // 배정밀도 실수
long double longDoubleValue = 3.14159265358979323846L; // 확장 정밀도 실수
printf("float value: %.7f\n", floatValue); // 소수점 이하 7자리까지 출력
printf("double value: %.15f\n", doubleValue); // 소수점 이하 15자리까지 출력
printf("long double value: %.20Lf\n", longDoubleValue); // 소수점 이하 20자리까지 출력
return 0;
}
출력 결과 :
float value: 3.1415927
double value: 3.141592653589793
long double value: 3.14159265358979323846
float 변수는 7자리까지 정확하게 표현되며, 이후 자릿수에서 정확도가 떨어질 수 있습니다.
double 변수는 15자리까지 높은 정확도를 가집니다.
long double 변수는 매우 높은 정확도를 제공합니다. 다만, 실제 크기와 정밀도는 시스템에 따라 다를 수 있습니다.
Floating point
Example : 3.14
실수형의 주의사항: 오차 발생
부동 소수점 표현 방식에서는 정확히 표현할 수 없는 값이 존재할 수 있습니다. 예를 들어, 0.1은 이진수로 정확히 표현할 수 없기 때문에 미세한 오차가 발생할 수 있습니다.
#include <stdio.h>
int main() {
float a = 0.1f;
if (a == 0.1) {
printf("a는 0.1입니다.\n");
} else {
printf("a는 0.1이 아닙니다. a = %.10f\n", a);
}
return 0;
}
출력 결과:
a는 0.1이 아닙니다. a = 0.1000000015
이 예제는 0.1이 정확히 표현되지 않는 것을 보여줍니다. 부동 소수점 연산에서는 이러한 오차를 항상 염두에 두어야 합니다.
부동소수점 상수
#include <stdio.h>
int main(void)
{
float value = 0.1;
double x;
printf("%.20f \n", value); // float는 소수점이하 6자리까지 정확히 표현한다.
// 십진법으로 1/3을 정확히 나타낼수 없는 것 처럼 이진법에서 0.1이 그렇다.
x = (1.0e20 + 5.0)-1.0e20;
printf("%f \n",x); // 부동소수점 연산에서 오차가 발생.
// double이라도 16자리 정도만 잘 처리할 수 있다.
return 0;
}