[문제]
컴퓨터에서 부동소수점을 표현하는 방법으로 IEEE 754 표준이 사용된다. 이 표준에서는 +0과 -0, 무한, NaN 등을 표시하는 방법과 이에 대한 연산 방법을 정의하고 있다. 표현 범위에 따라 32비트 단정밀도와 64비트 배정밀도 등으로 구분된다. 많은 프로그래밍 언어에서 부동소수점 표현 방법으로 IEEE 754 표준을 적용하고 있다.
부동소수점 표현은 부호, 지수, 가수 부분으로 구성된다. 32비트 단정밀도 기준으로 설명하면 부호 1비트, 지수 8비트, 가수 23비트로 구성되어 있다.
10진수 -218.6875를 IEEE 754(32비트 단정밀도)로 표현해보자.
- 먼저 음수이므로 부호 비트는 1이 된다.
- 다음으로 절댓값을 2진수로 나타내면 11011010.1011(2)이 된다.
- 2진수 절댓값의 소수점을 왼쪽으로 옮겨서 왼쪽에는 1만 남도록 만든다.
여기에서는 11011010.1011(2) = 1.10110101011(2)×27과 같으며, 이 과정을 정규화라고 한다. - 가수 부분은 소수점 오른쪽 부분이며, 부족한 비트는 0으로 채워서 23비트로 만든다.
여기에서는 10110101011000000000000이 된다. - 지수는 7이며, 여기에 Bias를 더한다. IEEE 754(32비트 단정밀도) 형식에서 Bias는 127이므로 7+127 = 134가 된다. 이를 2진법으로 변환하면 10000110(2)이 된다.
결과적으로, -218.6875를 IEEE 754(32비트 단정밀도)로 표현하면
1 10000110 10110101011000000000000이 된다.
IEEE 754(32비트 단정밀도)로 변환된 16진수 X가 주어졌을 때, 이를 부동소수점으로 변환하는 프로그램을 작성하시오.
[입력]
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
둘째 줄부터 T개의 줄에 걸쳐 16진수 X가 주어지며 0~9와 A~F의 문자로 이루어져 있다. 주어지는 모든 16진수는 32비트 범위를 초과하지 않으며, 유효한 부동소수점으로 변환할 수 있다고 가정해도 좋다.
[출력]
각 테스트 케이스마다 부동소수점으로 변환한 결과를 출력한다. 정답과의 절대/상대 오차는 10-12까지 허용한다.
[제한]
- 시간 및 메모리 제한 : 하단 참고
- 사용 가능 언어 : C++, Java, Python 3
- 예제는 채점하지 않는다.
언어 | 시간 제한 | 메모리 제한 | 비고 |
C++ | 500ms | 128MB | |
Java | 2000ms | 256MB | Float.intBitsToFloat() 사용 금지 |
Python 3 | 3000ms | 256MB |
[부분 문제와 제약 조건]
- 부분 문제 1 : 전체 100점 중 11점에 해당하며, 모든 변환 결과는 224보다 작거나 같은 자연수이다.
- 부분 문제 2 : 전체 100점 중 18점에 해당하며, 모든 변환 결과는 절댓값이 224보다 작거나 같은 정수이다.
- 부분 문제 3 : 전체 100점 중 23점에 해당하며, 모든 변환 결과는 소수점 최대 9자리 이내임이 보장된다.
- 부분 문제 4 : 전체 100점 중 48점에 해당하며, 주어진 제약 조건 이외에 추가 제약 조건이 없다.
[예제 입력 1]
4
C35AB000
3F800000
C0000000
4166DF5A
[예제 출력 1]
-218.6875
1
-2
14.4295291900634765625
[참고 자료]
Wikipedia - IEEE 754
[필자의 코드]
[테스트 데이터]