IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。
以 IEEE 754 标准指定的 64 位双精度浮点数 (double) 由三个部分构成,从高位到低位依次是:符号 S (1位) + 指数 E (11位) + 尾数 F (52位)。一个双精度浮点数 N 的大小由下列公式确定:
规约数 (1≤E≤2046): N=(−1)S×(1.F)2×2E−1023;
非规约数 (E=0): N=(−1)S×(0.F)2×2−1022;
正负无穷(E=2047,F 全为 0):N=±inf,正负取决于符号位 S,如果符号位 S=1,则为 −inf;否则为 (+)inf;
非数(E=2047, F 不全为 0):N=NaN。
一个例子:
| Sign(1 bit) | Exponent(11 bits) | Fraction(52 bits) |
|---|---|---|
| 1 | 10000000101 | 11010000(0...) |
上面表格所表示的数就是 (−1)1×(1.1101)2×21029−1023=−116。其中 (1.1101)2=20+2−1+2−2+2−4,代表一个二进制表示的小数。
现在给你一个实数在 IEEE 754 双精度浮点数标准下的二进制表示,求其对应的实数,或判断其是正负无穷或非数。如果答案不是 ±inf 或者 NaN,那么你的答案与标准答案的相对误差不超过 10−12 即可判定为正确。
即假设你的输出是 pans,标准答案是 jans,那么你的答案会被当做是正确的当且仅当 ∣jans∣∣pans−jans∣≤10−12。
第一行一个正整数 T(1≤T≤105),表示测试数据的组数。
对于每一组测试数据,输入一行一个长度为 64 的 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
样例解释
对于样例的第 1 组数据,-116、-1.160000000000000e+02、-1.160000000000000e2、-1.160000000000000e02、-1.160000000000000E02 和 -1.160000000000000E2 等都会被当作是正确的答案。
本题的答案的绝对值可能很大或很小,建议使用科学计数法+保留有效数字的形式输出你的答案。
下面是一些语言的例子(假设你要以保留 15 位有效数字的科学计数法输出 num):
#include <stdio.h>
printf("%.15e\n", num);
#include <iostream>
#include <iomanip>
std::cout << std::scientific << std::setprecision(15) << num << std::endl;
print(f"{num:.15e}")
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("0.###############E0");
System.out.println(df.format(num));