티스토리 뷰

Table of Contents


선언

서식 문자

실수 오차

표현 범위




1. 선언


 이전 글에서 나온 정수형 변수는 정수만을 저장하기 위해 만들어진 변수형입니다. 따라서 정수가 아닌 0.4, 2.6 같은 수는 저장할 수 없다는 문제가 있습니다. 아래의 프로그램을 돌려보면 소수점 이하의 숫자는 버려지는 걸 확인하실 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
//code by RiKang, weeklyps.com
#include <stdio.h>
 
int main(void) {
    int a, b;
    a=0.4;
    printf("%d\n",a);
    b=2.6;
    printf("%d\n",b);
    return 0;
}
cs


 따라서 정수형 변수와는 별개로, 이러한 소수들을 저장하기 위한 실수형 변수가 존재합니다. 자주 사용되는 실수형 변수로는 float 와 double이 있으며 아래와 같이 선언할 수 있습니다.


1
2
3
4
5
6
7
#include <stdio.h>
 
int main(void) {
    float f=1.232;
    double d=2.543;
    return 0;
}
cs


 float 와 double 의 가장 큰 차이점은 float 의 용량은 4 byte이고, double 의 용량은 8 byte 라는 점입니다.




2. 서식 문자


 float 의 서식 문자는 %f, double 의 서식 문자는 %lf 입니다. 
따라서 아래와 같이 기본 입출력을 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void) {
    float f;
    double d;
    scanf("%f",&f);
    scanf("%lf",&d);
    printf("%f\n",f);
    printf("%lf",d);
    return 0;
}
cs


 위 프로그램을 돌렸을 경우, 대부분의 컴파일러에서는 소숫점 6째 자리까지 출력해 줍니다. 하지만 실수형 변수는 출력할 때, 소수점 아래로 어디까지 출력해야 하는 지 정해 줘야할 때가 있습니다. 그럴 땐 %.숫자f 의 형식을 맞춰 주면, 원하는 대로 출력할 수 있으며 그 아래는 반올림 처리가 됩니다. 직접 코딩하고 실행해 보는 것이 이해가 빠릅니다.



 double도 같은 형식입니다.





3. 실수 오차


 실수형 변수의 저장도 정수형 변수와 같이 이진수를 활용하는 방식입니다. 하지만 정수형 변수와 달리 정확한 값을 저장하지는 않습니다. 소수를 출력할 때, 아래와 같이 길게 출력해 보면 부정확한 값이 나옴을 알 수 있습니다.



 이는 이진수 4 byte 와 8 byte로 실수를 표현해야 하는 실수형 변수의 한계입니다. 실수를 표현하기 위해 부동 소수점 방식을 사용하는 C언어에서는 이 오차를 해결할 방법이 딱히 없습니다. 단, float 의 경우엔 앞의 6자리, double의 경우엔 앞의 15자리 만큼은 오차가 나지 않도록 한다는 약속이 있으므로 그 부분은 신뢰할 수 있습니다.


 이 오차에 대해선 유념해 두는 것이 좋습니다. 오차를 최대한 줄이는 게 중요한 경우에는 유리수를 처리할 때 실수형 변수가 아니라 (정수형 변수 / 정수형 변수)의 형태로 저장하는 스킬도 존재합니다. 예를 들어 0.5를 저장할 때 float a = 0.5; 가 아니라, int bunja = 1, bunmo = 2; 이런 식으로 1/2를 저장하는 방식입니다.




4. 표현 범위


 float 와 double 이 표현할 수 있는 양수의 범위는 대략 다음과 같습니다.


타입

용량

범위

정밀도

float

4 byte

1.2E-38 ~ 3.4E+38

6 자리

double

8 byte

2.3E-308 ~ 1.7E+308

15 자리


 실수형 변수를 저장하는 방식인 부동 소수점 방식의 특성상, 4 byte 이더라도 2^32 보다 큰 수를 저장할 수 있습니다. 단, 앞의 6자리(float의 경우)를 제외한 숫자들은 정확하지 않고 오차가 존재할 수 있습니다.