🎵 Twenty one pilots - Stressed Out
부동소수점 (Floating Point)
2진수 실수 정규화 표현
±1.xxxx×2yyyy
- Sign (S) 부호
- Fraction (F) 소수점 오른쪽 (xxxx)
- 유효자리 (Significand): 0, 1 → 실수부분만 중요하게 됨
- Exponent (E) 지수 (yyyy)
부동소수점의 표현
x=(−1)S×(1+F)×2E−Bias
F - E의 trade off 관계
- F 표현 범위가 높을 때: 높은 정확도
- E 표현 범위가 높을 때: 넓은 표현 범위
표준
| 데이터 크기 | C 자료형 | 표준 | S | E | F | Bias |
---|
Single Precision | 32 bits | float | IEEE Std 754 | 1 bit | 8 bits | 23 bits | 127 |
Double Precision | 64 bits | double | IEEE Std 1985 | 1 bit | 11 bits | 52 bits | 1023 |
S → E → F 순서 고정
수의 크기 비교
정수 비교 명령어로 실수 비교 가능
E 값이 클 수록 절대값이 큰 수
- 음수 지수를 2의 보수로 표현 시 매우 큰 수로 보일 수 있음
- 지수 부분을 부호와 상관없이 비교키 위해 biased 된 표현 사용
E 값에 따른 부동소수점 표현 방법
E (S: 8-bit, D: 11-bit) | 0 | 0이 아닌 수 F(S: 23 bits, D: 52 bits) |
---|
0 | 0 | 비정규화 수: x=(−1)S×(0+F)×21−Bias |
1~254(S) or 2046(D) | | x=(−1)S×(1+F)×2E−Bias |
255(S) or 2047(D) | ±∞ | NaN(Not a Number) |
- E의 가장 작은 값 (E = 0): 0 또는 정규화 수보다 작은 수 표현
- E의 가장 큰 값 (E = 255(S) or 2047(D)): 무한대 또는 NaN (정규화 표현이 어려운 수도 표현이 가능해짐)
정확도
Single Precision: 약 2−23 2진수 23자리 ≈ 10진수 7자리
Double Precision: 약 2−52 2진수 52자리 ≈ 10진수 16자리
2진수 자릿수 ×log102≈×0.3
덧셈과정
- 지수가 작은 쪽의 소수점 정렬
- 유효자리 덧셈
- 정규화 및 over/underflow 확인
- 지수부분이 -126보다 작을 때: Underflow → 비정규화된 표현 → 0
- 지수부분이 127보다 클 때: Overflow → 무한대로 표현
- 반올림
- 정규화 (Optional)
곱셈 과정
- 지수 덧셈
- 유효자리 곱셈
- 정규화 및 over/underflow 확인
- 지수부분이 -126보다 작을 때: Underflow → 비정규화된 표현 → 0
- 지수부분이 127보다 클 때: Overflow → 무한대로 표현
- 반올림 및 정규화
- 부호 결정
MIPS의 부동소수점 instruction
부동소수점 하드웨어 (coprocessor 1)
Single-precision: f1, $f2, ... $f31 Double-precision: $f0/f1, f2/f3 (두 개씩 pair로 사용)
정확한 계산을 위해 추가 bit 사용
- Guard bit: 자리 맞춤 정확도 개선용도
- Round bit: 중간 결과가 부동소수점 형식과 일치하도록 사용
- Sticky bit: 반올림의 딱 중간값의 경우 내림/올림 결정
Guard bit과 round bit을 통해 두 자리 더 추가 표현이 가능해진다.