Search
실수형의 오버플로우와 언더플로우 (Overflow & Underflow)
•
오버플로우 : 최대값을 초과할 때 발생 → 값은 무한대로
•
언더플로우 : 최소값을 초과할 때 발생 → 값은 0으로
실수형에 큰 값을 저장할 수 있는 이유?
•
같은 4 byte임에도 정수형과 달리 큰 값을 저장할 수 있는 이유
→ 저장하는 형식이 다르기 때문
◦
float 타입과 같은 실수형은 부호(S), 지수(E), 가수(M)로 이루어져 있음.
◦
2의 제곱을 곱한 형태 (±M × 2^E)로 저장하기 때문에 큰 범위 값 저장이 가능
정밀도 (precision)
•
큰 값을 저장하기 때문에 오차가 발생할 수 있음.
→ 오차를 줄이려면 높은 정밀도가 필요 → 정밀도가 높은 double 형을 많이 사용
•
정밀도가 15자리 → 15자리의 10진수를 오차없이 저장 가능
FloatEx1.java
실수형의 저장 형식
•
부동소수점수(floating-point) 형태로 저장
•
부호(S), 지수(E), 가수(M) → ±M × 2^E
◦
float → S(1) + E(8) + M(23) = 32(4 byte)
◦
double → S(1) + E(11) + M(52) = 64(9 byte)
Search
부동소수점의 오차
•
10진수가 아닌 2진수로 실수를 저장하기 때문에 무한소수가 되는 등 오차 발생 가능
→ 2진수로는 10진 소수를 정확히 표현 불가
◦
10진수론 유한소수라도 2진수로는 무한소수, 가수값 한정에 따른 오차 등..
정규화
•
2진수로 변환된 수를 저장할 때 1.xxx × 2^n 형태로 변환하는 것
•
정규화된 2진 실수는 항상 1.로 시작
→ 제외한 나머지 23자리 숫자가 가수로 저장됨. 나머진 잘려나감.
•
기저법 : 부호있는 정수를 저장하는 방법
저장할 때 특정값(기저)를 더했다가 읽어올 때는 다시 뺌.
•
1.001000…011011011… × 2^3 (빨간색은 오차)
→ 0 100 0001 0 011 0001 1111 1001 1010 1101
◦
부호 (오렌지)
◦
지수 3과 기저 127이 2진수로 변환되어 저장됨. (초록)
◦
가수 (블루)
FloatToBinEx.java