늦은 프로그래밍 이야기

실수의 표현 방식 본문

내일배움캠프/Java 기초

실수의 표현 방식

한정규 2022. 11. 17. 17:25

실수의 표현 방식

 - 실수를 표현하기 위한 방식

  • 고정 소수점(fixed point) 방식
  • 부동 소수점(floating point) 방식

고정 소수점(fixed point) 방식

 - 정수부와 소수부로 나눈다.

  * 정수부 : 소수점 이하의 수를 뺀 정수 부분.

  * 소수부 : 대소수에서 소수점 오른쪽에 놓인 수의 부분.

 - 소수부의 자릿수를 미리 정하여, 고정된 자릿수의 소수를 표현.

 - 정수부와 소수부의 자릿수가 크지 않으므로, 표현할 수 있는 범위가 매우 적다.

32비트 실수를 고정 소수점 방식으로 표현. 출처 : http://www.tcpschool.com/java/java_datatype_floatingPointNumber


부동 소수점(floating point) 방식

 - 가수부와 지수부로 나눈다.

  * 가수부 : 상용로그의 값에서 0 같거나 0보다 크고 1보다 작은 소수.

  * 지수부 : 부동 소수점 형태로 표현된 숫자에서, 2 거듭제곱을 표시하는 부분.

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

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

 

IEEE 부동 소수점 방식

 - 부동 소수점 방식은 대부분 IEEE 754 표준을 따르고 있다.

32비트의 float형 IEEE 부동 소수점 방식. 출처 : http://www.tcpschool.com/java/java_datatype_floatingPointNumber
64비트의 double형 IEEE 부동 소수점 방식. 출처 : http://www.tcpschool.com/java/java_datatype_floatingPointNumber


부동 소수점 방식의 오차

 - 부동 소수점 방식을 사용하면 고정 소수점 방식보다 훨씬 많은 범위까지 표현할 수 있지만 부동 소수점 방식에 의한 표현은 항상 오차가 존재한다.

 - 오차는 위의 수식에 의해 발생한다.

 - 표현할 수 있는 범위는 늘어나지만, 10진수를 정확하게 표현할 수 없다.

 - 따라서 컴퓨터의 실수 표현 방법은 정확한 표현이 아닌 언제나 근사치를 표현한 것이다.

 

 - 부동 소수점 방식이 실수를 표현할 때 발생할 수 있는 오차.

double num = 0.1;

for(int i = 0; i < 1000; i++) {
    num += 0.1;
}

System.out.print(num);

// 100.09999999999859

 - 0.1을 1000번 곱하면 100이 되어야 하는데, 위 코드에서는 100.09999999999859로 출력되고 있다.

 

 - double형과 float형의 정밀도 차이

float num3 = 1.23456789f; // 1.2345679
double num4 = 1.23456789; // 1.23456789

 - float 타입 : 소수 6자리까지는 정확하게 표현하나, 그 이상은 정확하지 표현하지 못한다.

 - double 타입 : 소수 15자리까지 오차없이 표현할 수 있다.


Comments