소수란?
소수(decimal)는 1보다 큰 정수 중에서 1과 자기 자신만을 약수로 가지는 자연수를 뜻합니다. 예를 들어, 2, 3, 5, 7과 같은 숫자가 소수입니다.
프로그래밍에서 소수 연산을 다룰 때 일반적인 개념과 달리 컴퓨터의 소수점 표현 방식의 한계로 인해 일부 오차가 발생할 수 있습니다.
소수 표현
일부 실수 계산에서 우리가 흔히 예상하는 결과와 컴퓨터가 계산하는 결과가 달라질 수 있습니다. 예를 들어 0.1 + 0.2의 계산 결과는 이론적으로 0.3이지만, 컴퓨터는 이 결과를 정확히 표현하지 못할 때가 있습니다:
System.out.println(0.1 + 0.2 == 0.3); // 결과는 false
이와 같은 현상은 컴퓨터가 소수를 표현하는 방식인 "부동 소수점" 표현 방식의 한계로 인해 발생합니다.
부동 소수점(floating-point)의 한계
컴퓨터는 실수를 정확히 표현하지 못하는 경우가 많습니다. 컴퓨터에서 실수는 부동 소수점으로 표현되며, 이는 m * 2^n 형태로 나타낼 수 있습니다. 이때 m은 가수(significand), n은 지수(exponent)입니다. 이러한 표현 방식 때문에 일부 실수는 근사값으로 저장되며, 계산 과정에서 미세한 오차가 발생할 수 있습니다.
필수 배경 지식
부동 소수점 표현을 이해하기 위해 필요한 개념은 기수(radix)와 지수(exponent)입니다.
예를 들어 십진수 123.456을 지수와 기수의 형태로 표현하면:
- 123.456 = 1.23456 * 10^2
여기서 10은 기수이고, 2는 지수입니다.
이진수의 소수점 표현
컴퓨터에서는 이진수를 m * 2^n 형태로 표현합니다. 예를 들어, 1001011.1010101을 부동 소수점 형태로 나타내면:
- 1001011.1010101 = 1.0010111010101 * 2^6
이때, 2는 기수, 6은 지수, 1.001011은 가수로 표현됩니다.
IEEE 754 표준
컴퓨터에서 실수를 표현하기 위한 대표적인 방식은 IEEE 754 표준입니다. 이 표준은 가수와 지수를 특정 방식으로 분리하여 저장합니다.
가수와 지수의 저장 방식
- 가수 부분은 1을 제외하고 저장됩니다.
- 지수는 바이어스(bias)를 더해 저장합니다. 바이어스 값은 일반적으로 2^(k-1) - 1로 계산됩니다 (k는 지수 비트의 개수).
예제
IEEE 754 표준에서는 0.1과 같은 소수를 정확히 표현하지 못합니다. 0.1은 이진수로 표현할 때 무한히 많은 가수가 필요하기 때문에 근사값으로 저장되며, 이런 차이 때문에 0.1 + 0.2의 결과가 정확히 0.3이 아닌 값이 나올 수 있습니다.
문제점
십진수를 이진수로 변환할 때 일부 소수는 정확하게 표현되지 않아 무한히 반복되는 비트를 필요로 합니다. 이로 인해 컴퓨터는 근사값으로 소수를 표현하며, 이는 실수 계산에서 오차를 발생시킵니다. 대표적인 예로:
- 1/3은 십진수로 표현하면 무한히 반복되는 소수 0.3333...입니다.
- 1/10을 이진수로 표현할 때도 무한히 반복되는 패턴이 생깁니다.
따라서 0.1이나 0.2와 같은 값을 이진수로 변환하여 저장하면 약간의 오차가 발생하게 됩니다.
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] CPU 속도에 관여하는 것 (1) | 2024.10.13 |
---|---|
[컴퓨터 구조] 명령어 사이클과 인터럽트 (0) | 2024.07.16 |
[컴퓨터 구조] 레지스터 종류와 특징 (0) | 2024.07.09 |
[컴퓨터 구조] CPU 제어장치 (CU) (0) | 2024.07.05 |
[컴퓨터 구조] CPU의 ALU (0) | 2024.07.02 |