1. 실수형 - float, double
실수형은 float와 double이 있으며, 각 타입의 변수에 저장할 수 있는 값의 범위는 아래와 같다.
자료형 | 저장 가능한 값의 범위 | 크기 | |
bit | byte | ||
float | 1.4E-45 ~ 3.4E38 (1.4×10^-45 ~ 3.4×10^38) | 32 | 4 |
double | 4.9E-324 ~ 1.8E308 (4.9×10^-324 ~ 1.8×10^308) | 64 | 8 |
* float와 double은 양의 범위만 적은 것이며, 음의 범위는 양의 범위에 음수 부호(-)를 붙이면 된다.
float 타입을 기준으로 봤을 때, 표현 범위는 '-3.4 × 10^38 ~ 3.4 × 10^38'이지만, '-1.4 × 10^-45 ~ 1.4 × 10^-45' 범위(0은 제외)의 값은 표현할 수 없다.
실수형은 소수점 수도 표현해야 하므로 '얼마나 큰 값을 표현할 수 있는가' 뿐만 아니라 '얼마나 0에 가깝게 표현할 수 있는가'도 중요하다.
Q. 실수형도 정수형처럼 저장할 수 있는 범위를 넘게 되면 오버플로우가 발생하나요?
실수형에서도 변수의 값이 표현 범위의 최댓값을 벗어나면 '오버플로우'가 발생하는데, 정수형과 달리 실수형에서는 오버플로우가 발생하면 변수의 값은 '무한대(infinity)'가 된다.
그리고 정수형에는 없는 '언더플로우(underflow)'가 있는데, '언더플로우'는 실수형에서 표현할 수 없는 아주 작은 값, 양의 최솟값보다 작은 값이 되는 경우를 말한다. 이때 변수의 값은 0이 된다.
2. 실수형의 저장 방식
실수형은 정수형과 표현 형식이 달라서, 실수형은 값을 부동소수점수(floating-point)의 형태로 저장한다.
부동소수점수는 실수를 '±M×2^E'와 같은 형태로 표현하는 것을 말하며, 부호(Sign), 지수(Exponent), 가수(Mantissa)로 이루어져 있다.
기호 | 의미 | 설명 |
S | 부호(Sign bit) | 0이면 양수, 1이면 음수 |
E | 지수(Exponent) | 부호있는 정수. 지수의 범위는 -127 ~ 128(float), -1023 ~ 1024(double) |
M | 가수(Mantissa) | 실제값을 저장하는 부분. 10진수로 7자리(float), 15자리(double)의 정밀도로 저장 가능 |
float : 1+8+23=32 (4byte) | |||
S(1) | E(8) | M(23) | |
double : 1+11+52=64 (8byte) | |||
S(1) | E(11) | M(52) |
- 정규화하는 방법
1. 변환하고자 하는 숫자에 절댓값 붙이고 2진수로 변환
: 6.25 [10] → 110.01 [2]
2. 1.xxxx 형식으로 바꾸기(=1.M × 2^E)
: 110.01 [2] = 1.1001 × 2^2
3. E에 기저수를 더한 뒤, 2진법으로 변환 [float 기저수 127, double 기저수 1023]
: (float 기준) 129 [10] → 10000001 [2]
4. 부호 'S' + 2진법으로 변환된 지수 'E'+가수 'M'
: (S)0 (E)10000001 (M)10010000000000000000000
참고문헌 : 남궁성(2016), Java의 정석, 도우출판