시간 제한
메모리 제한
시간 제한
1초
메모리 제한
128 MB
EDSAC(Electronic Delay Storage Automatic Calculator)은 프로그램을 주기억장치에 저장한 채 실행할 수 있었던 초기 디지털 컴퓨터이다. EDSAC에는 가산기를 사용하는 명령어가 있었고, 계산은 17비트 word 타입과 35비트 double word 타입을 바탕으로 이루어졌다. 입출력에는 5비트 텔레타이프 코드가 사용되었다.
EDSAC 프로그램은 간단한 어셈블리어로 작성할 수 있다. 각 명령어는 문자 하나, 음이 아닌 십진수 주소값, 그리고 F 또는 D로 이루어진다. F는 full word 타입, D는 double word 타입을 뜻한다. 예를 들어 A 128 F는 메모리의 128번 주소에 있는 full word 값을 가산기에 더하라는 명령이다. 이 명령은 이진수 11100000100000000으로 표현된다. 앞의 5비트 11100은 add를 뜻하는 opcode이고, 다음 11비트 00010000000은 피연산자 주소 128을 뜻하며, 마지막 비트 0은 full word 타입을 뜻한다. double word 타입이면 마지막 비트는 1이다.
EDSAC의 연산은 부동소수점이 아니라 2의 보수 고정소수점 방식으로 이루어진다. 연산 장치는 소수점이 가장 왼쪽 비트와 그 바로 오른쪽 비트 사이에 있다고 본다. 따라서 17비트 word 타입 값 x의 표현 범위는 -1.0 <= x < 1.0이다.
| 값 | 이진수 표현 |
|---|---|
| -1.0 | 10000000000000000 |
| 1/2 | 01000000000000000 |
| 3/4 | 01100000000000000 |
| -1/2 | 11000000000000000 |
표현 가능한 가장 큰 양의 실수는 01111111111111111 = 0.9999847412109375이고, 가장 작은 양의 실수는 00000000000000001 = 2^(-16) = 0.0000152587890625이다.
흥미롭게도 add 연산의 opcode와 텔레타이프 코드 A는 모두 11100이고, subtract 연산과 S도 모두 01100이다. 텔레타이프 코드로 표현할 수 있는 32개의 문자는 PQWERTYUIOJ#SZK*?F@D!HNM&LXGABCV이며, 5비트 opcode로 표현할 수 있는 값도 32개이다. 텔레타이프 코드에서 P는 00000, Q는 00001이고, 위 순서대로 하나씩 증가하여 V는 11111이 된다. 이 성질 덕분에 EDSAC 어셈블러를 만들기 쉬웠다.
하지만 EDSAC 어셈블러에는 데이터 상수를 따로 나타내는 전용 문법이 없었다. 그래서 어떤 프로그래머는 일반 명령어의 비트열을 데이터 값 표현으로 사용했다. 예를 들어 상수 3/4인 01100000000000000은 S 0 F로 표현되고, 1/3에 가까운 00101010101010101은 T 682 D로 표현된다. 여기서 T = 00101, 682 = 01010101010이다.
십진수가 주어졌을 때, 그 값을 나타내는 올바른 EDSAC 명령어를 출력하는 프로그램을 작성하시오.
첫째 줄에 테스트 케이스의 수 P가 주어진다. 1 <= P <= 1000이다.
이후 각 테스트 케이스마다 십진수 D가 한 줄에 하나씩 주어진다. D는 sd.ddd... 형태이다. 여기서 s는 마이너스 부호이며 생략될 수 있고, d는 십진수 한 자리이다. 소수점 아래에는 최소 1자리, 최대 16자리가 주어진다.
각 테스트 케이스마다 입력값을 표현하는 EDSAC 명령어 한 줄을 출력한다. 출력 형식은 opcode 문자 하나, 공백 하나, 음이 아닌 십진수 피연산자 하나, 공백 하나, 그리고 F 또는 D이다.
입력값을 17비트로 정확히 표현할 수 없다면 0에 더 가까운 표현값을 사용한다. 즉 양수는 내림하고, 음수는 올림한다.
D가 -1.0 <= D < 1.0 범위에 없다면 EDSAC 명령어 대신 INVALID VALUE를 출력한다.