부동소수점 연산

프로그래밍 2008.07.15 02:11
요 근래 블로그에 전혀 글을 쓰지 못하고 있다.

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


요약하자면...


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같은 원시타입 데이터형으로 연산을 하는 것 보다는 느려지겠지만 연산 후 신뢰성 있는 결과를 얻어낼 수 있다.


블로그에 할애 할 시간이 여유가 좀 있었다면, 찾아낸 재미난 자료들로 재미나게 글을 남기고 싶었지만...S
top
     TAG , ,
  1. 경기도야근인 2008.07.17 01:16 신고 수정/삭제 댓글

    자바 퍼즐러 읽어봐.

    • Favicon of http://signpen.net 싸인펜 2008.07.19 01:39 신고 수정/삭제

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

댓글 쓰기