부동 소수점(Floating Point)
- 정수가 아닌 표현
- 매우 작은 숫자와 매우 큰 숫자
- 과학적 표기법과 유사
- 2.34 * 10^56
- +0.002 * 10^–4
- +987.02 * 10^9
- 2진법
- ±1.xxxxxxx_2 * 2^yyyy
- C의 float 및 double 유형
부동 소수점 표준
- IEEE Std 754-1985에 정의
- 표현의 다양화에 대응하여 개발됨
- 과학 코드의 이식성 문제
- 이제 거의 보편적으로 채택
- 두 가지 표현
- Single precision (32비트)
- Double precision (64비트)
IEEE 부동 소수점 형식
Sign | Exponent(지수) | Fraction(가수) | |
single : 32비트 | 1비트 | 8비트 | 23비트 |
duoble : 64비트 | 1비트 | 11비트 | 52비트 |
X = (-1)^S * (1+Fraction) * 2^(Exponent - Bias)
- S: sign bit, 부호 비트
- 0 : 음수가 아님
- 1 : 음수
- 유효함수 정규화 : 1.0 ≤ |유효함수| < 2.0
- 정규화 이후 소수점 앞의 수는 1
- 예) 1010.1101 → 1.0101101 * 2^3
- Fraction(가수) : 정규화 이후 1.xxxx...x일때
- xxxx...x 부분
- 뒤는 0으로 채움
- 예) 1.0101101의 Fraction : 0101101
- Exponent(지수) : 실제 지수 - (Bias)편향
- 지수가 부호가 없는지 확인
- single: bias = 127
- double: bias = 1023
Single-Precision 범위
- 지수 : 00000000 ~ 11111111 (8비트)
- 가장 작은 값
- Fraction : 000...00 → significand = 1.0
- 지수 : 00000001
- 실제 지수 = 1 - 127 = -126
- ± 1.0 * 2^-126 ≈ ± 1.2 * 10^-38
- 가장 큰값
- Fraction : 111...11 → signficand ≈ 2.0
- 지수 : 11111110
- 실제 지수 = 254 - 127 = +127
- ± 2.0 * 2^+127 ≈ ± 3.4 * 10^+38
Double-Precision 범위
- 지수 : 00000000000 ~ 11111111111 (11비트)
- 가장 작은 값
- Fraction : 000…00 → significand = 1.0
- 지수 : 00000000001
- 실제 지수 = 1 - 1023 = -1022
- ± 1.0 * 2^-1022 ≈ ± 2.2 * 10^-308
- 가장 큰값
- Fraction : 111…11 → significand ≈ 2.0
- 지수 : 11111111110
- 실제 지수 = 2046 - 1023 = +1023
- ± 2.0 * 2^+1023 ≈ ± 1.8 * 10^+308
부동 소수점 정밀도
- 상대 정밀도
- 모든 소수 비트는 중요합니다.
- single : 약 2^-23
- 23 * log_10 2 ≒ 23 * 0.3 ≒ 소수점 이하 6자리 정밀도
- double : 약 2^-52
- 52 * log_10 2 ≒ 52 * 0.3 ≒ 소수점 이하 16자리 정밀도
- single : 약 2^-23
부동 소수점 예시 1
10진수 → 2진수
- 예) -0.75
-0.75
= (-1)^1 * 0.11_2
= (-1)^1 * 1.1_2 * 2^-1
- S = 1
- 1.Fraction = 1.1
- 1000…00_2
- Exponent - Bias = -1
- Exponent = -1 + Bias
- Single: -1 + 127 = 126 = 01111110_2
- Double: -1 + 1023 = 1022 = 01111111110_2
- Single: 1 01111110 1000…00
- Double: 1 01111111110 1000…00
부동 소수점 예시 2
2진수 → 10진수
- 예) single precision : 1 10000001 01000…00
S | Exponent | Fraction |
1 | 10000001 | 01000…00 |
- 지수 : 10000001_2 = 129
x = (-1)^1 * 1.01_2 * 2^(129-127)
= -1.01_2 * 2^(2)
= -101_2
= -5.0
비정규 숫자
- 지수 = 000...0 → 숨겨진 비트는 0
x = (-1)^S * (0+Fraction) * 2^(-Bias)
single : (-1)^S * (0+Fraction) * 2^(-127)
double : (-1)^S * (0+Fraction) * 2^(-1023)
- 일반 숫자보다 작음
- 정밀도가 감소하면서 점진적인 언더플로우를 허용한다.
- Fraction = 000...0
x = (-1)^S * (0+0) * 2^(-Bias) = ± 0.0
무한대와 NaN
- 지수 = 111...1, Fraction = 000...0
- ±무한대
- 후속 계산에 사용할 수 있어 오버플로 검사가 필요하지 않다.
- 지수 = 111...1, Fraction ≠ 000...0
- 숫자 없음(NaN)
- 정의되지 않은 결과를 나타낸다.
- 예: 0.0 / 0.0
- 후속 계산에 사용할 수 있다.
부동 소수점 덧셈
9.999 * 10^1 + 1.610 * 10^-1
- 1. 소수점 정렬
- 큰 지수에 맞춘다.
9.999 * 10^1 + 0.016 * 10^1
- 2. 유효 숫자를 더한다.
9.999 * 10^1 + 0.016 * 10^1 = 10.015 * 10^1
- 3. 결과 정규화, 오버플로우/언더플로우 확인
1.0015 * 10^2
- 4. 필요한 경우 반올림하고 다시 정규화한다.
1.002 * 10^2
부동 소수점 덧셈 2진수 예제
1.000_2 * 2^-1 + -1.110_2 * 2^-2
- (0.5 + -0.4375)
- 1. 소수점 정렬
- 큰 지수에 맞춘다.
1.000_2 * 2^-1 + -0.111_2 * 2^-1
- 2. 유효 숫자를 더한다.
1.000_2 * 2^-1 + -0.111_2 * 2^-1 = 0.001_2 * 2^-1
- 3. 결과 정규화, 오버플로우/언더플로우 확인
1.000_2 * 2^-4
- 오버/언더플로우 없음
- 4. 필요한 경우 반올림하고 다시 정규화한다.
1.000_2 * 2^-4
- 변화 없음
- 0.0625
부동소수점 가산기 하드웨어
- 정수 가산기보다 훨씬 더 복잡하다.
- 한 클럭 주기로 수행하면 시간이 너무 오래 걸린다.
- 정수 연산보다 훨씬 길다
- 시계가 느려지면 모든 명령에 불이익이 발생한다.
- 부동소수 가산기는 일반적으로 여러 사이클이 소요된다.
- 파이프라인 가능
부동 소수점 곱셈
1.110 * 10^10 * 9.200 * 10^-5
- 1. 지수 더하기
- 편향된(Biased) 지수의 경우 합계에서 편향을 뺀다.
새 지수 = 10 + -5 = 5
- 2. 유효숫자 곱하기
1.110 * 9.200 = 10.212
10.212 * 10^5
- 3. 결과 정규화, 오버플로우/언더플로우 확인
1.0212 * 10^6
- 4. 필요한 경우 반올림하고 다시 정규화한다.
1.021 * 10^6
- 5. 피연산자의 부호로부터 결과의 부호를 결정한다.
+1.021 * 10^6
부동 소수점 곱셈 2진수 예제
1.000_2 * 2^(-1) × -1.110_2 * 2^(-2)
- (0.5 * -0.4375)
- 1. 지수 추가
Unbiased : -1 + -2 = -3
Biased : -1 + -2 + 127 = 124
- 2. 유효숫자 곱하기
1.000_2 * 1.110_2 = 1.110_2
1.110_2 * 2^-3
- 3. 결과 정규화 및 오버플로우/언더플로우 확인
1.110_2 * 2^–3
- (변화 없음), 오버/언더플로우 없음
- 4. 필요한 경우 반올림하고 다시 정규화한다.
1.110_2 * 2^–3
- (변화 없음)
- 5. 부호 결정
-1.110_2 * 2^-3 = -0.21875
부동소수점 산술 하드웨어
- 부동소수점 multiplier는 부동소수점 가산기와 비슷하다.
- 그러나 가산기 대신 유효숫자에 multiplier를 사용한다.
- 부동소수점 산술 하드웨어는 일반적으로
- 덧셈, 뺄셈, 곱셈, 나눗셈, 역수, 제곱근
- 부동소수점 ↔ 정수 변환
- 작업에는 일반적으로 여러 주기가 소요된다.
- 파이프라인 가능
'컴퓨터시스템구조' 카테고리의 다른 글
[컴퓨터시스템구조] 19. 프로세서(논리 설계, 조합 요소, 논리 요소) (0) | 2023.11.06 |
---|---|
[컴퓨터시스템구조] 18. MIPS 부동 소수점 연산자 (1) | 2023.10.19 |
[컴퓨터시스템구조] 16. 컴퓨터 산술(mult, mfhi, mflo, mul, div) (0) | 2023.10.15 |
[컴퓨터시스템구조] 15. MIPS 배열 vs. 포인터 (0) | 2023.10.15 |
[컴퓨터시스템구조] 14. MIPS Sort (1) | 2023.10.15 |