Skip to content

IEEE 754

IEEE 754는 부동 소수점의 표현과 연산에 대해 정의한 표준 명세입니다. 대부분의 프로그래밍 언어에서 지원하는 실수 자료 형식은 IEEE 754 명세를 기반으로 구현되어 있습니다.

부정확성

실수 연산을 하다보면 필연적으로 \frac{1}{3}이나 \pi=3.14159...과 같은 무한 소수를 사용하게 됩니다. 0.1_{10} = 0.000110011..._{2}와 같이 10진수로 표현할 때는 유한 소수지만 2진수로 표현하려면 무한 소수인 경우도 있습니다. 이 때 CPU는 표현할 수 있는 실수 중에서 가장 가까운 값을 이용하여 계산합니다.

문제는 가까운 값을 찾는 작업이 IEEE 754 명세에 정의되어 있지 않아서 CPU마다 구현이 다르다는 점입니다. 그리고 CPU마다 다양한 부동 소수점 확장 명령어가 있습니다. 즉, 컴파일러 설정에 따라서 같은 소스 코드를 컴파일한 프로그램이라도 실행 환경에 따라 조금씩 다른 값을 내놓을 수 있습니다.

부동 소수점과 10진수 표기법간의 관계

일반적으로 부동 소수점 형식을 JSON과 같은 문자열 형식으로 직렬화할 때 특정 자리에서 반올림하거나 버려서 저장합니다. 이렇게 저장한 값을 다시 읽어들일 경우 저장한 값과 비트 단위로 같다는 보장을 할 수 없습니다.

물론 많은 상황에서 허용가능한 오차의 범위로 받아들여져서 문제는 없지만, 이 사실을 인지하고 있지 않으면 실제로 문제가 생겼을 때 디버깅에 많은 시간을 낭비하게 됩니다. 디버거에서조차 근사값으로 보여주기 때문이죠.

읽을거리