본문 바로가기
시스템프로그램

[시스템프로그램]02-3-1 실수와 사칙연산(1)

by 케찹이 2020. 4. 29.

이제 정수 파트를 다 살펴보았고 실수부분을 실수 자체에서 사칙연산까지 살펴보도록 한다. 

일단 실수는 점이 들어가 있는 숫자를 뜻한다. 예를 들어 0.123, 2.7182818..., 3.14159265358.... 같은 숫자들을 실수라고 한다. fraction value할려면 실수이다. 또한 실수라는 수는 굉장히 작은 수 혹은 굉장히 큰 수를 표현하기 위해서 만들어졌다고 한다. 예를 들어서 지구에서 태양과의 거리 등등 이 있네요.

 

컴퓨터시스템에서 실수는 3가지로 구성이 된다. sign, exponent, fraction이다.

대충 위 그림과 같이 구성이 되있습니다. 왼쪽부터 설명하자면 sign은 양수,음수를 판단, exponent은 지수값 그리고 fraction은 수 데이터를 의미한다. 

 

본격적으로 실수에 대해서 알아보기 전에 몇가지 문제로 준비를 해보자고 한다.

일단 0.1을 이진수로 표현해보자 십진수 실수를 이진수로 바꾸는 방법은 정수부분은 알고 있듯이 2로 나누어서 나머지값들을 거꾸로 적으면 된다. 그리고 소수부분은 2랑 곱해서 곱한 값이 1보다 높으면 저장하고 나머지는 계속 2랑 곱한다. 그리고 1을 넘었는지 못넘었는지의 결과물을 계산 순서대로 적으면 된다. 0.1로 예를 들자면 

 0.1

*  2

 0.2   -> 0

*  2

 0.4   -> 0

*  2

 0.8   -> 0

*  2  

 1. 6  -> 1  (1이면 1을 빼주고 2를 계속 곱한다)

 0.6

*  2   

 1.2   -> 1  (1이면 1을 빼주고 2를 계속 곱한다)

 0.2

*  2  

 0.4  -> 0

 

0.1은 이진수로 표현하면 무한소수이기 때문에 1.2부턴 계속 0011로 반복된다. 그럼 0.1을 16비트로 표현하면

0.1 = 0.001100110011[0011]로 표현이 가능한다. 

0.110011001100... * 2^(-3)   (0.001100110011.. * 2^(-3) 

우리가 16비트에선 실수는 1비트의 sign과 5비트의 exponent 그리고 10비트의 fraction값을 가지게 된다. 그래서 16비트에서 0.1을 표현하게 된다면

0 11101 1100110011

처럼 표현이 가능하다. 16비트에서 unsign으로 표현을 통일시키기 위해서 일부로 exponent값에 비트값만큼 더해준다 이를 excess표현이라고 하는데 0.1에 적용한다면 11101 + 10000 = 01101이 된다. 10진수로는 -3 + 16 = 13이다. 

그래서 sign으로 표현할려면 16을 빼주어야 한다. 

그리고 지수를 -3으로 지정하게 되는 이유는 원래 exponent값은 00110011이 반복되었는데 결국 0값은 의미가 없는 값이다. 더 의미있는 값을 많이 표현하기 위새서 0을 생략해주고 지수로 표현해주는게 더 효과적이다. 

 

 

16비트의 정수 1을 이진수로 표현하자면 0000000000000001로 표현이 가능하다.

대비적으로 16비트의 실수로 1.0을 표현하자면 1.000000000000000 = 0.10000000000000000 * 2^1로 표현이 가능하게 되고 시스템 속에선 

0 00001 1000000000처럼 표현이 되고 excess표현이 적용하면 exponent는 10001이 된다. 

 

첫번째 식은 우리가 10진수 수를 표현하는 방식이고 두번째 식은 2진수 수를 표현하는 방식이다. 이미 대부분의 사람이 알고 있듯이 별로 바뀐것 없다. 지수의 밑이 10인지 2인지만 다를 뿐이다. 너무 어렵게 생각하지 않았으면 좋겠다.

정수에서 적용되는 곱셈, 나눗셈의 방식은 똑같이 적용된다. 2로 나누었을 때는 오른쪽으로 shift, 2로 곱했을 때는 왼쪽으로 shift를 한다. 0.11111....(이진수)는 1.0 바로 밑에 있는 값이다. 

 

끝으로 IEEE Standard 754라는 컴퓨터에서 실수를 표현하는 방법을 개발하신 아저씨가 Willan Kahan이라는 아저씨인데. 예전에 버클리 대학의 교수였고 여기저기서 스폰서 지원을 받아 이를 개발하였다고 한다. 1933생인데 아직까지도 살아계시고 최근 몇년전까지만 해도 계속해서 논문을 작성했다고 한다. 

댓글