컴퓨터에서는 10진수를 표현할 때 보통 Science 표기법을 따름
-2.34 * 10^56 같이 소수 앞자리가 절댓값 1~9 사이여야 함.
따라서 2진수로 실수를 포현하면 정수자리는 항상 1이어야 함.
IEEE 표준 Floating-Point 포맷
제일 첫 비트인 S비트는 sign비트. S가 0이면 양수, 1이면 음수
Fraction: Science 표기법을 따른 실수(에시: -2.34 * 10^56)에서 앞 실수 부분에 1을 뺀 값
Exponent: 지수 부분에 Bias를 더한 값. 32비트는 Bias값이 127, 64비트는 1023
32비트 실수값 범위
00000000과 11111111은 0과 1이므로 제외
가장 작은 값
Exponent: 00000001 → 실제 exponent = -126
Fraction: 000..00 → significand = 1.0
1.0 * 2^-126를 10진수로 변경하면 1.2 * 10^-38
가장 큰 값
Exponent: 11111110 → 실제 exponent = 127
Fraction: 111..11 → significand = 2.0
2.0 * 2^127를 10진수로 변경하면 3.4 * 10^38
64비트 실수값 범위
000…00과 111…11은 0과 1이므로 제외
가장 작은 값
Exponent: 000000000001 → 실제 exponent = -1022
Fraction: 000..00 → significand = 1.0
1.0 * 2^-1022를 10진수로 변경하면 2.2 * 10^-308
가장 큰 값
Exponent: 11111111110 → 실제 exponent = 1023
Fraction: 111..11 → significand = 2.0
2.0 * 2^1023를 10진수로 변경하면 1.8 * 10^308
대략적인 범위는 32비트의 경우 소수점이하 6자리 까지 표현할 수 있고, 64비트의 경우 소수점이하 16자리까지 표현 가능
2진수 → 10진수 실수 변환
32비트인 11000000101000…00을 10진수 실수로 변환하면
S = 1
Fraction = 01000…00
Exponent = 10000001 = 129
(-1) * (1+0.01) * 2^(129-127) = -1 * 1.25 * 2^2 = -5.0
Floating-Point Addition (실수 덧셈)
10진수 덧셈 과정
- 자수 맞추기. (큰수 기준)
- significand 끼리 더하기.
- normalize 하기 & 오버/언더플로우 체크.
- 반올림하기 및 필요한 경우 다시 normalize.
예시
4자릿수 실수 계산
9.999 * 10^1 + 1.160 * 10^-1
- 9.999 * 10^1 + 0.016 * 10^1
- 9.999 * 10^1 + 0.016 * 10^1 → 10.015 * 10^1
- 1.0015 * 10^2
- 1.002 * 10^2
2진수 덧셈 과정
과정은 10진수 덧셈과정과 동일
예시
4자릿수 실수 계산
1.000 * 2^-1 + -1.110 * 2^-2 (0.5 + -0.4375)
- 1.000 * 2^-1 + -0.111 \* 2^-1
- 1.000 * 2^-1 + -0.111 \* 2^-1 = 0.001 * 2^-1
- 1.000 * 2^-4
Floating-Point Multiplication (실수 곱셈)
2진수 양수 * 양수 과정
- 지수를 더함
- significand끼리 복합
- normalize, 오버/언더플로우 체크
- 필요에 따라 반올림 및 normalize 수행
- sign값 부여
2진수 양수 * 음수 과정
- 지수를 더함
- unbiased인 경우 지수끼리 덧셈 수행
- biased인 경우 bias 값을 더함
- significand끼리 복합
- normalize, 오버/언더플로우 체크
- 필요에 따라 반올림 및 normalize 수행
- sign값 부여
'컴퓨터 구조' 카테고리의 다른 글
ALU Control (0) | 2023.07.11 |
---|---|
프로세서의 명령어 실행 과정 (0) | 2023.07.07 |
사칙연산 원리 (0) | 2023.07.05 |
Static Linking 부터 로드까지 (0) | 2023.06.30 |
명령어 addressing (0) | 2023.06.30 |