본문 바로가기

Java/Chapter 02. 변수와 자료형

[Java] 02.03 - 실수 표현 방식 이해하기

들어가며

 실수의 표현 방식을 이해하면
실수를 보다 효율적으로

 그리고 적절히 사용할 수 있다.

 더불어 앞서 제시한 실수의
덧셈에서

 오차가 발생한 이유도 알 수 있다.

 

실수의 표현 방식 - 비하인드

 다음 질문에는 어렵지 않게
대답할 수 있다.

"1과 5사이에 존재하는 정수의 개수는?"

 그러나 다음 질문에는 답하기가
쉽지 않다.

"1과 2사이에 존재하는 실수의 개수는?"

 1과 2 사이에는 무한개의 실수가
존재한다.

 따라서 소수점 이하 자릿수까지
표현해야 하는 실수를

 컴퓨터로 표현하는 데는 한계가
존재한다.

 근데 이게 생각보다 존재감이
엄청나다.

 

실수의 표현 방식 - 타협과 절충

 정수는 오차 없이 표현이 가능하다.

 오차 없이 완벽히 양의 정수와
음의 정수를 표현할 수 있다.

 그러나 오차를 허용하지 않으면서
그 광대한 실수는 표현하는 것은

 불가능하다.

 때문에 다음과 같은 결론에
도달하게 된다.

"정밀도를 낮추고, 표현할 수 있는 값의 범위를 넓히자."

 그렇다면 정밀도만 낮추면,

 즉, 값을 정확히 표현할 수
있는 정도만 낮춘다면,

 실수를 폭넓게 표현할 수 있는가?

 다음 식을 활용하면 충분히
가능해진다.

그림 13 - 실수의 표현 방식

 위의 식은 컴퓨터의 실수 표현을
위해 약속해 놓은

 『IEEE 754』 표준의 이해를 돕기
위한 것이다.

 그리고 자바도 이 표준을 따른다.

 위 식의 em에 적당한 값을
넣어보자.

 예를 들어서, 부호 비트에는
양수를 의미하는 0을,

 e에는 00000을, 그리고 m에는
0000000001을 넣어보자.

 이때 위 식을 통해서 표현되는
값은 다음과 같다.

그림 14 - 실수 표현의 예

 위의 그림을 보면서 이 값이
어느 정도 되는지 감이 오는가?

 대충 써보자면 다음과 같다.

 표현할 수 있는 값의 범위가
매우 넓어졌음을 알 수 있다.

 하지만 분명한 단점도 존재한다.

 이러한 표현 방식으로는 위의
숫자 6.46521893 보다

 아주 조금 작거나 큰 수를
표현하지 못한다.

 이는 m이 1 증가할 때, 전체
값이 얼마나 크게 변경되는지,

 그리고 e가 1 증가할 때, 전체
값이 얼마나 크게 변경되는지를

 확인하면 쉽게 이해할 수 있다.

 즉, 표현할 수 있는 값의 범위는
넓어졌지만

 상대적으로 표현하는 대부분의
값에는

 오차가 존재하게 되었다.

 따라서 다음과 같은 문장을
구성하면,

double num1 = 1.0000001;
double num2 = 2.0000001;

 [그림 14]의 식을 이용하여,

 명시된 수에 최대한 가까운
수가 만들어지도록

 비트의 열이 구성되어,
num1과 num2에 저장된다.

 때문에 실수에는 항상 오차가
존재한다고 보아야 한다.


참고 및 출처

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기