ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터 구조] 고정소수점 VS 부동소수점
    Computer Science/Computer Architecture 2023. 1. 17. 00:07
    반응형

    들어가기 전 : 이진기수법

    컴퓨터는 0과 1로 이루어진 기계어를 사용
    ➡️ 이진기수법은 2가 나올 차례가 되면 2를 쓰는 대신 자릿수를 늘려주는 방식

    [ 정수부 ]

    정수부에서는 10진수를 2로 나눠가면서 1이나 0을 뽑아냄

    - 10진수 4 : 2진수 100
    - 10진수 8 : 2진수 1000

    - 10진수 16 : 2진수 10000

    [ 소수부 ]

    소수부는 10진수에 2를 곱해가며 1이나 0을 뽑아냄

    ※ 0.625의 변환 과정
    - 0.625 * 2  = 1.25 ➡️ 1 (나머지 0.25)

    - 0.25 * 2 = 0.5 ➡️ 0 (나머지 0.5)

    - 0.5 * 2 = 1.0 ➡️ 1 (나머지 0)

    ➡️ 최종 0.101

    고정소수점 방식 (Fixed Point)

    - 소수점이 찍힐 위치를 미리 정해놓고 소수를 표현하는 방식 (정수 + 소수)
    - 이진기수법으로 변환한 결과를 그대로 넣는 방식

    - 16비트 체계를 쓴다고 했을 때, ① 부호 비트(Sign Bit) ②정수부 ③소수부로 구분

    - 소수점의 위치를 미리 정해놓고, 앞에서부터 채우며 남는 뒷자리는 0으로 채움
    - 7.625 라는 실수를 표현할 경우, 아래와 같이 표현됨

    - 장점: 실수를 정수부와 소수부로 표현하여 단순
    - 단점: 소수부의 자릿수가 작아 표현 범위가 너무 적고 정밀도가 낮아 실수를 다루는 범용 시스템에서는 활용도가 낮음

    부동소수점 방식 (Floating Point)

    - 부동소수점은 2진수로 변환한 결과를 정규화하는 과정을 거침

    - 2진수의 정규화는 2진수를 1.xxxx... * 2^n 꼴로 변환하는 것을 의미 ➡️ 소수점을 이동시킨다 하여 floating point

     

    [ 변환 방법 ]

    ① 2진수의 정수부에 1만 남을 때까지 소수점을 왼쪽(정수부가 0일 경우, 오른쪽)으로 이동
    ② 이동한 칸 수만큼 n자리에 집어 넣음

    (ex. 111.101을 정규화하면 1.11101 * 2^2 가 됨)

     

    [ IEEE 754 부동소수점 표현 ]

    - 현재 사용되고 있는 부동소수점 방식은 대부분 IEEE 754 표준을 따르고 있음

    - 부동소수점 방식으로 실수를 저장하는데는 32비트, 64비트가 사용되며 32비트 기준으로 아래 그림과 같은 구조를 가짐

    - 부호비트: 고정소수점과 마찬가지로 0이면 양수, 1이면 음수를 의미

    - 가수부: 정규화 결과 소수점 오른쪽에 있는 숫자들을 왼쪽부터 그대로 삽입. 남는 자리는 0으로 채움.

    (*참고: 소수점 왼쪽은 정규화를 하면 무조건 1이기 때문에 별도로 표현하지 않으며, hidden bit라고 표현함)

    - 지수부: bias라는 지정된 숫자를 n에 더해 2진수로 넣어야 함.
       즉, 위의 예시에서 2 + 127 = 129를 이진수로 바꾼 10000001 이 들어가야 함

    📍bias를 쓰는 이유
    : 지수가 음수가 될 수도 있기 때문
    ex. 0.000101이라는 이진수의 경우, 정수부를 1로 만들기 위해 오른쪽으로 소수점을 이동해 1.01 * 2^-4 형태가 됨
    ➡️ 자리수의 음수값을 표현할 방법이 없음 (부호 비트는 전체 숫자 부호이기 때문에 이와 상관 없음)
    ✅ 최종적으로 10진수 기준 0~127 구간은 음수, 128~255 구간은 양수를 표현하도록 만듦

    - 위의 32비트 체계를 32비트 단정도(Single-Precision), 64비트 체계를 64비트 배정도(Double-Precision)이라 부름
    ➡️ 자바의 실수형 타입인 float, double이 이를 의미.
        (부동소수점 방식을 사용하는 기본형이라는 의미로 float, 64비트 배정도를 사용한다는 의미로 double)

    ➡️ double은 64비트 체계에서 지수부가 11비트, 가수부가 52비트로 2^11, 2048개의 수를 표현할 수 있으며
         0~1023 구간은 음수, 1024~2047 구간은 양수 지수를 의미하며 bias는 1023이 됨

    - 장점 : 고정 소수점보다 훨씬 더 많은 범위의 실수를 표현할 수 있음

    - 단점 : 10진수를 정확하게 표현할 수 없어 계산 결과는 항상 근사치임

    반응형

    댓글

Designed by Tistory.