실수를 이진수로


실수 ↔ 이진수

image.png

  1. 1 보다 작은 10진수의 실수에 2를 곱한다.

    ⇒ 정수 부분은 1 or 0이 나올 것이다.

  2. 정수 부분을 2진수 값에 추가한다.

  3. 소수점 이하에 아무것도 남지 않을 때까지 반복한다.

  4. 반대는 역순으로 1/2, 1/4, 1/8, .. 곱하면된다.

    예시 : 0.625
    -->  1.250  -->  정수 부분 **"1"**을 떼고, 2를 곱한다.
    -->  0.500  -->  정수 부분 **"0"**을 떼고, 2를 곱한다.
    -->  1.000  -->  정수 부분 **"1"**을 떼고, 2를 곱한다.
    -->  0.000  
    
    결과 : **101**(2)
    

순환 이진소수

모든 소수부가 0.625처럼 깔끔하게 이진수로 변환되어 메모리에 저장되면 좋겠지만 그렇지 않다. 0.12 같은 경우 메모리에 저장될 때 아래와 같이 무한 순환소수로 저장된다. 컴퓨터에서 소수 연산이 부정확한 이유다.

0.12  ->  0. 0001 1110 1011 1000 0101 0001 ..(반복)

실수의 메모리 표현

컴퓨터는 소수를 고정 소수점 방식과 부동 소수점 방식으로 표현한다.


고정소수점 방식

image.png

32bit에서 맨 앞 1bit를 부호 비트로 잡는다. 15bit는 정수 부분, 나머지 16bit를 소수 비트로 잡는다. 맨 앞은 음수이면 1, 양수일 땐 0이 온다.

image.png

5.625를 2진수로 표현했을 때, 양수임으로 맨 앞 bit를 0으로 잡는다. 5 → 101, 0.625 → 101 로 변환이 가능함으로 결과는 101.101 이 된다. 이 방식의 장점은 누가봐도 직관적이다.