Matip.png


반갑습니다. 교주 LGS입니다.

오래간만의 MATip 강좌이네요 ^^

오늘의 강의 내용은 Floating Point Number(부동소수점)에 대한 이야기입니다.

본 강좌는 'MATLAB 때려잡기 - Data Type 1부'에 대한 보충강의 이기도 합니다.

본 강좌를 읽으시기 전에 위의 Data Type 강좌를 반드시 읽고 오시기 바랍니다.

Floating Point를 이해하시면 비단 MATLAB 뿐만아니라 컴퓨터로 하는 모든 프로그래밍 전반에 대한 이해도가 높아지므로 알아두시면 매우 좋습니다. ^^

강의 바로 시작할께요~


Floating01.png


0과 1만을 다루룰 수 있는 컴퓨터가 소수점 이하에 값을 가지고 있는 숫자(실수 Real Number)를 어떻게 컴퓨터에 저장할 수 있을까요?

예를 들어 소수점 이하에 값을 가지고 있는 실수(real number) 12.45를 컴퓨터에 저장해야 한다면 여러분은 어떤 방법을 사용하시겠어요?

밑으로 내려가기 전에 잠시 생각해보세요~ ^^ 



제가 처음 떠올린 방법은 정수부분과 소수점 이하 부분을 분리해서 따로 저장하는 겁니다.

12.45를 정수부분인 12 따로 저장하고 소수점 이하 45를 따로 각각 저장해서 나중에 합치면 되지 안을까요?~ ^^

12.45를 16bit로 표현해보면


 Floating02.png  


정수부분과 소수부분을 분리한 후 각각 8개의 방에 해당 숫자를 저장하면 되지 않을까요?

정수부분인 12는 그냥 2진수로 변환해서 저장하면 될거구요~ 

소수부분은 잘 생각해보시면 소수부분이 가질 수 있는 값의 범위가 0에서부터 0.99999999999999999999999999... 까지잖아요~ (12.45 = 12 + 0.45)

(지금의 예에서는)소수부분을 표현하는 부분의 방의 개수가 8개(8 bit)이니까 0부터 1사이를  2^8 = 256개의 구간으로 나누어서 

0.45가 몇번째 구간에 들어가는가를 계산해주시면 됩니다.

그러므로 0.45는 256*0.45 = 115를 2진수 '01110011' 로 바꾸어서 소수부를 저장하는 곳에 저장하면 되겠습니다요. o(^o^)o


아니면 정수부와 소수부를 직접 2진수로 바꾸신 후 바로 저장하셔도 되구요


Floating06.png


위와 같은 방법으로 숫자를 다루는 것을 Fixed Point (고정소수점 固定小數點)라고 그럽니다요~ ^^

Point라는 말은 말 그대로 (소수)점을 말하구요

1.5을 영어로 읽으면 one point five 라고 읽죠? ^^ '일오'의 점에 해당하는 것이 Point입니다.

잘 보시면 점의 위치가 방의 정가운데에서 전혀 변하지 않습니다. 왜 Fixed Point라고 하는지 이해가시죠? ^^


그런데 Fixed Point를 사용하다 보면 한가지 단점이 있습니다.

예를 들어 1200000000000000 (0이 14개)라는 큰 숫자를 Fixed Point 방법으로 컴퓨터에 저장한다고 생각해보세요~

1200000000000000을 2진수로 표현하려면 메모리를 엄청 처묵처묵 합니다 -_-;;


MATLAB에서 10진수를 2진수로 바꾸어주는 dec2bin 함수를 사용하여 확인해보면 

Floating03.png   

1200000000000000을 Fixed Point로 표현하려면 최소 51 Bit는 필요하네요 ;;


다시 짱구를 굴려봅시다 ^^ 사용 메모리를 줄일 수 있는 방법이 없을까요? 

머리를 데굴 데굴 데굴 굴리다가 번쩍 아이디어가 떠올랐어요!!

1200000000000000 는 1.2 * 10^15 이잖아요!! 오홋!!  

그렇다면!! 규칙을 잘 정해두면 그냥 딸랑 [1.2랑 15]만 저장해도 1200000000000000을 저장할 수 있지 않겠어요? ^^


위와같이 지수와 숫자의 곱으로 표현된 숫자를 Floating Point Number라고 합니다.

Floating Point(부동소수점 浮動小數點)의 부동(浮動)에서 '부浮'자가 물에 뜬다 할때 쓰이는 [뜰 부]거든요.

즉 소수점의 위치가 둥둥 떠나니면서 막 변합니다.

