[컴퓨터구조] 부동 소수점 연산(Floating point number arithmetic)
floating point number arithmetic이 왜 필요한가?
- 소수점 표현을 위해 ex) 3.1416
- 아주 작은 수 표현을 위해 ex) 0.00000001
- 아주 큰 수 표현을 위해 ex) 3.1555 & 10^9
부동 소수점 연산 notation
-coefficient : 계수 , base number : 진수 , exponent : 지수
ex) 7.151666 * 10^4 ( coefficient : 7.151666, base number : 10, exponent : 4 )
▩ 10진수의 경우 coefficient 의 범위는 1 <= coefficient < 10 이다.
▩ 2진수의 경우 coefficient 의 범위는 1 <= coefficient < 2 이다.
2진수 소수점 표현법 (Normalized scientific notation)
- sign, significand, exponent
- significand의 길이가 늘어나면 정확도(accuracy)가 높아짐
- exponent의 길이가 늘어나면 범위(range)가 높아짐
- 32bit 안에서 sign, significand, exponent를 적절히 나눠야함
- significand = 1 + fraction
IEEE754 표준 생성
- single precision (32 bit) : 8 bit exponent, 23bit fraction
- double precision (64bit) : 11bit exponent, 52bit fraction
지수(exponent)는 양/음을 구별할 수 있어야하는데, 이때 two's complement를 쓰는 것이아니라 바이어스(bias)를 사용한다.
-single precision 의 bias : 127 ( 2^7 -1)
-double precision의 bias : 1023 (2^10 -1)
예를 들어, 2^10이라면 exponent에 10+127인 137을 입력함 or 2^-10이라면 exponent에 -10+127인 117을 입력함
-exponent의 8bit가 모두 0 = -127이 아니라 0으로 생각함
-exponent의 8bit가 모두 1 = 128 이 아니라 무한대(infinity)로 생각함
따라서 범위는 -126 ~ 127이라고 생각하는 것이 편함
최종 공식
-overflow : 지수의 최고 범위(127)를 초과했을때
-underflow : 지수의 범위보다 이하일때 (-126보다 작을때)
2진수의 덧셈 계산법
문제) 1.0110 X 2^3 + 1.1000 X 2^2
1. 2진수의 지수를 맞춘다.
2.significand끼리 더한다.
3.소수점을 1로 맞춰준다. (normalize)
4. 반올림을 해줘도 되지만 더한수와 결과가 모두 4bit이니 해주지 않아도 된다.
곱셈 계산법
1. 지수끼리 계산한다.
지수 = A의 지수 + B의 지수 - bias (127 or 1023)
2.significand끼리 곱한다.
sig = A의 sig X B의 sig
3.결과를 표준화한다. (normalize)
- leading bit가 1이되도록 계산한 sig를 오른쪽으로 shift하기
- overflow 체크하기
- 반올림하기
4.부호 확인
- 양수 or 음수
문제) (1.0110 X 2^3) X (1.1100 X 2^2) = [0 | 10000010 | 01100000....] X [0 | 10000001 | 110000....]
1.지수 계산
130 + 129 - 127 = 132 [10000100]
2.sig 곱셈
1.011000... X 1.110000... = 10.01101000...
3.product normalize
product = 10.01101000... X 2^10000100 ☞ 1.001101000... X 2^100000101
4.부호 확인
sign = 0 (양수)
5.결과
[0 | 100000101 | 0011010000... ] = 1.001101000... X 2^6