컴퓨터가 숫자를 표현하거나 계산할 때 사용하는 두가지 방식
8 자리로 숫자표현을 할 때
위의 두가지 방식 중에 위의 것이 정수의 표현 방식이고 아래와 같은 방식이 부동소수(자리가 정해지지 않은 소수점)의 표현 방식이다.
따라서, 컴퓨터에서 제한된 자리수를 가지고 숫자를 표현할 때 부동소수 방식을 사용하면 훨씬 더 많은 범위 및 훨씬 해상도 높은 숫자(1.0000001~1.9999999 처럼 1 과 2사이를 엄청나게 세분화하여 표현 가능)를 표현할 수 있다. 다만 계산의 정확성은 정수형 표현이 정확하고 계산의 속도 또한 빠르다.3)
Double Precision
배정밀도(double precision)는 정수와 부동소수점을 모두 다루는 방법 중 하나입니다.
정수와 부동소수점에서의 배정밀도는 각각 데이터 형식에 따라 다르지만, 모두 더 큰 범위와 높은 정밀도를 제공하여 계산의 정확성을 향상시키는 데 사용됩니다.
정수형 표현 범위
| 비트 수 | 계산식 | 결과 | 자릿수 |
|---|---|---|---|
| 16비트 | 216 | 65,536 | 5자리 |
| 24비트 | 224 | 16,777,216 | 8자리 |
| 32비트 | 232 | 4,294,967,296 | 10자리 |
| 48비트 | 248 | 281,474,976,710,656 | 15자리 |
| 56비트 | 256 | 72,057,594,037,927,936 | 17자리 |
| 64비트 | 264 | 18,446,744,073,709,551,616 | 20자리 |
| 설명 | 계산식 | 결과 | 자릿수 |
|---|---|---|---|
| 최소 양수 정규화값 | 1.0 × 2-126 | 1.1754944 × 10-38 | 38자리 |
| 최대 양수값 | (2 - 2-23) × 2127 | 3.4028235 × 10+38 | 38자리 |
부동소수 연산의 정밀성 손실 문제를 구체적인 예시로 설명해보겠습니다.
예를 들어, 우리가 다음과 같은 두 개의 부동소수를 더한다고 가정해봅시다:
이 두 부동소수를 더하면 우리는 0.3 x 10-20이 나와야 한다고 예상할 수 있습니다. 그러나 컴퓨터에서는 부동소수점을 표현할 때 소수점 이하의 정밀도에 한계가 있기 때문에 정확한 결과를 얻기 어렵습니다.
실제로 컴퓨터에서 이러한 덧셈을 수행하면 다음과 같은 결과가 나올 수 있습니다:
따라서 이 두 수를 더하면 0.30000000000000000000009 x 10-20 정도의 값이 나올 수 있습니다. 이것은 우리가 원했던 0.3 x 10-20과 약간 다른 값이며, 부동소수점 연산의 정밀성 손실로 인해 발생한 것입니다.4)
이러한 예시를 통해, 부동소수 연산에서의 정밀성 손실이 어떻게 발생하는지 좀 더 구체적으로 이해할 수 있습니다.
이러한 오차는 금융 분야에서의 시간, 금액 계산이나, 공학에서의 정밀 계산이 필요한 분야에서는 큰 오류를 범할 수 있지만, 그래픽 분야 또는 오디오 분야에서는 큰 문제가 되지 않습니다. 그래서, 그래픽 카드에서 쓰이는 GPU에서는 거의 부동소수형 연산자를 가진 칩을 사용하고, 오디오 쪽에서는 최근 부동소수형 DSP 칩들이 레이턴시가 짧아진 제품들이 나오면서5) 부동소수형 연산칩을 사용하는 경향이 있습니다.