[Java의 정석] 실수형 - float, double

말하는 감자·2023년 10월 29일
0

Java의 정석

목록 보기
20/32
post-thumbnail
post-custom-banner

Chapter 02 변수(Varialbe)

4. 기본형(primitive type)

📌 실수형 - float, double

📍 실수형의 범위와 정밀도

실수형은 실수를 저장하기 위한 타입으로 floatdouble, 두 가지가 있으며 각 타입의 변수에 저장할 수 있는 값의 범위는 아래와 같다.
실수형의 범위와 정밀도
위는 '양의 범위'만 적은 것으로, 이 범위에 '-'부호를 붙이면 '음의 범위'가 된다.

float타입의 표현범위는 '-3.4×10^38 ~ 3.4×10^38'이지만, '-1×10^(-45) ~ 1.4×10(-45)'범위(0은 제외)의 값은 표현할 수 없다.
실수형은 소수점수도 표현해야하므로 '얼마나 큰 값을 표현할 수 있는가'뿐만 아니라 '얼마나 0에 가깝게 표현할 수 있는가'도 중요하다.

4 byte의 정수로는 '약 ±2×10^9'의 값밖에 표현할 수 없는데, 어떻게 같은 4 byte로 '±3.4×10^38'과 같이 큰 값을 표현할 수 있는 이유는 값을 저장하는 형식이 다르기 때문이다.

int타입과 float타입의 표현형식
int타입과 float타입의 표현형식을 비교한 것인데, int타입은 '부호와 값', 두 부분으로 이루어져있지만, float타입과 같은 실수형은 '부호(S), 지수(E), 가수(M)', 세 부분으로 이루어져 있다. 즉, '2의 제곱을 곱한 형태(±M×2^E)'로 저장하기 때문에 이렇게 큰 범위의 값을 저장하는 것이 가능한 것이다.

그러나 정수형과 달리 실수형은 오차가 발생할 수 있다는 단점이 있다.
그래서 실수형에는 표현할 수 있는 값의 범위뿐만 아니라 '정밀도(precision)'도 중요한 요소이다.
float타입은 정밀도가 7자리인데, 이것은 'a×10'(1≤a<10)의 형태로 표현된 '7자리의 10진수를 오차없이 저장할 수 있다'는 뜻이다.

1234.567 = 1.234567 × 10³
0.00001234567 = 1.234567 × 10^(-5)
1234567000 = 1.234567 × 10^9

만일 7자리 이상의 정밀도가 필요하다면, 변수의 타입을 double로 해야한다. double타입은 float타입보다 정밀도가 약 2배인, 10진수로 15자리의 정밀도를 가지므로 float타입보다 훨씬 더 정밀하게 표현할 수 있다.

📍 실수형의 저장형식

실수형은 값을 부동소수점수(floating-point)의 형태로 저장한다.
부동소수점수는 실수를 '±M×2^E'와 같은 형태로 표현하는 것을 말하며, 부동소수점수는 부호(Sign), 지수(Exponent), 가수(Mantissa), 모두 세 부분으로 이루어져 있다.

그래서 부동소수점수는 다음과 같이 세 부분으로 나누어 저장된다.

1. 부호(Sign bit)

'S'는 부호비트(Sign bit)를 의미하며 1 bit이다. 이 값이 0이면 양수를, 1이면 음수를 의미한다.
정수형과 달리 '2의 보수법'을 사용하지 않기 때문에 양의 실수를 음의 실수로 바꾸려면 그저 부호비트만 0에서 1로 변경하면 된다.

2. 지수(Exponent)

'E'는 지수를 저장하는 부분으로 float의 경우, 8 bit의 저장공간을 갖는다. 지수는 '부호있는 정수'이고 8 bit로는 모두 2^8(=256)개의 값을 저장할 수 있으므로 '-127~128'의 값이 저장된다.
이 중에서 -127고 128은 '숫자 아님(NaN, Not a Number)'이나 '양의 무한대(POSITIVE INFINITY)', '음의 무한대(NEGATIVE INFINITY)'와 같이 특별한 값의 표현을 위해 예약되어 있으므로 실제로 사용가능한 지수의 범위는 '-126~127'이다.

3. 가수(Mantissa)

'M'은 실제 값인 가수를 저장하는 부분으로 float의 경우, 2진수 23자리를 저장할 수 있다. 2진수 23자리로는 약 7자리의 10진수를 저장할 수 있는데 이것이 바로 float의 정밀도가 된다. double은 가수를 저장할 수 잇는 공간이 52자리로 float보다 약 2배이므로 doublefloat보다 약 2배의 정밀도를 갖는 것이다.


📑 원본 자료

  • Java의 정석(3판) [남궁 성/도우출판/2016]
profile
나는 말하는 감자다
post-custom-banner

0개의 댓글