Informatica Online Judge

  실수의 표현 [2447 / 098F]

Time Limit(Test case) : 1000(ms)
Number of users who solved : 50   Total Tried : 963


The Champion of this Problem (C++) : gs22001 - ms / 239byte
My Best Submission (C++) : N/A

[HS Jeon, JKJeong 2019]

Background

컴퓨터로 저장, 처리되는 모든 데이터들은 2진 체계를 이용해 정수화되어 처리된다.

실수(real number)도 마찬가지로 2진 체계를 이용해 정수화되어 저장되어야 하는데, 기본적으로는 그 값의 부호를 저장하기 위한 부호비트(sign bit), 2의 거듭제곱을 표현하기 위한 지수비트(exponent), 2진수 표현을 저장하기 위한 나머지비트(fraction)로 나누어 저장한다.

예를, 들어 실수 0.15625를 4바이트(32비트) float 형으로 저장하면 아래와 같은 형태로 저장된다.

10진 실수 $+0.15625$를 2진 실수로 변환하면 $+0.00101$이 되고, 이는 $+1.01$*$2^{-3}$ 으로 그 꼴을 바꿀 수 있다.

float를 부동소수점으로 부르는 이유는 이와같이 점의 위치를 원하는 자리로 바꿔서 표현할 수 있기 때문이다. 즉 점의 자리를 적당한 자리로 옮기고 $2^k$를 곱하는 형태로 매우 다양하게 표현할 수 있다.

float로 저장하기 위해서는 다양한 형태들 중 항상 $1.$xxxx... * $2^k$의 형태로 정규화를 한다. 따라서 $+0.15625$는 $+1.01$*$2^{-3}$으로 정규화 해야한다.

부호가 +이므로 부호비트는 $0$ (만약 음수라면 $1$),

지수비트들은 정규화 한 $k$값에 127(바이어스)를 더해서 저장한다. 이는 음수를 표현하기 위한 또 다른 방법 중 하나이다. 따라서 지수부 비트들은 $-3+127=124$ 이므로 01111100,

나머지비트는 "01" 이므로 23자리를 맞추면 순서대로 01000000000000000000000 가 되고, 그 결과 아래와 같은 방법으로 저장하고, 계산할 수 있게 되는 것이다.

만약 나머지비트의 길이가 23자리를 초과할 경우에는 23자리까지만 저장된다. 이 때문에 절단오차가 발생하게 된다.




특별한 케이스로 0일 경우는 정규화를 할 수 없다. 왜냐하면 어느 부분에도 이진수로 1인 부분이 없기 때문이다.

따라서 0인 경우네는 특별히 지수비트와 나머지비트를 모두 0으로 표현한다.

float 형 실수가 입력되었을 때, 컴퓨터 내부에 저장되는 비트를 출력하는 프로그램을 작성해보자.

Input

float 형 실수가 입력된다.

단, 입력되는 값을 문자열로 생각했을 때 길이가 7을 초과하지는 않는다.

(입력에 사용될 수 있는 문자는 ".", "-", "0" ~ "9" 이다.)

Output

입력된 값을 float 형 실수로 저장했다고 할 때 그 결과를 부호비트, 지수비트, 나머지비트로 공백을 두고 출력한다.

IO Example

입력예시
0.15625

출력예시
0 01111100 01000000000000000000000

Submit : [C/C++] | [C++11] | [Obj-C] | [Java] | [Python3]
Prob Analysis : [Problem Statistics] | [Solution]