C & C++

C언어 실수 자료형 정리 : float, double, long double, 부동소수점/형변환

jimmy_AI 2021. 12. 16. 14:25
반응형

C언어 실수형 타입 : float, double, long double

이번 글에서는 C언어와 C++의 실수형 자료 타입인 float, double, long double

자료형에 대해서 살펴보겠습니다.

 

우선, 세 자료형의 바이트 수와 표시 가능 범위는 다음과 같습니다.

(참고로, 실수 자료형에서는 부호가 없는 unsigned 자료형은 미지원합니다.)

 

float : 4 바이트, 대략 10^-38 ~ 10^38 범위 표시 가능

double : 8 바이트, 대략 10^-308 ~ 10^308 범위 표시 가능

long double : 시스템 마다 약간씩 다르지만 8바이트 이상을 사용하고,

double 자료형에 비해 표시 범위가 넓은 편

 

위 세 자료형의 표시 범위를 넘어서 사용할 일은 실제로는 적겠지만,

참고로 알아두시면 좋을 듯 합니다.

 

여기서 이 세 자료형의 차이는 오차 범위가 얼마나 정교하냐의 차이

중점을 두시고 사용하시기를 바라겠습니다.

 

실제로, 부동 소수점 원리에 의하여 실수 값은 정확한 값을 저장하는 것이

불가능한 경우가 많은데, float, double, long double 자료형으로 갈수록

더 적은 오차 범위를 가지고 실제 값을 가질 수 있다는 것을 의미합니다.

 

먼저, 실수형 자료의 저장 원리를 알아보기 위하여 부동 소수점 원리에 대해서

살펴보도록 하겠습니다.

 

부동 소수점 원리 : 0.1 + 0.1은 0.2가 아니다?

컴퓨터에서 실수를 저장하는 방법은 비트 공간을 아래와 같이 사용하는 방식입니다.

float 자료형을 기준으로 가장 앞 1비트는 부호를 나타내는 부호부,

그 다음 8비트 공간은 2의 몇 승인지의 지수를 나타내는 지수부,

뒤의 23비트 공간은 앞에 얼마가 곱해질지를 고르는 가수부입니다.

 

이해하기 쉽게 10비트로 예시를 들어 설명하면

123456789 라는 숫자를 저장한다면, 1.23456789 * 10^8 처럼 값을 저장한다는

의미입니다.

 

이 과정에서 무한 소수 등을 저장하는 과정에서 오류가 발생 가능한데,

예를 들어, 0.3333333... 을 저장해야 한다면 3.33333333 * 10^-1 으로 저장하는

과정에서 저장 공간은 한정되어있기에 소수점 절삭으로 인한 오차가 발생합니다.

 

0.1처럼 간단해보이는 소수도 2진법으로 나타내면 무한 소수이기에,

저장된 값의 오차가 생길 수 있는 것이지요.

더 정교한 자료형을 사용하는 의미는 더 많은 소수점 자릿수를 저장할 수

있다는 의미이고, 오차가 그만큼 줄어들게 되겠지요.

반응형

C언어 실수 자료형 선언 및 출력

이제 C언어에서 실수 자료형을 선언하고 출력하는 예시 코드를 살펴보겠습니다.

#include <stdio.h>

int main(){

// 실수 자료형 선언
float a = 0.1f;
double b = 0.1;
long double c = 0.1l;

// 실수 자료형 출력(기본형)
printf("%f, %f, %Lf\n", a, b, c);

// 실수 자료형 출력(자릿수 지정)
printf("%.10f, %.20f, %.20Lf\n", a, b, c);

}

선언 시에는 float는 숫자 뒤에 f, long double은 숫자 뒤에 l을 붙여서

선언해주는 것을 권장해드립니다.

 

물론, 선언 과정에서는 알파벳을 생략해도 오류가 발생하지는 않으나,

long double c = 0.1 처럼 그냥 선언하면 일반 double 자료형을 선언한 것과

마찬가지인 결과가 나타납니다.

 

자료형을 출력할 때는, float, double은 %.f로 포맷팅하고,

long double 자료형은 %.Lf로 포맷팅 해주셔야 합니다.

이는 특정 소수점 자릿수까지 출력할 때도 마찬가지입니다.

 

위 예시 코드의 출력 결과를 살펴보겠습니다.

확실히 더 정교한 자료형이 실제 값 0.1에 더 근사하게 저장하는 것을

확인해볼 수 있었습니다.

 

C언어 실수 자료형 형변환

마지막으로 실수 자료형의 형변환 관계에 대해서 간단히 살펴보고 마치도록 하겠습니다.

 

float, double, long double 자료형 간의 연산을 수행하면, 더 정교한 자료형으로

자동으로 자료형이 통일됩니다.

예를 들어, float와 double 자료형 사이의 덧셈을 하면 결과는 double형이 되는 식입니다.

 

정수형 자료형은 실수형 자료형과 연산 시 실수형 자료형으로 통일됩니다.

예를 들어, int와 double 자료형 사이의 나눗셈을 하면 결과는 double형으로 반환됩니다.

 

위 과정은 정보의 손실을 최소화하기 위한 자동적인 방식이며,

(double) 처럼 () 안에 자료형을 적는 방식으로 강제 형변환 또한 가능합니다.

 

아래 예시 코드를 살펴보면서 형변환 관계를 이해해보도록 하겠습니다.

#include <stdio.h>

int main(){

int a = 5;
int b = 2;
double c = 2.0;
float d = 2.0f;

int e = a / b; // 5 / 2 = 2, 정수형 자료 연산
double f = a / (double) b; // 5 / 2.0 = 2.5, 강제 형변환
double g = a / c; // 5 / 2.0 = 2.5, 자동 형변환
double h = c + d; // 2.0 + 2.0f = 4.0, 자동 형변환

}

5 / 2 = 2로 몫만 반환되고, 5 / 2.0 = 2.5로 실수형 연산이 된 것에 주목해주시고,

h 변수의 최종 자료형도 double 자료형인 점을 참고해주시면 좋을 듯 합니다.

 

이상으로 C언어 실수 자료형의 원리와 예시에 대해 간략하게 다뤄본 포스팅을

마쳐보도록 하겠습니다. 감사합니다.