컴퓨터는 모든 것을 0과 1로 처리합니다. 정수는 딱 떨어지게 저장할 수 있지만, '0.1'과 같은 소수는 2진수로 변환하는 과정에서 무한 소수가 되어버리곤 하죠. 이 미세한 차이가 쌓이면 거대한 설비가 멈추거나 금융 사고가 발생할 수도 있습니다. 오늘은 실수 연산의 함정을 피하는 법을 기초부터 고급까지 다뤄보겠습니다! 😊
1. 기초: 컴퓨터가 실수를 기억하는 법 (IEEE 754)
컴퓨터는 실수를 저장할 때 **'부동 소수점(Floating Point)'** 방식을 사용합니다. 소수점의 위치를 고정하지 않고 '떠다닌다'는 뜻이죠. 이는 부호(Sign), 지수(Exponent), 가수(Mantissa) 세 부분으로 나뉩니다.
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. 고급: 전문가의 정밀도 제어 기법
금융권이나 정밀 제어에서는 실수 대신 정수를 사용합니다. 예를 들어 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)이 오차가 훨씬 적음
실수 연산의 오차는 버그가 아니라 컴퓨터의 구조적 특징입니다. 이 특징을 정확히 이해하고 제어할 수 있다면 여러분은 이미 중급 이상의 개발자/엔지니어입니다! 질문이 있다면 댓글로 남겨주세요. 😊
'PLC > 프로그래밍 및 명령어 활용' 카테고리의 다른 글
| PLC 실무 기술: 펑션 블록(FB)과 표준화를 활용한 고품질 프로그램 작성법 (0) | 2026.04.10 |
|---|---|
| 실수 연산 오차와 간접 주소 지정: 고급 엔지니어로 가는 필수 관문 (0) | 2026.04.09 |
| PLC 코딩 시간을 절반으로! 인덱스 레지스터(Index Register) 활용 꿀팁 (0) | 2026.04.07 |
| PLC 간접 주소 지정과 인덱스 레지스터: 원리부터 실무 사례까지 (0) | 2026.03.22 |
| PLC 시프트 레지스터(SFTL) 완벽 이해: 공정 추적의 핵심 기술 (0) | 2026.03.21 |