티스토리 뷰
CS:APP Ch02. Representing and Manipulating Information - 3
초리 2021. 4. 1. 17:342.4 Floating Point
부동 소수점(Floating Point) 표현법은 유리수를 인코딩하는 방법이다. x × 2^y 의 형태
어떻게 숫자가 IEEE 부동 소수점 표현 방식으로 표현되는 지 보자.
2.4.1 Fractional Binary Numbers
부동 소수점 수를 이해하는 첫 번째 단계는 분수값을 가지는 이진수를 고려해야 한다.
'.' 은 이진 포인트(binary point) 이며 왼쪽에 비트는 2의 거듭 제곱의 값을 갖고 오른쪽은 2의 음수 거듭 제곱의 값을 갖는다.
이진 포인트를 오른쪽으로 하나 시프트하면 2를 곱하는 값의 효과를 얻는다.
유한한 길이의 인코딩으로 고려하면 1/3이나 5/7과 같은 수를 정확하게 표현할 수 없다.
1/5 같은 경우 십진 소수로 나타내면 정확히 0.02이다.
그러나 분수값 이진수를 정확하게 나타내기 어렵다.
대신에 이진 표현의 길이를 늘려 정확성을 늘려 근접 값을 얻는다.
2.4.2 IEEE Floating-Point Representation
이전 장의 위치 표기법은 큰 수를 나타내기에는 효율적이지 않다.
IEEE 부동 소수점 기준은 숫자를 V = (-1)^s x M x 2^E의 형태로 나타낸다.
- 부호 s는 숫자가 양수인지 음수인지를 나타낸다. (s = 1 -> 음수, s = 0 -> 양수)
- 유효 수 M은 분수 이진 값이다.
- 지수 E는 2의 거듭 제곱의 값을 갖는다.
부동 소수점의 비트 표현 방법은 세 가지 필드로 나눌 수 있다.
- 단일 부호 비트인 s는 바로 s로 인코딩된다.
- k-비트 exp는 지수 E로 인코딩된다.
- n-비트 frac은 M으로 인코딩되지만, 인코딩된 값은 지수 필드가 0인 것에 대해 의존한다.
단 정밀도(single-precision) 부동 소수점 형태의 필드인 s, exp, frac은 1, k = 8, n = 23 비트이며 32비트 표현 방법을 가진다.
(C언어에서 float)
배 정밀도(double-precision) 부동 소수점 형태의 필드인 s, exp, frac은 1, k = 11, n = 52 비트이며 64비트 표현 방법을 가진다.
(C언어에서 double)
주어진 비트 표현법은 exp의 값에 따라 세 가지 다른 경우가 있다.
Case 1: Normalized Values
가장 흔한 경우이다. exp의 비트 패턴이 모두 0이 아니거나 모두 1이 아닐 때 발생한다.
지수 필드가 편향된(biased) 형태의 부호 있는 정수로 표현되어 해석된다.
지수 값은 E = e - Bias이며 e는 비트 표현을 가진 부호 없는 정수이며, Bias는 2^(k - 1) - 1과 같은 편향된 값이다.
이는 단 정밀도에서 -126 부터 +127까지 배 정밀도에서는 -1022부터 +1023까지의 범위를 얻는다.
frac 필드는 0<= f < 1까지의 범위를 갖는 분수 값 f를 표현한다. 0.f ..... f1f0
유효 수는M = 1 + f 로 정의된다. 1. ,,,,
Case 2: Denomarlized Values
지수 필드가 모두 0이면, 비 정규화된 형태로 표현된다.
지수는 1 - Bias 값을 갖고, 유효 값은 M = f이다.
비정규화된 값은 두 가지 목적을 제공한다.
숫자 0을 표현하기 위해 제공한다. 정규화된 수는 늘 M >= 1이므로 0을 표현할 수 없다.
+0.0은 모두 0인 비트 패턴을 가진다: 부호 비트는 0, 지수 필드는 모두 0이고, 분수 파트도 모두 0이다.
부호 비트가 1인데 나머지가 모두 0이면 -0.0의 값을 가진다.
0.0에 매우 가까운 수를 표현하기 위한 함수가 있다.
가능한 숫자 값이 0.0에 가깝게 배치되는 점진적 언더플로우(gradual underflow)를 제공한다.
Case 3: Special Values
지수 필드가 모든 값이 1일 때이다.
분수 필드가 모두 0이면, 결과 값은 무한이며 s = 0일때 +∞이고, s = 1이면 -∞이다.
무한대는 두 큰 수를 곱할 때나, 0으로 나눌 때 오버플로우 결과를 낳을 수 있다.
분수 필드가 0이 아니면 "NaN" (Not a Number)이라는 결과값을 얻는다.
∞ – ∞이나 sqrt(1) 계산과 같이 실수나 무한대로 나오지 않을 때의 결과를 반환한다.
2.4.3 Example Numbers
2.4.4 Rounding
부동 소수점 산술은 범위와 정확성에 제한되는 표현이라 실제 산술에 근접할 뿐이다.
x 값에 대해서, 우리는 가장 가까운 값인 부동 소수점 형식으로 표현된 x'를 찾는 시스템적 방법을 원한다.
이러한 태스크가 반올림(rounding) 연산이다.
한 가지 주요 문제점은 두 가지 가능성을 갖고 있는 값에 대한 반올림의 방향성이다.
예를 들어, $1.50이면 $1이 맞는지 $2가 맞는지에 대한 문제
실제 숫자에 대한 하한과 상한을 유지하는 것이 대안이다.
IEEE 부동 소수점은 4가지 반올림 모드를 정의한다.
기본적인 방법은 가장 가까운 것을 찾는 것이고, 다른 세 가지 방법은 상한과 하한을 계산하는 데 사용한다.
Round-to-even(= Round-to-nearest)가 기본적인 방법이다.
나머지 세 방식들은 실제 값에 보증된 경계(bound)를 생성한다.
Round-toward-zero 방식은 양수를 내림하고 음수는 올림한다.
Round-down 방식은 양수와 음수 다 내림한다.
Round-up 모드는 양수와 음수 다 올림한다.
2.4.5 Floating-Point Operations
IEEE 표준은 덧셈이나 곱셈과 같은 산술 연산에 대한 결과를 결정하는 간단한 규칙을 구체화하였다.
실수 x와 y를 부동 소수점으로 바라보면서 어떠한 연산을 한다면 반올림이 적용된다. Round(x ⊙ y)
부동 소수점 연산을 구체화한 IEEE 표준 방법의 강점 중 하나는 어떤 특정 하드웨어나 소프트웨어 구현과 독립적이라는 것이다.
이게 어떻게 실제로 구현되는 지에 대해 고려할 필요 없이 추상적인 수학적인 속성을 설명할 수 있다.
2.4.6 Floating Point in C
C언어는 두 가지 다른 부동 소수점 데이터 타입인float와 double을 제공한다.
round-to-even 방식의 반올림 방식을 사용한다.
'Computer Science > Computer Architecture' 카테고리의 다른 글
CS:APP Ch03. Machine-Level Representation of Programs - 2 (0) | 2021.04.05 |
---|---|
CS:APP Ch03. Machine-Level Representation of Programs - 1 (0) | 2021.04.02 |
CS:APP Ch02. Representing and Manipulating Information - 2 (0) | 2021.03.31 |
CS:APP Ch02. Representing and Manipulating Information - 1 (0) | 2021.03.30 |
CS:APP Ch01. A Tour of Computer Systems - 3 (0) | 2021.03.27 |