B. 浮点表示

传统 1500 ms 256 MiB
标准 IO
Special Judge

题目描述

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。

以 IEEE 754 标准指定的 64 位双精度浮点数 (double) 由三个部分构成,从高位到低位依次是:符号 SS (1位) + 指数 EE (11位) + 尾数 FF (52位)。一个双精度浮点数 NN 的大小由下列公式确定:

  1. 规约数 (1E2046)(1\le E\le 2046) : N=(1)S×(1.F)2×2E1023N = (-1)^S\times (1.F)_2\times 2^{E-1023}

  2. 非规约数 (E=0)(E = 0): N=(1)S×(0.F)2×21022N = (-1)^S\times (0.F)_2\times 2^{-1022}

  3. 正负无穷(E=2047E=2047FF 全为 00):N=±infN = \pm \mathrm{inf},正负取决于符号位 SS,如果符号位 S=1S=1,则为 inf- \mathrm{inf};否则为 (+)inf(+)\mathrm{inf}

  4. 非数(E=2047E=2047FF 不全为 00):N=NaNN = \mathrm{NaN}

一个例子:

Sign(1 bit) Exponent(11 bits) Fraction(52 bits)
1 10000000101 11010000(0...)

上面表格所表示的数就是 (1)1×(1.1101)2×210291023=116(-1)^1 \times (1.1101)_2\times 2^{1029-1023} = -116。其中 (1.1101)2=20+21+22+24(1.1101)_2 = 2^0+2^{-1}+2^{-2}+2^{-4},代表一个二进制表示的小数。

现在给你一个实数在 IEEE 754 双精度浮点数标准下的二进制表示,求其对应的实数,或判断其是正负无穷或非数。如果答案不是 ±inf\pm \mathrm{inf} 或者 NaNNaN,那么你的答案与标准答案的相对误差不超过 101210^{-12} 即可判定为正确。

即假设你的输出是 panspans,标准答案是 jansjans,那么你的答案会被当做是正确的当且仅当 pansjansjans1012\frac{|pans-jans|}{|jans|}\le 10^{-12}

输入格式

第一行一个正整数 T(1T105)T(1\le T\le10^5),表示测试数据的组数。

对于每一组测试数据,输入一行一个长度为 6464 的 01 字符串,表示一个实数在 IEEE 754 双精度浮点数标准下的二进制表示。

输出格式

对于每一组测试数据,输出一个实数,表示 01 字符串对应的数。如果是正(或负)无穷输出 inf(或 -inf),如果是非数则输出 nan(注意,你的输出中的 nan-nan 都会被当作是 nan,两者在本题中不区分)。

样例

输入样例

6
1100000001011101000000000000000000000000000000000000000000000000
0111111111110000000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111111111111111111
1000000000000000000000000000000000000000000000000000000000000000
0000110001100000111101101000011100000000111111111001001110101000
1111111110101001110111001110110001111111011110001100011101110010

输出样例

-116
inf
nan
-0
4.738448802179671e-249
-9.080802381727294e+306

样例解释
对于样例的第 11 组数据,-116-1.160000000000000e+02-1.160000000000000e2-1.160000000000000e02-1.160000000000000E02-1.160000000000000E2 等都会被当作是正确的答案。

数据范围与提示

本题的答案的绝对值可能很大或很小,建议使用科学计数法+保留有效数字的形式输出你的答案。

下面是一些语言的例子(假设你要以保留 1515 位有效数字的科学计数法输出 num):

c

#include <stdio.h>
printf("%.15e\n", num);

c++

#include <iostream>
#include <iomanip>
std::cout << std::scientific << std::setprecision(15) << num << std::endl;

python

print(f"{num:.15e}")

java

import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("0.###############E0");
System.out.println(df.format(num));