콘텐츠로 건너뛰기

자바의 부동소수점 연산

요 근래 블로그에 전혀 글을 쓰지 못하고 있다.

지금까지 한 번도 생각해 본 적이 없었던 부동소수점 연산에 관한 재미난 내용을 알게 되어서 포스팅하려 했는데… 블로그에 사용할 시간을 만들기가 여간 쉽지 않다.

요약하자면…

public class Test {
    public static void main(String[] args) {
        float a = 1.0f;
        float b = 0.9f;
        
        System.out.println("a - b = " + (a - b));
    }
}

위의 코드를 실행하면 나오는 값에 대한 문제인데…

출력되어야 할 결과물의 값이 0.1이어야 정상인데 실제로 실행 해 보면 0.100000024라는 엉뚱한 결과가 나온다.

이유는 자바(C를 비롯한 IEEE부동소수점 형식을 쓰는 언어)는 부동소수점 연산을 할 때, 내부적으로는 값을 2진수로 변환하여 연산 후 10진수로 나타내 주기 때문이다. 0.9를 2진수로 변환했다가 10진수로 변환하면 처음의 0.9라는 숫자가 나오지 않는다. 1을 3으로 나눈 후 3을 곱했을 때 정확하게 1이 나오지 않는 것과 비슷하다(이게 이해가 쉽다;;;).

코볼의 경우엔 부동소수점 연산을 위해 2진수가 아닌 BCD코드를 쓰는데, 덕분에 부동소수점 연산에 거의 정확한 값을 계산 해 낸다.(그래서 은행 같은 곳에선 코볼을 많이 썼나보다..)

연산해야 할 값이 커질수록 그 오차는 더욱 커지기 때문에 자바에선 정확한 부동소수점 연산이 필요한 경우엔 BigDecimal을 사용하면 된다. float라던가 double같은 원시타입 데이터형으로 연산을 하는 것 보다는 느려지겠지만 연산 후 신뢰성 있는 결과를 얻어낼 수 있다.

부동소수점 연산
부동소수점 연산

블로그에 할애 할 시간이 여유가 좀 있었다면, 찾아낸 재미난 자료들로 재미나게 글을 남기고 싶었지만…


2 개의 댓글

    1. 지금 검색을 해 봤는데 무척 재미있을 것 같은 책이네요^^
      최근에 책을 잘 사지 않았는데 구입예정 도서목록에 올려 놔야겠습니다.^^ㅋ

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다