TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 24 READS

부동소수점 대신 쓸 수 있는 것들: 십진수·유리수·구간연산의 실무 지도

부동소수점 대신 쓸 수 있는 것들: 십진수·유리수·구간연산의 실무 지도
SOURCE IMAGE · HACKER NEWS

거의 모든 프로그래머는 언젠가 한 번쯤 0.1 + 0.2가 왜 0.3이 아니라 0.30000000000000004가 되는지를 겪는다. 이는 버그가 아니라 우리가 매일 쓰는 이진 부동소수점(IEEE 754 binary)의 근본적인 성질이다. 십진수 0.1은 2진수로 딱 떨어지지 않기 때문에, 컴퓨터는 가장 가까운 근삿값을 저장할 수밖에 없다. 일러스트레이터 줄리아 에번스(Julia Evans)의 진(zine) 『How Integers and Floats Work』의 한 대목은, 이 문제를 우회하기 위해 사람들이 실제로 사용해 온 대안 수 표현들을 한눈에 정리한다. 이 대안들의 공통점은 하나다. 대부분 하드웨어가 아니라 소프트웨어로 구현되어 있고, 그래서 훨씬 느리며, 언어마다 지원하는 라이브러리가 다르다는 점이다.

십진 부동소수점과 유리수: 정확성을 사는 두 가지 방법

첫 번째 대안은 십진 부동소수점(decimal floating point)이다. 원리는 일반 부동소수점과 똑같지만, 밑(base)이 2가 아니라 10이라는 점만 다르다. 사람이 십진수로 쓴 값을 그대로 십진수로 저장하니, 0.1 같은 값이 근사 없이 표현된다. 이 방식 역시 IEEE 754 표준에 포함되어 있으며, 파이썬의 decimal 모듈이나 자바의 BigDecimal이 대표적인 구현이다. 돈을 다루는 회계·결제 시스템에서 float 대신 이런 십진 타입을 쓰라는 조언이 나오는 이유가 여기에 있다. 통화 단위의 반올림 오차가 누적되면 장부가 맞지 않기 때문이다.

두 번째는 유리수(fraction, rational) 표현이다. 숫자를 소수가 아니라 분자와 분모의 쌍으로 저장하는 방식으로, 1/10 + 2/10이 정확히 3/10이 된다. 십진 부동소수점이 '십진수로 표현 가능한 값'까지만 정확하다면, 유리수는 임의의 분수를 오차 없이 다룰 수 있다. 파이썬 표준 라이브러리의 fractions 모듈이 이를 제공하며, 리스프(Lisp) 계열 언어들은 유리수를 언어 차원에서 일급 시민으로 지원한다.

기호 연산과 구간 연산: 문제의 성격이 다를 때

세 번째 대안은 기호 연산(symbolic computation)이다. 수를 근삿값으로 계산하는 대신 √2나 π 같은 값을 기호 그대로 유지하며 대수적으로 다룬다. 매스매티카(Mathematica), 메이플(Maple), 파이썬의 sympy 같은 컴퓨터 대수 시스템(CAS)이 이 방식을 쓴다. 수치 계산이 아니라 수식 자체를 조작해야 하는 연구·교육 영역에서 강력하지만, 일반적인 애플리케이션 로직에 끌어다 쓸 물건은 아니다.

네 번째는 구간 연산(interval arithmetic)이다. 모든 수를 하나의 값이 아니라 범위로 저장해, 계산이 진행되는 동안 오차의 상·하한을 정밀하게 추적하는 발상이다. 결과가 '얼마인지'뿐 아니라 '얼마나 믿을 수 있는지'를 함께 들고 다니는 셈이다. 소스에서도 짚듯 이 방식은 위 대안들 가운데 가장 비주류에 속하지만, 오차 한계를 보증해야 하는 특정 과학 계산에서는 고유한 가치를 지닌다.

마지막으로 소개되는 BCD(이진화 십진수, binary coded decimal)는 성격이 조금 다르다. 이는 1960년대 IBM 컴퓨터가 정수와 부동소수점을 저장하던 방식으로, 각 십진 자릿수를 별도의 비트 묶음으로 표현한다. 지금은 거의 사라졌지만, 금융 거래 표준인 ISO 8583 같은 오래된 포맷에서 여전히 마주칠 수 있다. 레거시 결제·전문 처리 시스템을 다루는 개발자라면 완전히 남의 이야기가 아니다.

무엇을 언제 고를 것인가

실무자의 관점에서 핵심은 '이진 부동소수점이 틀렸다'가 아니라 '문제의 성격에 맞는 수 표현이 따로 있다'는 것이다. 물리 시뮬레이션이나 그래픽스처럼 속도가 중요하고 미세한 오차가 허용되는 영역에서는 하드웨어 가속을 받는 일반 float가 여전히 최선이다. 반면 금액·세금 계산처럼 정확한 자릿수가 곧 정합성인 곳에서는 십진 타입이, 정확한 분수 연산이 필요한 곳에서는 유리수가 어울린다. 다만 이 대안들이 대부분 소프트웨어 구현이라 느리다는 점, 그리고 언어와 라이브러리마다 지원 범위가 제각각이라는 점은 도입 전에 반드시 저울질해야 할 비용이다. 정확성은 공짜가 아니며, 어떤 종류의 정확성이 필요한지를 먼저 정의하는 것이 도구 선택의 출발점이다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://wizardzines.com/comics/floating-point-alternatives/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...