[F-Lab 모각코 챌린지 9일차] 자바가 실수를 다루는 법-1 (float, double)
TIL
- 실수 타입 타입
- float과 double 차이점
- 지수표기법
- 실수 정밀도
- 실수의 오버플로우 / 언더플로우
- 자바가 실수를 저장하는 방식
- 고정소수점
- 부동소수점
자바의 실수 타입
float / double 차이점 | float | double |
---|---|---|
범위 | 1.4E-45 ~ 3.4E38(양수범위) | 4.9E-324 ~ 1.8E308(양수범위) |
정밀도 | 7자리 | 15자리 |
크기 | 32bit (4byte) | 64bit (8byte) |
비고 | float 변수에 값을 대입할 때는 F(혹은 f) 접미사를 꼭 붙여주어야 한다. |
컴퓨터의 메모리는 한정적이기 때문에 실수의 소숫점을 표현할 수 있는 수의 제한이 있다.
표현할 수 있는 수의 제한 때문에 값이 부정확할 확률이 있고 이를 최소화 하기위해 소수를 이진법으로 표현할 때, 부동소수점 방식을 사용한다.
부동소수점 방식을 사용하면 큰 범위의 실수까지 정밀하게 표현할 수 있지만 완전 정확하게 표현하는 것은 아니다.
이래나 저래나 소수 연산에 있어서 오차가 필연적으로 발생한다.
지수(e) 표기법
// float, double 범위 작성할 때, 헷갈려서;
double d = 1.234e2; // 1.234 x 10^2 = 123.4
double d2 = 1.7e+3; // 1.7 x 10^3 = 1700.0
double d3 = 1.7e-3; // 1.7 x 10^-3 = 0.0017
지수 표기법은 아주 큰 숫자나 아주 작은 숫자를 간단하게 표기할 때 사용되는 표기법이다. 길다란 실수를 나타낼 때, 자릿수를 줄여 간단하게 표현해준다.
실수의 정밀도
실수의 정밀도는 유효 자릿수를 뜻한다. 유효 자릿수란 좌측부터의 숫자 갯수를 의미한다.
float 타입의 유효 자릿수는 7자리(10진수로), double 타입의 유효 자릿수는 15자리까지다.(10진수로)
예를 들어, 12.3456789025
이 실수의 유효 자릿수(flaot 타입)를 표시해보면 12.3456789025
이다.
이와 같이 유효 자릿수가 정해진 이유는 부동소수점 방식의 가수부를 표현할 수 있는 수의 크기에 따라 결정되기 때문이다.
만약 정확한 실수의 정밀도가 필요하다면 실수를 표현할 때 double 타입을 사용하면 된다.
double 타입이 float 타입보다 정밀도가 약 2배이기 때문이다.
실수 오버플로우 / 언더플로우
실수 값이 각 타입의 표현범위 최댓값을 벗어나면 오버플로우가 발생한다.
단, 정수형과 달리 실수형에서는 오버플로우가 발생하면 그 값은 무한대가 된다.
언더플로우는 실수형으로 표현할 수 없는 아주 작은 값을 뜻한다. 양의 최솟값보다 작은 값이 되는 경우를 말하며 값은 0이 된다.
자바가 실수를 저장하는 방식
컴퓨터 메모리는 2진수로 데이터를 저장한다. 컴퓨터에서 실수를 저장하는 방식은 고정소수점 방식과 부동소수점 방식이 있다.
고정소수점
- 메모리를 정수부와 소수부로 나누어 2진수로 변환한 실수를 저장한다.
- 10진수의 실수를 2진수로 변환하고 결과값을 각각 정수부, 소수부 메모리 비트에 넣어주면 실수표현이 완료된다.
- 보기에는 직관적이나 이 방식은 실수를 표현할 수 있는 범위가 매우 적다.
- 자바의
float
타입을 기준으로 실수는 총 32비트의 메모리를 할당 받는데 고정소수점 방식처럼 메모리를 반으로 나누어 설계했다면 정수부 비트에서 표현할 수 있는 표현값 범위는-2^15 ~ 2^15 - 1
이다. - 낭비되는 공간이 너무 많다.
123535.36
이라는 실수를 고정소수점 방식으로 저장하고 싶을 때, 고작0.36
이라는 작은 수를 표현하기 위해 16비트의 소수부를 모두 사용해야 한다.
💡 이러한 공간 낭비를 줄이고 효율적으로 실수를 표현하기 위해 부동소수점 방식을 사용한다.
부동소수점
- 소수점이 막 움직인다는 뜻에서 부동소수점이라는 이름이 붙었다
- 메모리를 부호비트, 지수부와 가수부로 나누어 2진수로 변환한 실수를 저장한다.
- 가수부에는 실제 실수 데이터 비트들이 들어가고, 지수부에는 소수점의 위치를 가리키는 제곱승이 들어간다.
- 부동소수점 방식을 사용하면 큰 범위의 값을 표현할 수 있다.
- 실수의 값 자체를 23bit인 가수부에 넣어 표현하기 때문에 큰 비트의 범위를 갖게 된다.
- 부동소수점 방식은 대부분 IEEE 754 표준을 따른다.
- IEEE 754는 전기 전자 기술자 협회에서 개발한 표준 부동소수점 방식이고 현재 컴퓨터에서 가장 널리 쓰임
- 자바도 이 표준을 따른다.
지수부
- 부호있는 정수
- 지수의 범위는
-127 ~ 128
(float),-1023 ~ 1024
(double)
근데 지수부에서 127은 왜 빼는 걸까? 🤔
32비트 IEEE 754 형식에 bias
라는 고정값이 존재한다. 그 고정값이 127
이다.
이 값을 사용하는 이유는 지수가 음수가 될 수도 있기 때문이다.
예를 들어,
이 예에 있는 음수 지수 -4
를 8자리 비트로 표현하기 위해 0 ~ 127
구간은 음수, 128 ~ 255
구간은 양수로 표현하도록 만든 것이다.
계산된 지수에 바이어스 값 127을 더해서 127보다 작으면 음수, 127보다 크면 양수로 구분할 수 있다.
💡 2진수를 1.xxx X 2^n
이런 표현 방식으로 만드는걸 정규화라고 부른다.
가수부
- 실제 값을 저장하는 부분
- 10진수로 7자리(float), 15자리(double)의 정밀도로 저장 가능함
- 실수를 부동소수점으로 메모리에 저장하기 실전
-314.625
를 부동소수점으로 저장하자
- 절대값 314.625를 이진법으로 변환
-> 100111010.101(2)
- 소수점을 이동시켜 정수부를 한 자리로 만들어준다. (1.xxx)
100111010.101(2)
-> 1.00111010 X 2^8
- 가수부 비트에 실수값 그대로 넣기 (소수점 무시)
- 지수에 바이어스 값(127)을 더하고 지수부 비트에 넣기
8 + 127 = 135
-> 이진수로 변환
-> 10000111(2)
📚 참고
JAVA 데이터 타입 종류 총정리 (int / double / char / String / boolean)
실수 표현(부동 소수점) 원리 한눈에 이해하기
https://www.youtube.com/watch?v=2fnpPUs79MQ
'JAVA' 카테고리의 다른 글
[F-Lab 모각코 챌린지 11일차] 시간복잡도, 공간복잡도 (0) | 2023.06.18 |
---|---|
[F-Lab 모각코 챌린지 10일차] 자바가 실수를 다루는 법-2 (BigDecimal) (0) | 2023.06.17 |
[F-Lab 모각코 챌린지 8일차] shift operator (0) | 2023.06.15 |
[F-Lab 모각코 챌린지 7일차] Generics (1) | 2023.06.14 |
[F-Lab 모각코 챌린지 6일차] equals(), hashCode() (0) | 2023.06.13 |
댓글
이 글 공유하기
다른 글
-
[F-Lab 모각코 챌린지 11일차] 시간복잡도, 공간복잡도
[F-Lab 모각코 챌린지 11일차] 시간복잡도, 공간복잡도
2023.06.18 -
[F-Lab 모각코 챌린지 10일차] 자바가 실수를 다루는 법-2 (BigDecimal)
[F-Lab 모각코 챌린지 10일차] 자바가 실수를 다루는 법-2 (BigDecimal)
2023.06.17 -
[F-Lab 모각코 챌린지 8일차] shift operator
[F-Lab 모각코 챌린지 8일차] shift operator
2023.06.15 -
[F-Lab 모각코 챌린지 7일차] Generics
[F-Lab 모각코 챌린지 7일차] Generics
2023.06.14