2.4 Floating Point
2.4.1 비율 이진수(Fractional Binary Numbers)
- 부동 소수점을 이해하기 위해 비율 이진수에 대해 생각해볼 필요가 있음.
- 일반적으로 어떤 수 $d$에 대해 십진수로 표기하는 방식은 다음과 같다.
- 각 십진 숫자 d_i는 0에서 9 사이의 값을 가진다. 이는 값 d를 다음과 같이 나타낼 수 있다.
- 십진수 표기에서 소수점을 기준으로 오른쪽은 10의 음의 제곱을 가지는 수이며, 왼쪽은 그렇지 않은 수임을 알 수 있다.
- 어떤 수 d로부터 소수점을 왼쪽으로 이동하면 d에 10을 나누는 것과 같으며, 오른쪽으로 이동하면 10을 곱하는 것과 같음.
- 소수점 부호의 상대적 정의에 근거하여, 어떤 이진수 b 또한 이진 소수점을 이용하여 소수의 형태로 나타낼 수 있을 것이다.
- 여기에서 각 이진 숫자 b_i는 0과 1의 값을 가진다. 이는 값 b를 다음과 같이 나타낼 수 있다.
- 이진수의 이진 소수점 또한 십진수의 소수점과 유사한 특징을 가지는 것을 알 수 있다.
- 어떤 수 d로부터 소수점을 왼쪽으로 이동하면 d에 2을 나누는 것과 같으며, 오른쪽으로 이동하면 2을 곱하는 것과 같음.
유한한 길이의 인코딩
- 이진수의 이진 소수점 또한 십진수의 소수점과 유사한 특징을 가지는 것을 알 수 있다.
- 만약 나타내고자 하는 수의 길이가 무한하다면, 모든 진법에 대해 모든 수를 Fractional하게 나타낼 수 있을 것이다.
- 그러나 오직 유한한 길이의 인코딩만을 고려한다고 가정하므로, 이 경우에는 정확하게 표현할 수 있는 수의 범위가 제한된다. 그렇지 않은 값에 대해서는 근사값을 얻는 방법밖에 없다.
- ↑
- 십진수 표기에서 3/10은 3 * 10^{-1}로 나타낼 수 있다. 3/7은 나타낼 수 없다.
- 이진수 표기에서 101.11은 10111(2진법) * 2^{-2}로 나타낼 수 있다. 3/10은 나타낼 수 없다.
- 비율 이진수 표기에서 정확히 나타낼 수 없는 수는 근사화 한 값밖에 구할 수 없는데, 이진 표시를 길게 늘려 정확도를 높이는 방법이 있다.
2.4.2 IEEE Floating-Point Representation(IEEE 부동소수점 표시)
- s : 부호 비트
- 음수(1)인지 양수(0)인지를 결정한다.
- M : 유효숫자 (1 < M < 2 - e | 0 < M < 1 - e )
- E : 지수
- 소수의 자리값을 제공한다. (음수 가능)
IEEE 부동소수점은 비트를 세개의 필드로 나눠 s, M, E를 인코딩한다.
- 부호 비트 s는 부호 s를 직접 인코딩한다.
- k비트 지수 필드 exp = e_{k-1} ~ e_1 e_0은 지수 E를 인코딩한다.
- n비트 비율 필드 frac = $f_{n-1} ~ f_1 f_0은 유효숫자 M을 인코딩한다.
이렇게 인코딩된 값은 exp값에 따라 세가지 케이스로 나뉠 수 있다.
정규화 값
- 지수 필드는 부호형 정수를 바이어스 형태로 나타내도록 해석한다.
- 단일 정밀도는 -126 ~ 127, 이중 정밀도는 -1022 ~ 1023의 범위를 가진다.
- 비율 필드 frac은 f = 0.f_{n-1} ~ f_1 f_0을 가지는 것으로 해석되며, 전체 유효숫자는 f에 1을 더한 값으로 정의된다.
- 즉, 정규화 값은 절대값이 1보다 큰 수를 나타내는 데 사용된다.
비정규화 값
- 0을 표시 (s에 따라 -0.0, +0.0 둘 중 하나가 될 수 있음!)
- 0.0에 매우 가까운 값을 표현
- 집중적 언더플로우 제공 : 숫자 값들이 0.0 근처에서 같은 간격을 가짐을 의미
- (언더플로우)
특수 값
- frac = 0인 경우 Infinity : 매우 큰 두 값의 곱셈이나 0으로 나눌 때와 같은 오버플로우 수를 나타냄
- frac ≠ 0인 경우 NaN : 실수가 아닌 수를 표현 (infty-infty 등)
2.4.4 Rounding (근사법)
어떤 값 x에 대해 원하는 부동소수점으로 표시할 수 있는 가장 유사한 값 x'를 구하자.
- 기준점이 되는 두 근사값의 정확히 중간값은 어떻게 근사하는가?
- 1.5는 1로 근사하는가 아니면 2로 근사하는가?
IEEE는 네가지 근사모드를 정의한다.
Mode 1 : 영방향근사
양수값을 아래쪽으로, 음수를 위쪽으로 근사해 |x'|<|x|가 되도록 하는 방법
Mode 2 : 하향근사
양수와 음수 모두 아래쪽으로 근사하는 방법
Mode 3 : 상향근사
양수와 음수 모두 위쪽으로 근사하는 방법
Mode 4 : 짝수 근사법
- 기본방법으로 가장 가까운 값을 정하는 것.
- 1.4는 1로 근사하고, 1.6은 2로 근사한다.
- 짝수 근사법은 근사값의 가장 덜 중요한 숫자를 짝수가 되도록 근사하는 방식이므로, 1.5는 2로 근사하고 2.5는 2로 근사한다.
- 상향, 하향 근사를 하여 얻은 숫자를 평균을 낸다면 상향근사수는 실제 평균값보다 약간 큰 값을, 하향근사수는 약간 작은 값을 얻게 된다.
- 짝수 근사는 전체 수 집합의 약 50%를 상향근사, 나머지 50%를 하향근사하는 방법이므로, 통계적인 오류를 피할 수 있다.
- 짝수근사법은 정수로 근사하지 않을 때도 적용할 수 있다.
- 1.2349999를 소수점 아래 둘째자리로 근사할 경우, 1.23이 될 것이다.
- 1.2350001를 근사할 경우, 1.24가 될 것이다.
- 1.2350000과 1.2450000은 1.24로 근사하게 된다.(짝수근사법을 적용!!)
- 마찬가지로 이진수에도 적용 가능함.
2.4.5 Floating-Point Operations(부동소수점의 연산)
부동소수점을 계산할 때에는 정확한 근사결과만 보장할 수 있는 정도의 정밀도만 필요하므로, 여러가지 트릭을 설계함.
- 하나의 인자가 -0,infinity,Nan일 경우
- 1/-0 = -infty, 1 /+0 =+ infty로 정의한다.
- 이렇게 설계할 경우 하드웨어나 소프트웨어의 의존성이 사라지게 된다.
- 부동소수점의 연산을 구현하는 방법에 따라 위 연산값이 달라지게 될 경우 프로그램의 일관성을 기대하기 어렵기 때문이다.
- 부동소수점의 연산에 대해서 결합법칙은 성립하지 않는다.
- (3.14+1e10)-1e10은 계산하면 0.0이 된다. 3.14는 값의 근사에 의해 값이 생략되기 때문이다.
- 이는 컴파일러 개발자들에게 중대한 의미를 갖는데
x=a+b+c;
y=b+c+d;
위와 같은 코드를 컴파일한다고 가정할 때 컴파일러는 부동소수점 덧셈을 절약하기 위해 다음과 같이 코드를 생성하려고 할 것이다.
t = b+c;
x = a+t;
y = t+d;
t에 의해 중복된 계산을 피할 수 있는데, 처음의 식과는 다른 x값을 만들 수 있는데, 다른 형태의 결합법칙을 사용하기 때문이다.
- 아벨리안 그룹(결합법칙 관련)
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[CSAPP] 3.2 Program Encoding(프로그램의 인코딩) (0) | 2023.01.21 |
---|---|
[CSAPP] 3.1 A Historical Perspective(역사적 관점) (0) | 2023.01.21 |
[CSAPP] 2.3 Integer Arithmetic(정수 연산) (0) | 2023.01.19 |
[CSAPP] 2.2 Integer Representations(정수의 표시) (0) | 2023.01.19 |
[CSAPP] 2.1 Representing and Manipulating Information(정보의 저장) (1) | 2023.01.19 |