..

Search

10) 부동 소수점 수

10) 부동 소수점 수

부동 소수점 수


실수의 표현 방식

컴퓨터에서 실수를 표현하는 방법은 정수에 비해 훨씬 복잡합니다.

왜냐하면, 컴퓨터에서는 실수를 정수와 마찬가지로 2진수로만 표현해야 하기 때문입니다.

따라서 실수를 표현하기 위한 다양한 방법들이 연구되었으며, 현재에는 다음과 같은 방식이 사용되고 있습니다.

 

1. 고정 소수점(fixed point) 방식

2. 부동 소수점(floating point) 방식


고정 소수점(fixed point) 방식

실수는 보통 정수부와 소수부로 나눌 수 있습니다.

따라서 실수를 표현하는 가장 간단한 방식은 소수부의 자릿수를 미리 정하여, 고정된 자릿수의 소수를 표현하는 것입니다.

 

32비트 실수를 고정 소수점 방식으로 표현하면 다음과 같습니다.

 

고정 소수점 방식

 

하지만 이 방식은 정수부와 소수부의 자릿수가 크지 않으므로, 표현할 수 있는 범위가 매우 적다는 단점이 있습니다.


부동 소수점(floating point) 방식

실수는 보통 정수부와 소수부로 나누지만, 가수부와 지수부로 나누어 표현할 수도 있습니다.

부동 소수점 방식은 이렇게 하나의 실수를 가수부와 지수부로 나누어 표현하는 방식입니다.

 

앞서 살펴본 고정 소수점 방식은 제한된 자릿수로 인해 표현할 수 있는 범위가 매우 작습니다.

하지만 부동 소수점 방식은 다음 수식을 이용하여 매우 큰 실수까지도 표현할 수 있습니다.

수식

±(1.가수부)×2지수부-127

 

현재 대부분의 시스템에서는 부동 소수점 방식으로 실수를 표현하고 있습니다.


C++ 부동 소수점 표현 방식

C++에서는 부동 소수점을 다음 두 가지 방식으로 표현할 수 있습니다.

 

1. 3.14, -45.6과 같이 소수 부분을 가지는 아라비아 숫자로 표현합니다.

2. e 또는 E를 사용하여 지수 표기법으로 표현합니다.

 

다음 그림은 C++에서 지수를 표현하는 데 사용되는 E 지수 표기법을 보여주는 그림입니다.


IEEE 부동 소수점 방식

현재 사용되고 있는 부동 소수점 방식은 대부분 IEEE 754 표준을 따르고 있습니다.

 

32비트의 float형 실수를 IEEE 부동 소수점 방식으로 표현하면 다음과 같습니다.

32비트 부동 소수점

 

64비트의 double형 실수를 IEEE 부동 소수점 방식으로 표현하면 다음과 같습니다.

64비트 부동 소수점


부동 소수점 방식의 오차

부동 소수점 방식을 사용하면 고정 소수점 방식보다 훨씬 더 많은 범위까지 표현할 수 있습니다.

하지만 부동 소수점 방식에 의한 실수의 표현은 항상 오차가 존재한다는 단점을 가지고 있습니다.

 

부동 소수점 방식에서의 오차는 앞서 살펴본 공식에 의해 발생합니다.

이 공식을 사용하면 표현할 수 있는 범위는 늘어나지만, 10진수를 정확하게 표현할 수는 없게 됩니다.

따라서 컴퓨터에서 실수를 표현하는 방법은 정확한 표현이 아닌 언제나 근사치를 표현할 뿐임을 항상 명심해야 합니다.

 

다음 예제는 부동 소수점 방식으로 실수를 표현할 때 발생할 수 있는 오차를 보여주는 예제입니다.

예제

int i;

float sum = 0;

 

for (i = 0; i < 1000; i++)

{

    sum += 0.1;

}

 

cout << "0.1을 1000번 더한 합계는 " << sum <<"입니다.";

코딩연습 ▶

실행 결과

0.1을 1000번 더한 합계는 99.999입니다.

 

위의 예제에서 0.1을 1000번 더한 합계는 원래 100이 되어야 하지만, 실제로는 99.999가 출력됩니다.

이처럼 컴퓨터에서 실수를 가지고 수행하는 모든 연산에는 언제나 작은 오차가 존재하게 됩니다.

이것은 C++뿐만 아니라 모든 프로그래밍 언어에서 발생하는 기본적인 문제입니다.


연습문제