위 수식이 틀린 이유는? (개발자 면접 타임)
코딩애플 (Computer Science)|조회 4|2026.06.09 10:18
0:00 / 5:33
위 수식이 틀린 이유는? (개발자 면접 타임)
5:33💻 컴퓨터가 소수를 계산할 때 오차가 발생하는 이유
1. 문제 제기
- 프로그래밍 언어에서
1.1 + 0.2를 계산하면1.3이 아니라1.3000000000000003같은 이상한 값이 나옵니다. - 이는 자바스크립트뿐만 아니라 대부분의 프로그래밍 언어에서 발생하는 현상입니다.
2. 컴퓨터의 숫자 저장 방식
정수 저장 (이진법)
- 컴퓨터의 RAM(메모리)은
0과1만 저장할 수 있는 공간입니다. - 예를 들어 정수
5를 저장하려면 이진법101로 변환하여 메모리 칸에 채워 넣습니다.
소수 저장 (부동 소수점, Floating Point)
- 컴퓨터는 소수를 효율적으로 연산하기 위해 주로 IEEE 754 부동 소수점 표준 방식을 사용합니다.
- (32비트 Float 기준) 메모리를 32칸 마련한 뒤 나누어 저장합니다:
- 부호 비트 (1칸): 양수(0) 또는 음수(1) 표시
- 지수 비트 (8칸): 소수점의 위치 기록
- 가수 비트 (23칸): 이진수로 변환한 실제 숫자 데이터 기록
3. 오차가 발생하는 근본적인 원인
0.125같은 소수는 이진법으로 변환하면 깔끔하게 딱 떨어집니다.- 하지만
0.1같은 숫자는 이진법으로 변환하면0.0001100110011...처럼 무한히 반복되는 무한소수가 됩니다. - 컴퓨터의 메모리 공간(32비트 또는 64비트)은 한정되어 있기 때문에, 표현할 수 없는 뒷부분을 잘라내고(Truncate) 저장합니다.
- 즉, 컴퓨터에
0.1을 저장하는 것은 정확한0.1이 아니라0.1과 가장 가까운 근사값을 저장하는 것입니다. 이 때문에 미세한 오차가 누적되어 연산 결과가 틀어지게 됩니다.
4. 역사적 사건 (오차의 위험성)
- 걸프전 패트리어트 미사일 요격 실패 (1991년)
- 패트리어트 미사일 시스템은 내부 변수에
0.1초씩 더해나가며 시간을 측정했습니다. - 당시 24비트 메모리 시스템을 사용하여
0.1을 표현하는 과정에서 미세한 오차가 발생했습니다. - 시스템을 100시간 동안 연속 가동하자, 누적된 오차가 약 0.34초에 달했습니다.
- 이 아주 작은 시간 오차 때문에 날아오는 미사일의 좌표 계산이 틀어져 요격에 실패했고, 결국 28명의 군인이 전사하는 비극이 발생했습니다.
- 패트리어트 미사일 시스템은 내부 변수에
5. 개발자를 위한 해결책 및 교훈
돈 계산처럼 아주 정확해야 하는 연산에서는 부동 소수점을 그대로 사용하면 위험합니다.
- 정수(Integer) 변환 후 연산:
- 소수에
100이나1000을 곱해 정수로 만들어 연산한 뒤 나중에 다시 나누는 방식을 씁니다. - 예:
$5.10를 저장할 때5.1이 아닌510 센트(Cent)로 저장 및 연산.
- 소수에
- 반올림 함수 사용:
- 연산 후 프로그래밍 언어가 제공하는 반올림 문법(
toFixed(),round()등)을 적절히 활용합니다.
- 연산 후 프로그래밍 언어가 제공하는 반올림 문법(
- Double(64비트) 자료형 사용:
- Float(32비트) 대신 메모리 공간을 2배 더 쓰는 Double(64비트)을 사용하면 오차 범위를 극도로 줄일 수 있습니다. (정확도가 높아야 할 때 유용)