IEEE 754 Floating Point Format
IEEE 754 부동 소수점수 저장 형식
- 정수가 아닌, 실수를 32bits 혹은 64bits 메모리에 저장하는 방식 중 하나이다.
- IEEE Std 754-1985에 정의되어 있으며, 가장 널리 쓰이는 표준이다.
- 부동 소수점 값이 IEEE에 저장되기 위해서는 반드시 Normalized*된 수치이어야 한다.
* Normalized Notation (정규화 표기)
- Scientific Notation과 유사한 형태로, 정수부에 한 자리수가 위치하고, 10의 Exponent 형태로 나타내는 방식이다.
- 즉, 정규화 표기에서 Significand의 절댓값은 1.0 이상 2.0이하의 범위내에 위치한다.
ex) \(-1.34 * 10^{56}\) : Normalized
ex) \(+0.002 * 10^{-4}\) : Not Normalized
- Normalized Notation in Binary : \(±1.xxxx * 2^{yyyy}\) (이진수 정규화 표기에서 정수부는 항상 1임에 유념하자.)
Details
S(Sign) Field
- 1bit가 할당되어, 0은 수치가 양수임을, 1은 수치가 음수임을 의미한다.
Exponent Field
- Single Precision에서는 8bits가 할당된다.
- Single Precision에서의 Bias*값은 127이다. (Actual Number의 지수값 + Bias = Exponent Field)
- Double Precision에서는 11bits가 할당된다.
- Double Precision에서의 Bias값은 1,023이다. (Actual Number의 지수값 + Bias = Exponent Field)
* Bias 값을 반영하는 이유는, Exponent 필드에는 부호를 표현하는 비트가 따로 존재하지 않기 때문이다.
All 0s in Exponent : 0.0을 표현하기 위한 Reserved Representation
All 1s in Exponent : 무한대를 표현하기 위한 Reserved Representation
Fraction Field (Mantissa)
- 소수부가 위치하는 비트 필드이다.
- 정규화된 이진수 표기에서, 정수부는 무조건 1이므로, 정수부 1은 따로 표기하지 않는다. (Hidden Bit)
- Single Precision에서는 23bits가 할당된다.
- Double Precision에서는 52bits가 할당된다.
Ex. IEEE 754의 Single Precision Format에서 표현 가능한 양수 중 최솟값과 최댓값
1. 양의 실수 중 최솟값
Sign : 0
Exponent : 0000 0001 : 1 - 127 = -126
Mantissa : All 0s : 1.0
\(\therefore 1.0 * 2^{-126} \approx 1.2 * 10^{-38}\)
2. 양의 실수 중 최댓값
Sign : 0
Exponent : 1111 1110 : 254 - 127 = +127
Mantissa All 1s : \(1.0 + 1 - 2^{-23} \approx 2.0\)
\(\therefore 1.0 + 1 - 2^{-23} \approx 2.0 * 2^{+127} \approx 3.4 * 10^{+38}\)
Ex. 십진수 -0.75를 IEEE Single Precision Format에 저장될 때의 형식은?
-0.75 (DEC) = \(-1.1 * 2^{-1}\) (BIN)
Sign : 1
Exponent : -1 + Bias = -1 + 127 = 126 = 01111110
Mantissa : 1000...000 = 1.1
따라서, 1 01111110 1000...000 으로 저장된다.
Ex. IEEE Single Precision Format에 저장되어 있는 1 10000001 01000...000 은 10진수로 얼마에 해당될까?
Sign : 1 = 음수
Exponent : 10000001 = 129 : Actual Expoenent = 129 - Bias(127) = +2
Mantissa : 01000...000 = 1.01 (BIN) =1.25 (DEC)
따라서 \(- 1.25 * 2^2 = -5.0\)
Floating Point Addition Algorithm (부동 소수점수 덧셈 알고리즘)
Ex. \(9.999 * 10^{1} + 1.160 * 10^{-1}\)
1. Align Decimal Points
(두 피연산자의 지수부를 일치시킨다.)
\(9.999 * 10^{1} + 0.016 * 10^{1}\)
2. Add Significands
(유효부끼리 덧셈한다.)
\((9.999 + 0.016) * 10^{1} = 10.015 * 10^{1}\)
3. Normalize Result & Check for Overflow, Underflow
(연산 결과를 Normalize하고 오버/언더플로우 여부를 검사한다.)
\(1.0015 * 10^2\)
4. Round & Renormalize if necessary
(결과를 유효 숫자에 맞춰 반올림한다. 이 때 반올림 연산으로 인해 정규화 표현이 어긋낫다면, 다시 정규화한다.)
\(1.002 * 10^2\)