2.4-Floating_Points
Floating Point 는
매우 큰 수, 0에 근접한 수, 더 일반적으로 실제 연산의 근삿값으로 유용하다.
1980년전에는 각자만의 규격으로 소수를 구현했다.
그 당시 컴퓨터 제작자의 관심사는 정확도가 아닌, 속도와 구현의 난이도 였다.
1985년, IEEE Standard 754 가 생기면서, 소수 표현과 연산 방법에 대한 표준이 정립되었다.
1976년, Intel 의 8087 chip, 8086 에서 floating point 를 지원하는 칩,
을 디자인했다.
현대에 와서는 대부분의 컴퓨터가 IEEE floating point 를 지원한다.
이 챕터에서는 floating point 를 알아보며, round 관련 이슈를 살펴본다.
이는 숫자를 정확히 표현할 수 없기 때문에, 생기는 올림/내림에 의해 발생한다.
이후, 사칙연산, 관계 연산자의 수학적 특성을 살펴본다.
또한, 해당 표준이 작고 일관적인 규칙으로 이루어져있으며, 이로 인해 이해하기 쉽고, 우아하다는 것을 이해한다.
십진법에서,
이진법에서는,
"." 의 왼쪽은 지수가 양수, 오른쪽은 지수가 음수로 이해할 수 있다.
"." 의 위치를 왼쪽으로 한 칸 움직이면, 2로 나누는 것이 되며, 오른쪽은 2를 곱하는 것으로 해석할 수 있다.
예를 들어,
십진수에서 특성 소수(
가능한 숫자는 모두
위의 표기는 비효율적이다.
대신에,
크게 4가지의 경우의 수가 있다.
single-precision format
double-precision format
가장 흔한 경우로,
이 때, exponant value 는
해당 값은 항상
1이 항상 지수부분에 오므로, 생략함으로서 비트를 효율적으로 사용한다.
즉,
이 경우는 2가지의 목적이 있다.
첫번째는 0을 표현한다.
Case 1 에서는 항상
모든 bit 가 0 인 것을
이 둘의 구분은 어떤 점에선 다르기도 하다.
2번째는 0.0 에 매우 가까운 숫자를 표현하는 것이다.
0.0 에 가까워지는 숫자에게
exponand 가 모두 1인 경우이다.
fraction 부분이 모두 0이라면, 무한을 의미한다.
이는 결과가 OverFlow 임을 의미한다.
fraction 부분이 모두 0이 아니라면,
한 가지 재미있는 특성은 이 bit 표현을 부호 없는 정수로 해석할 때,
정렬 순서가 원래 의도인 floating-point 와 동일하다는 것이다.
이는 정수와 정렬하는 방법과 동일한 방법으로 정렬하고자 하는 IEEE 의 의도된 설계이다.
앞에서 정수 표현과 소수 표현에서 일부 bit 패턴이 겹친다고 했고, 의도된 사항이라고 했는데,
이는 소수 표현을 만드는 방법을 떠올리면 된다.
먼저 해당하는 숫자를
따라서 소수 부분을 나타내는 부분이 정수와 일치할 수 있다.