PLC/프로그래밍 및 명령어 활용

실수 연산 기초부터 고급까지: 누적 오차를 잡는 전문가의 노하우

기계의 심장 박사 2026. 4. 8. 00:01
반응형

 

[실수 연산 완벽 가이드] "0.1 + 0.2는 왜 0.3이 아닐까?" 프로그래밍과 PLC 제어에서 빈번하게 발생하는 실수 연산의 오차 원인과 이를 해결하는 고급 기법을 단계별로 알아봅니다.

컴퓨터는 모든 것을 0과 1로 처리합니다. 정수는 딱 떨어지게 저장할 수 있지만, '0.1'과 같은 소수는 2진수로 변환하는 과정에서 무한 소수가 되어버리곤 하죠. 이 미세한 차이가 쌓이면 거대한 설비가 멈추거나 금융 사고가 발생할 수도 있습니다. 오늘은 실수 연산의 함정을 피하는 법을 기초부터 고급까지 다뤄보겠습니다! 😊

 

1. 기초: 컴퓨터가 실수를 기억하는 법 (IEEE 754)

컴퓨터는 실수를 저장할 때 **'부동 소수점(Floating Point)'** 방식을 사용합니다. 소수점의 위치를 고정하지 않고 '떠다닌다'는 뜻이죠. 이는 부호(Sign), 지수(Exponent), 가수(Mantissa) 세 부분으로 나뉩니다.

💡 핵심 포인트: 2진수로 변환했을 때 딱 떨어지지 않는 숫자는 근사치로 저장됩니다. 즉, 우리가 보는 '0.1'은 내부적으로 '0.10000000149...' 일 수 있다는 뜻입니다.

 

2. 중급: 실수 연산 시 절대 금지 사항

① '==' (동등 비교)를 사용하지 마세요

앞서 말한 미세한 오차 때문에 `if (value == 0.3)`과 같은 조건문은 거짓(False)이 될 확률이 매우 높습니다. 대신 '차이의 절대값'이 특정 임계치(Epsilon)보다 작은지 확인해야 합니다.

② 누적 오차의 공포

0.0001을 10,000번 더하면 정확히 1이 될까요? 실제 연산 결과는 1에서 미세하게 벗어납니다. 반복문 안에서 실수를 계속 더하는 방식은 지양해야 합니다.

잘못된 코드 올바른 코드
if (x == 0.3) if (abs(x - 0.3) < 0.0001)
실수를 계속 누적 덧셈 정수로 계산 후 마지막에 나눗셈

 

3. 실전 체험: 부동 소수점 오차 확인하기 🧪

아래 버튼을 눌러보세요. 컴퓨터가 0.1을 10번 더했을 때 어떤 결과가 나오는지 바로 확인할 수 있습니다.

반복 연산 시뮬레이터

"0.1을 10번 더하면 1.0이 될까?"

 

4. 고급: 전문가의 정밀도 제어 기법

🚀 고정 소수점(Fixed Point) 기법 활용
금융권이나 정밀 제어에서는 실수 대신 정수를 사용합니다. 예를 들어 1.23달러를 저장할 때 `1.23`(Float)이 아니라 `123`(Integer, 단위: 센트)으로 저장하고, 출력할 때만 100으로 나눕니다. 이 방식은 오차가 0%입니다.

또한, PLC나 저사양 MCU에서 연산 속도가 중요하다면 **'단정밀도(Float)'** 대신 **'배정밀도(Double)'**를 사용하여 오차 범위를 줄이거나, 수치 해석적 기법(Kahan Summation 등)을 사용해 누적 오차를 상쇄시킵니다.

 

📝 핵심 요약
  • 원인: 10진수 소수를 2진수로 변환할 때 발생하는 무한 소수 때문
  • 비교: == 대신 Math.abs(a - b) < epsilon 사용
  • 해결: 정밀도가 중요하다면 정수로 변환하여 연산 후 다시 나누기
  • 선택: Float(32bit)보다는 Double(64bit)이 오차가 훨씬 적음

실수 연산의 오차는 버그가 아니라 컴퓨터의 구조적 특징입니다. 이 특징을 정확히 이해하고 제어할 수 있다면 여러분은 이미 중급 이상의 개발자/엔지니어입니다! 질문이 있다면 댓글로 남겨주세요. 😊

반응형