부동소수점수는 왜 0.1을 표현못할까?

    ++IEEE 754, 부동소수점수와 고정소수점의 차이

    ++소수점이하 2진수 변환

    ++IEEE 754, 32비트와 64비트의 표현범위/

     

    소수점 이하 수들을 2진수로 변환하는 방법을 이해하면 쉽다.

    소수 부분을 2진수로 변환하기 위해선, 소수 부분이 0이 될때까지 2를 곱하게 된다.

    하지만, 정수부분을 변환하는 경우와는 다르게, 소수부분을 변환할 때에는 아무리 곱해도 0이 되지않는 경우가 생긴다.

    0.1이 바로 이런 경우인 것이다. 0.1에 아무리 곱해도 소수부분을 없앨수는 없다.

    아무리 넓은 범위를 표현할 수 있는 부동소수점수도 결국 표현할 수 있는 범위의 한계가 있다.

    따라서 컴퓨터는 0.1을 2진수로 변환하는 중 표현범위의 한계에 다다르면 뒷부분은 날려버린다!

     

    double과 float에서의 0.1의 값이 다른 것도 이와 같은 이유이다.

    double같은 경우 float의 약 두배 이상의 범위를 저장할 수 있다.

    하지만 double의 경우도 표현범위의 한계에 다다르면 뒷부분은 날려먹는다..

    물론 double에 저장되는 값이 float보단 더 정확하겠지만, 우리가 원하는 0.1은 얻을 수 없다.

    '코딩 > [JAVA]' 카테고리의 다른 글

    Interface에는 왜 protected 접근지정을 사용할 수 없을까?  (0) 2023.06.25
    접근 지정자 비교하기  (0) 2023.06.18
    이것이 자바다. 3~4  (0) 2022.11.17
    [JAVA] 이것이 자바다.1-2  (0) 2022.11.08

    댓글