✨컴공주✨ [1052682] · MS 2021 (수정됨) · 쪽지

2022-06-16 18:25:25
조회수 570

컴공 일기68

게시글 주소: https://orbi.kr/00057168128

수학에서는 1 다음으로 큰 실수는 존재하지 않을 겁니다. 왜냐하면, 실수라는 것은 기본적으로 이산적인 분포가 아니라, 연속적인 분포를 띄기 때문에, 경계지을 수가 없기 때문이지요. 그런데, 앞에 "컴퓨터에서"라는 부사어를 붙이면 이야기가 달라집니다. 



말하자면, 컴퓨터 내에선 1다음으로 큰 수가 존재한다는 것이지요. 왜 그러느냐? 컴퓨터에서 수를 표기할 때 쓰는 방식은 알다시피 2진 방식이지요. 10이라는 숫자를 10으로 표기하는 것이 아니라, 1010이라는 2진수로 표기합니다. 여기서 문제가 발생되는데요, 2진 방식은 모든 10진법표기의 실수를 표기할 수 없습니다. 예를 들어서, 0.1이라는 소수를 2진수로 표기를 해볼까요? 



0.1 = 0.00011001100 ....


0.1을 2진법으로 표기한다면 이렇게 순환소수가 되어버리죠. 굉장히 웃긴 일입니다. 

종이에 0.1을 쓰면 1초면 끝나지만, 컴퓨터에 0.1을 쓰려고 하면 끝이 안 나는 겁니다.

애초부터 2진법으로는 0.1을 완벽하게 표현할 수 없으니까요. 그래서, 컴퓨터에서는 '유효숫자'라는 개념을 이용해서

0.1에 대한 근사치만을 표현할 뿐이지요. 


하지만, 이 근사치라는 개념이 굉장히 웃깁니다.

어떻게 근사를 해야 될까요? 어떤 사람은 0.0999999가 제일 0.1에 가깝다고 생각할 수도 있고, 어떤 사람은 0.0999999999가 제일 0.1에 가깝다고 생각할 수도 있죠. 다시 말해서, 근사치를 표현할 때 기준이 없다면 컴퓨터를 만드는 회사, 프로그래밍을 돌리는 사용자에 따라서 0.1에 대한 표기 방식이 달라질 수밖에 없다는 것입니다.


그래서, 전세계적으로 이것을 통일하기 위해서 "규약"을 맺게 되는데, 그것이 "IEEE754 규약"이라고 하는 것입니다.

다시 말해서, 2진법으로 소수점을 표기하는 방식을 IEEE이라는 기관에서 범세계적으로 아예 약속을 한 것이지요. 이 규약은, 숫자를 표기할 수 있는 비트를 32개를 할당합니다. 말하자면, 32bit를 통해서 숫자를 표현하는 것이지요.


이 32개의 비트는 크게 세 가지로 쪼개집니다.


1. 부호비트 (1bit)

2. 지수부    (8bit)

3. 가수부   (23bit)

 

부호비트는 1개의 비트만 할당됩니다. 0이라면 양수구요, 1이라면 음수입니다.

지수부는 8개의 비트가 할당되지요. 00000000~11111111 까지요. 단 여기서, bias라는 개념이 중요한데, 일종의 숫잡니다. 32bit 체제에서 bias 값은 127로 할당이 되어요. 그렇다면 이 bias는 뭐하는 애냐? 지수부에 들어온 비트 값에 이 bias 값을 빼주어 지수부를 정하는 역할을 하죠. 예를 들어서 지수부에 01111111 즉 127이 들어왔다고 가정해볼게요. 그 값에 bias를 빼볼까요? 그러면 127-127=0이죠? 바로 이 0이 지수부에 해당하게 됩니다. 말하자면 2^0을 가리키게 되죠. 


같은 논리로, 11110000 = 240이 할당됐다면 -127을 해주면 113! 즉 2^113이 지수부로 들어가게 됩니다. 


가수부는 총 23개의 비트가 할당됩니다.


또, 여기서 "hidden bit"를 이용하는데요. 32개의 bit 이외에,지수부와 가수부 사이에 1이라는 비트를 기본으로 할당해둡니다. 이 이유는, 표현가능한 실수의 범위를 더 넓히기 위해서예요. 왜냐하면 모든 수를 표기할 때 공통적으로 들어갈 수밖에 없는 숫자이기 때문에, 이렇게 해도 계산 상에 전혀 문제가 없는 것이죠. 그래서 이렇게 숨겨도 상관이 없겠죠? 


자, 이렇게 놓고 보면 이제 우리는 컴퓨터에서 1 다음으로 큰 수를 구할 수 있습니다.


이 규약에 따라서, 일단 1을 표기해보면 다음과 같습니다.

0 / 01111111 / hidden bit 1 / 000 ... 0 = 2^0 * (1 + 0)


그렇다면, 그 다음 수는 이렇게 되지 않을까요?

0 / 01111111 / hidden bit 1/ 000... 1 = 2^0 * (1 + 2^-23) 


네. 그래서 1다음으로 큰 수는 1 + 2^-23이 된답니다.





0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.