Post

Lecture 04: Floating Point

Computer Systems: A Programmer's Perspective (CS:APP)

Fractional Binary Numbers


앞서 w 비트 정수 x를 각 비트 xi의 합으로 나타냈었다.

x=i=0w1xi2i

여기서 i를 음수 범위로 확장하면 실수에 대한 표현과 같다.

x=i=dn1xi2i

이때 x는 정수부 n 비트, 소수부 d 비트로 이루어진 실수이다.

Examples

ValueRepresentation
534101.112
27810.1112
17161.01112

Limitations

  • x2k 형태로 표현할 수 없는 유리수는 순환소수 형태로 나타난다.

    ValueRepresentation
    130.0101010101[01]2
    150.001100110011[0011]2
    1100.0001100110011[0011]2
  • 전체 비트를 정수부와 실수부로 나누어 사용하기에 표현할 수 있는 수의 범위가 매우 좁다.


IEEE Floating Point


과거에는 기계마다 부동 소수점을 표현하는 방식이 달라 프로그램을 다른 기계로 옮기면 어떤 일이 일어날지 예측할 수 없었다. 이러한 혼란을 막고자 1985년 IEEE에서 부동 소수점에 대한 기술 표준(IEEE 754)을 공표하였고, 이는 오늘날까지 널리 통용되고 있다.

Floating Point Representation

부동 소수점은 실수를 과학적 표기법처럼 나타낸다.

(1)S×M×2E
  • S는 부호 비트, M은 가수, E는 지수이다.
  • 가수 M1M<2를 만족하는 분수 값이다.

Precision Options

IEEE 754는 수의 정밀도에 따라 32비트의 단정밀도(Single precision), 64비트의 배정밀도(Double precision) 등으로 형식을 정의하고 있다. 각 정밀도 형식은 다음과 같이 구성된다. (단위: 비트)

PrecisionSignExponentMantissa
단정밀도1823
배정밀도11152

Normalized Values

실수는 정규화 과정을 거쳐 부동 소수점 형식으로 인코딩된다. 부동 소수점의 지수부를 exp, 가수부를 frac이라 하자.

exp=E+bias

지수부가 p 비트일 때, bias=2p11이다.

PrecisionbiasEexp
단정밀도127-126 ~ 1271 ~ 254
배정밀도1023-1022 ~ 10231 ~ 2046

가수의 경우, M=1.xxxx2이면 frac=xxxx2이다.

 Mfrac
Min1.00000
Max2.0ϵ1111

가수부가 q 비트일 때, ϵ=2q이다.

Normalized Encoding Example

float F = 15213.0을 부동 소수점 방식으로 표현해 보자.

1521310=111011011011012=1.11011011011012×213=(1)S×M×2E

따라서 S=0,M=1.11011011011012,E=13이고, 이로부터 fracexp의 값을 구할 수 있다.

M=1.110110110110100000000002frac= 110110110110100000000002exp=E+bias=13+127=100011002

정리하면 다음과 같다.

Sexpfrac
01000110011011011011010000000000

즉, 15213.0010001100110110110110100000000002으로 인코딩되어 메모리에 저장된다.

Denormalized Values

부동 소수점 형식에는 특수하게 처리되는 값들이 존재한다. exp=0000인 경우,

M=0.xxx...x2frac=xxx...x2

이는 0에 가까운 매우 작은 수들을 표현하기 위해 사용된다.

Special Values

  • 모든 비트가 0인 경우, 이는 0을 나타낸다. 부호 비트에 따라 +0과 -0을 구분할 수 있다.
  • exp=1111이고 frac=0000인 경우, 를 나타낸다. 부호 비트에 따라 +를 구분할 수 있다.
  • exp=1111이고 frac0000인 경우, NaN(Not a Number)을 나타낸다. 음수의 제곱근 등 표현식의 결과를 실수로 나타낼 수 없을 때 사용된다.


Floating Point Puzzles


1
2
3
int x = ...;
float f = ...;
double d = ...;

다음 명제의 참/거짓을 판단해 보자.

명제판단
x == (int)(float)x거짓
x == (int)(double)x
f == (float)(double)f
d == (double)(float)d거짓
f == -(-f)
2 / 3 == 2 / 3.0거짓
d < 0.0 (d * 2) < 0.0
d > f -f > -d
d * d >= 0.0
(d + f) - d == f거짓


References


이 글은 저작자의 CC BY-SA 4.0 라이선스를 따릅니다.