ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 부동소수점 표현 방식 [IEEE 754]
    공부방 2023. 8. 31. 11:56

    실수 표현 방식

    많은 프로그램 언어에서 실수를 표현하기 위해 IEEE 754 표준을 따르는 부동소수점 방식을 사용하고 있다. 

    부동소수점 방식이란, 소수점의 위치가 고정되지 않고 그 위치를 나타내는 수를 따로 적어 유효숫자를 나타내는 가수와 위치를 나타내는 지수로 표현하는 것을 말한다. 

    32bit float 에서 부동소수점 표기 방법을 예로 들면 다음과 같다.

    - 부호: 0이면 양수, 1이면 음수
    - 지수: 부호있는 정수. -127 ~ 128
    - 가수: 실제 값을 저장

     

    IEEE 754

    IEEE 754는 IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이다. 
    JAVA에서도 이 규격에 따라 부동소수점을 표현한다.

     

    단정도와 배정도

    정밀도는 유효자리수라고 이해할 수 있다. 단정도 (Single Precision, 단 정밀도) 는 32bit로 표현하고 배정도 (Double Precision, 배 정밀도) 는 64bit로 표현된다.

     

    계산 예시

    32bit float의 단정도 표현 예시로 -36.25를 계산해보자.

    1. 정수부 36을 이진수로 표현하면 100100이 된다
    2. 소수부 0.25를 이진수로 표현하면 01이 된다.
    3. 100100.01 에서 소수점을 이동시켜 정수부가 한자리가 되도록 변환하면 1.0010001 * 2^5 가 된다
    4. 최초 부호비트는 음수이기에 1이다.
    5. 지수부는 5에 32bit 단정도의 Bias인 127을 더해주어 10000100이 된다
    6. 가수부에는 실수값을 넣어주고 나머지는 0으로 채워 00100010000000000000000 이 된다.
    7. 결과값은 1100 0010 0001 0001 0000 0000 0000 0000 이 된다.

    위의 예시처럼 소수부분이 유한한 경우에는 나머지를 0으로 채우면 되지만 무한 소수인 경우에는 어떻게 될까? -36.4를 계산해보자

    1. 정수부 36을 이진수로 표현하면 100100이 된다
    2. 소수부 0.4를 이진수로 표현하면 011001100110...이다
    3. 100100.0110011001100110... 의 소수점을 이동시키면 1.00100011001100110... * 2^5 가 된다
    4. 부호 비트는 음수이기에 1이다. 
    5. 지수부는 5에 32bit 단정도의 Bias인 127을 더해주어 10000100이 된다.
    6. 가수부 23자리에 나머지 수를 채워주고, 24번째 자리에서 반올림을 해주면  00100011001100110011010 이 된다.
    7. 결과값은 1100 0010 0001 0001 1001 1001 1001 1010 이 된다.

     

    부동소수점 표현 방식에서의 부정확성

    위의 무한소수일 경우에서 알 수 있듯이 부동소수점으로 변환하는 과정에서 반올림을 사용하여 부정확한 값이 나올 수 있다. 

    double v1 = 0.4;
    double v2 = 0.8;
    System.out.println(v1+v2); //1.2000000000000002

    위의 코드처럼 0.4와 0.8을 더했을때 1.2가 아닌 1.2에 근사한 값이 나오는것을 볼 수 있다. 이때문에 정확한 소수점 계산이 필요한 경우 BigDecimal 을 사용하는게 좋다.

    '공부방' 카테고리의 다른 글

    HTTPS 통신 과정  (0) 2023.11.15
    OSI 7계층과 TCP/IP 4계층  (0) 2023.11.07
    Session과 Token  (0) 2023.10.20
    스프링과 디자인 패턴  (0) 2023.08.27
    CAP Theorem  (0) 2023.08.06
Designed by Tistory.