👾 내일배움캠프/🎮 TIL & WIL

내일배움캠프 (휴일) TIL - 부동소수점 표기법

리리핸 2023. 9. 3. 22:32

갑자기 캠프 내 스승님이 요상한  TMI를 던져서 공부하게 된 내용

 

"부동소수점의 지수부 바이어스인 127은 지수가 음수임을 표현하기 위해서입니다."

 

여기서 알아들을 수 있는 말? 부동소수점과 음수 -끝. 

 


[부동소수점 표기의 구성]

부호(Sign bit) 지수부 (Exponent) 기수부 (Mantissa 또는 Fraction)
0 또는 1 8비트 23비트

 

이게 무슨 말이냐, 하면

 

 

[예시로 보기]

예를 들어 0.15625라는 float이 있다고 하자.

 

1. 이진수로 바꾸기

0.15625를 컴퓨터가 알아듣기 좋게 바꾸려면 이진수로 바꾸면 된다. (0.15625 --> 0.00101)

 

2. 정규화

사실 이 형태로도 컴퓨터는 곤란하다. 영쩜영영어쩌구저쩌구...

이걸 더 이해하기 좋게 변환하는 과정을 거치는데, 이걸 '정규화'라고 한다.

정규화에서는 1이 가장 앞으로 올 수 있도록 변환을 시켜준다.

0.00101을 1.01 * 2^-3으로 바꾸어주는 것.

(0.023이라는 수가 있을 때 2를 앞으로 빼려면 2.3 * 10^-3으로 표현할 수 있는 것과 같은 원리이다. 0.023은 10진법으로 표현한 수이니 밑이 10인 수를 곱해서 표현하는 것이고, 0.00101은 이진수이니 2가 밑인 수를 곱해서 표현하는 것)

 

3. 부호 - 지수부 - 기수부

여기까지 변환한 수(1.01 * 2^-3)도 컴퓨터가 그대로 이해할 수 없다.

이 값을 부호 - 지수부 - 기수부를 이용해서 저장하게 된다.

 

  • 부호는 말 그대로 부호이다. 애초에 양수를 예시로 들었으니 0이 된다. (0이 양수, 1은 음수)
  • 지수부는 1.어쩌구저쩌구 형태로 바꾸었을 때(정규화 했을 때) 뒤에 곱해지는 가중치를 의미한다. 예시에서는 2^-3이 지수부에 해당하는데, 밑이 2인 건 당연한 거니까 -3의 정보만 저장하면 된다. 그런데 문제는 이게 음수는 또 안 받는다. 따라서 127이라는 숫자를 우리가 생각하는 0이라는 기준점으로 설정하고, 127보다 크면 양수, 127보다 작으면 음수라고 하기로 한 거다. 이 127이라는 숫자가 '바이어스'이다.
    • 127은 float의 기준이다. float이 표현 가능한 소숫점의 크기는 정해져 있고, 이걸 표현하려면 127이라는 숫자가 적당하므로 선택된 것이다.
    • 아무튼 -3을 127이 0이라는 기준으로 생각해보면 124가 된다. 지수부는 이 124라는 숫자를 이진수로 변환해서 저장하게 된다. (01111100 - 8비트)
  • 기수부는 이 가중치를 빼고, 실제 값 부분을 저장한다. 1.01 * 2^-3에서 1.01이 여기에 해당하는데, 우리가 정규화 할 때 1이 가장 앞으로 오게 만들었기 때문에 어떤 수이던 간에 가장 앞이 1인 것은 뻔하다. 따라서 1 이후의 정보인 01만 저장한다. (01000000000000000000000 - 23비트)

 

가중치, 실제값이라는 단어가 헷갈릴 수 있으니 십진법을 예시로 개념을 다시 잡아보자.

0.023이라는 수가 있을 때, 23 * 0.001의 형태로 바꾸어서 생각해보면, 23이라는 숫자가 중요한 거다. 이 실질적인 값이 기수부에 해당하고,  0.001이 가중치에 해당.

 

 

처음부터 정리해보면

 

0.15625를 이진수로 표현 --> 0.00101

정규화 --> 1.01 * 2^-3

지수부는 뒷 부분 / 기수부는 앞 부분 - 지수부에서 음수가 나올 때를 대비해서 필요한 것이 바이어스

 

 


"부동소수점의 지수부 바이어스인 127은 지수가 음수임을 표현하기 위해서입니다."

다시 보니 참 쉽죠? ^_^