자바/기본적인 개념

실수형의 저장 형식과 부동 소수점의 오차

백_곰 2021. 1. 1. 12:09

1. 실수형의 저장 형식

- S는 부호 비트이며, 0이면 양수 1이면 음수를 나타낸다. 또한 양의 실수에서 음의 실수로 변환할 때, 정수형과 달리

'2의 보수법'을 사용하지 않고 그저 부호비트만 바꿔주면 된다.

 

- E는 지수이며, float는 -127 ~ 128, double은 -1023 ~ 1024의 범위를 가진다.

(그러나, 실제로는 숫자 아님(NAN)과 양의 무한대와 음의 무한대를 표현하기 위해 예약되어 있으므로

float는 -126 ~ 127까지의 값을 표현할 수 있다.)

 

- M은 가수이며, 실제 값을 저장하는 부분이다. 또한 float와 double은 각각 정밀도가 다르므로 유의한다.

 

* S와 E, M을 합쳐서 부동소수점의 형태로 저장한다. 그러므로, 값의 범위는

(+-)Mx2^E로 저장이 된다.

 

 

2. 부동 소수점의 오차

- 컴퓨터는 10진수의 값이 아닌 2진수로 저장하기 때문에 10진수로는 유한소수이더라도, 2진수로 변환하면,

무한소수가 되는 경우가 있다. 그래서 이때, 정규화 작업을 한다.

 

 

- 정규화 작업은 2진수로 변환된 실수를 저장할 때 '1.xxx X 2^n'의 형태를 만드는 것을 말한다.

 

 

- 예시) 10진수를 2진수로 바꾸고 정규화를 통해 float 형식으로 변환하기.

(여기서 주의할 점은 실수형의 정밀도의 제한으로 인한 오차가 발생할 수 있다는 것이다.)

(예를 들어, int의 최대값은 약 20억으로 최대 10자리의 정밀도를 요구한다. 그러나 float는 10진수로

약 7자리의 정밀도만 제공하므로, int를 float로 변환할 때 정밀도 차이에 의한 오차가 있음을 알자.)

(f1과 f2의 값이 같음에도 불구하고 다른 결과 값이 나오는 이유는 다음장 '형변환'에서 다룰 것이다.)

(Float.floatToIntBits의 함수는 윗 그림에서 정규화에서 4칸씩 쪼개어 16진수로 표현하는 기능이다.)

수정

 

 

- 예시) float 값을 2진수로 바꾸고 10진수의 값으로 변환하기.

(여기서는 반올림이 발생하지 않는 것을 기억하자.)