Chapter 02 변수(Varialbe)
4. 기본형(primitive type)
실수형은 실수를 저장하기 위한 타입으로 float
와 double
, 두 가지가 있으며 각 타입의 변수에 저장할 수 있는 값의 범위는 아래와 같다.
위는 '양의 범위'만 적은 것으로, 이 범위에 '-'부호를 붙이면 '음의 범위'가 된다.
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
타입과 같은 실수형은 '부호(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), 모두 세 부분으로 이루어져 있다.
그래서 부동소수점수는 다음과 같이 세 부분으로 나누어 저장된다.
'S'는 부호비트(Sign bit)를 의미하며 1 bit이다. 이 값이 0이면 양수를, 1이면 음수를 의미한다.
정수형과 달리 '2의 보수법'을 사용하지 않기 때문에 양의 실수를 음의 실수로 바꾸려면 그저 부호비트만 0에서 1로 변경하면 된다.
'E'는 지수를 저장하는 부분으로 float
의 경우, 8 bit의 저장공간을 갖는다. 지수는 '부호있는 정수'이고 8 bit로는 모두 2^8(=256)개의 값을 저장할 수 있으므로 '-127~128'의 값이 저장된다.
이 중에서 -127고 128은 '숫자 아님(NaN, Not a Number)'이나 '양의 무한대(POSITIVE INFINITY)', '음의 무한대(NEGATIVE INFINITY)'와 같이 특별한 값의 표현을 위해 예약되어 있으므로 실제로 사용가능한 지수의 범위는 '-126~127'이다.
'M'은 실제 값인 가수를 저장하는 부분으로 float
의 경우, 2진수 23자리를 저장할 수 있다. 2진수 23자리로는 약 7자리의 10진수를 저장할 수 있는데 이것이 바로 float
의 정밀도가 된다. double
은 가수를 저장할 수 잇는 공간이 52자리로 float
보다 약 2배이므로 double
이 float
보다 약 2배의 정밀도를 갖는 것이다.
📑 원본 자료
- Java의 정석(3판) [남궁 성/도우출판/2016]