예를 들어 12.34를 Floating Point로 나타내면 1.234 * 10^1의 형태로 나타납니다. 

잘 보세요~소수점(point)의 위치가 처음에 2와 3사이에서(12.34) Floating Point로 표현하니 1과 2사이(1.234)로 바뀌었죠?

소수점의 위치가 막 바뀌는 것을 보고 소수점이 둥둥 떠다닌다고 표현한 것입니다.(센스쟁이)


실제로 10진수로 표현된 수를 Floating Point Number로 표현해 보면서 개념을 잡아보겠습니다.


Floating04.png


예를 들어 숫자 10.0을 Floating Point로 표현한다고 해보죠

10.0을 Floating Point 즉 숫자와 지수의 곱으로 나타내면 1.0 * 10^1 이죠? 1.0 * 10^1은 10진수 체계로 표현한 것이구요

컴퓨터는 10진수가 아니라 2진수를 사용하므로 10.0  = 1.25 * 8 = 1.25 * 2^3으로 표현할 수 있습니다.

(10을 2.5 * 2^2 으로도 표현할 수 있고 0.625 * 2^4 으로도 표현할 수 있지만 맨 앞자리가 1이 나오는 1.25 * 2^3을 표준으로 합니다.

그러므로 1은 항상 고정이고 1.xxxx의 형태로 표시됩니다. 통상 변하는 소수부분을 fraction의 f를 따서 1.f 라고도 표현합니다.)

즉 Floating Point 형식으로 표현하시려면 주어진 숫자를 [주어진 숫자를 넘지않는 가장 큰 2^n ]으로 나누어 주시면 되요~


숫자 10.0을 MATLAB 32 bit single data type에 Floating Point로 저장하려면 위의 그림에서 보시다 시피 

첫번째 비트는 부호비트로 쓰구요 (plus면 0, 마이너스면 1) 지수부 여덟 bit에 3을 넣으면 되겠죠?


지수부 8bit로 표현할 수 있는 숫자의 크기는 00000000 (0) 부터 11111111(255)까지 입니다.

8비트의 저장공간에 음수 또는 양수 형태의 지수를 저장해야하므로 8비트의 공간을 양수와 음수를 위해서 절반으로 나누게 됩니다. 

8비트의 저장공간이 0 ~ 255 사이의 값을 저장할수 있는 크기이므로 딱 절반으로 나누어 127을 중간 값으로 잡는거죠

즉, 127이 0을 의미하게 됩니다. (여기에서 127을 바이어스(bias)라고 부릅니다요)

그럼 실제 지수부 bit에 들어가는 숫자는  127+3 = 130을 2진수로 변환한 '10000010' 이 되겠죠? ^^

(이런 규칙을 어디에서 정하냐구요?? IEEE (Institute of Electrical and Electronics Engineers 국제전기전자기술자협회)에서 정해요 ;;)


1.25에서 정수 1은 항상 1로 고정입니다. 나머지 소수부분 0.25는 어떻게 처리하면 좋을까요?

Fixed Point에서 사용하셨던 방법을 그대로 사용하시면 되요~ ^^

1.xxx에서 소수부분이 가질 수 잇는 값의 범위는 0에서부터 0.9999999999999999... 까지 이므로

0~1 사이를 2^23 = 8388608개의 구간으로 나누어서 0.25가 몇번째 구간에 포함되는지를 계산해주시면 되죠~

계산을 해보면 0.25는 2^23 *0.25 = 2097152 번째 구간에 있네요 

2097152를 2진수로 표현해보면

Floating05.png

'01000000000000000000000'을 지수부 23bit에 채우면 됩니다.

잘보시면 위의 2진수에서 첫번째 자리는 1/2 = 0.5의 자리이구구요 두번재 자리는 (1/2)^2 = 0.25의 자리이니까 

두번째자리에 1이나오는 것이 맞죠~


아니면 직접 2진수로 바꾸신 후에 자리수를 맞추어주셔도 되구요 ^^

Floating07.png

이상 Fixed Point  vs. Floating Point 이야기 끝~ o(^o^)o


참고로 MATLAB에서 기본적으로 사용되는 실수(real number)들은 Floating Point Number입니다. (Double Data Type)

MATLAB에서 Fixed Point Number를 사용하시려면 Fixed Point Toolbox에서 제공하는 fi 함수를 사용하시면 됩니다~ ^^




오늘의 MATip은 여기까지 입니다.~ =(=^ㅅ^=)= 

다음 시간에 뵙겠습니다. 꾸벅

profile