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.4.1 Fractional Binary Numbers

십진법에서, 라고 표현하듯이,
이진법에서는, 라고 표현할 수 있다.
"." 의 왼쪽은 지수가 양수, 오른쪽은 지수가 음수로 이해할 수 있다.
"." 의 위치를 왼쪽으로 한 칸 움직이면, 2로 나누는 것이 되며, 오른쪽은 2를 곱하는 것으로 해석할 수 있다.

는 해당 자릿수로 나타낼 수 있는 가장 1에 근접한 소수이다.
예를 들어, 이다. 나중에 이러한 표기로 를 사용한다.
십진수에서 특성 소수() 을 표현하지 못하듯이 이진법에서도 불가능한 숫자들이 있다.
가능한 숫자는 모두 의 형태를 띈다.

2.4.2 IEEE Floating-Point Representation

위의 표기는 비효율적이다. 의 경우, 101 개의 bit 가 필요하다.
대신에, 로 표현한다.

  • : 부호로서, 1이라면 음수를, 0이라면 양수를 나타낸다.
  • : 2진수로 표현된 소수이다. 단, 다음 범위를 만족한다.
    • 사이 혹은 사이
  • : 로 표현되는 가 음수가 가능한 가중치를 의미한다.

크게 4가지의 경우의 수가 있다.
PARA/Project/CS_APP_organize/chapter2/imgs/floating_point.png
single-precision format

  • : 1번째 bit
  • : 8(= k) 번째 bit
  • : 23(= n) 번째 bit

double-precision format

  • : 1번째 bit
  • : 11(= k) 번째 bit
  • : 52(= n) 번째 bit

Case 1: Normalized Values

가장 흔한 경우로, 의 bit 패턴이 모두 0이거나 모두 1이 아닌 경우이다.
이 때, exponant value 는 로 해석된다.
는 부호 없는 bit 표현이며, 의 값을 갖는다.

은 그 값을 라고 했을 때, 을 만족한다.
로 정의된다. 이것은 표현이라고 불린다.
해당 값은 항상 을 가지기 때문에, 이며,
1이 항상 지수부분에 오므로, 생략함으로서 비트를 효율적으로 사용한다.

Case 2: Denormalized Values

의 값이 모두 0 임을 의미한다.
를 가지며, significand 는 이다.
즉, 의 적용이 되어있지 않다.

이 경우는 2가지의 목적이 있다.

첫번째는 0을 표현한다.
Case 1 에서는 항상 이 1 이상이므로 0을 표현할 방법이 없다.
모든 bit 가 0 인 것을 , 부호비트가 1이고 나머지가 모두 0인 것을 으로 해석한다.
이 둘의 구분은 어떤 점에선 다르기도 하다.

2번째는 0.0 에 매우 가까운 숫자를 표현하는 것이다.
0.0 에 가까워지는 숫자에게 라는 특성을 부여한다.

Case 3: Special Values

exponand 가 모두 1인 경우이다.
fraction 부분이 모두 0이라면, 무한을 의미한다. 이라면 을, 이라면 이다.
이는 결과가 OverFlow 임을 의미한다.

fraction 부분이 모두 0이 아니라면, 라고 부른다.

2.4.3 Example Numbers

PARA/Project/CS_APP_organize/chapter2/imgs/floating_point_range.png

한 가지 재미있는 특성은 이 bit 표현을 부호 없는 정수로 해석할 때,
정렬 순서가 원래 의도인 floating-point 와 동일하다는 것이다.
이는 정수와 정렬하는 방법과 동일한 방법으로 정렬하고자 하는 IEEE 의 의도된 설계이다.

앞에서 정수 표현과 소수 표현에서 일부 bit 패턴이 겹친다고 했고, 의도된 사항이라고 했는데,
이는 소수 표현을 만드는 방법을 떠올리면 된다.
먼저 해당하는 숫자를 로 표현하는데, 이 때 부분이 결국 정수 표현과 동일하다.
따라서 소수 부분을 나타내는 부분이 정수와 일치할 수 있다.

2.4.4 Rounding