U283437 半精度浮点数

题目背景

在IEEE 754标准中,一个 m 位二进制浮点数通常由如下形式来表示: $ se_{k-1}......e_1e_0f_{n-1}......f_1f_0\ \ \ (1+k+n=m; s,e_i, f_j \in \{ 0, 1\}) $ 其中: - $s$ 是符号位,决定这个数是负数 $(s=1)$ 还是正数 $(s=0)$ 。 - $e_{k-1}......e_1e_0$ 是阶码(指数)部分 - $f_{n-1}......f_1f_0$ 是尾数部分 IEEE 754标准规定,通过如下方法计算二进制浮点数对应的十进制实数值 $x$ : 首先计算 $bias=2^{k−1}−1$,接下来分情况讨论: - 若 $e_{k−1}......e_1e_0$ 的每一位全为 $1$ ,且 $f_{n−1}......f_1f_0$ 的每一位全为 $0$ ,则 $x$ 为正无穷($s=0$)或负无穷($s=1$) - 若 $e_{k−1}......e_1e_0$ 的每一位全为 $1$ ,且 $f_{n−1}......f_1f_0$ 的每一位不全为 $0$ ,则 $x$ 不是一个数字 - 若 $e_{k−1}......e_1e_0$ 的每一位全为 $0$ ,计算 $x=(-1)^s \times (0.f_{n-1}......f_1f_0)_2 \times 2^{(1-bias)}$ - 若 $e_{k−1}......e_1e_0$ 的每一位既不全为 $1$ 也不全为 $0$ - 将二进制数 $e_{k−1}......e_1e_0$ 转换为十进制数 $E$ 计算 $x=(−1)s×(1.f_{n−1}......f_1f_0)_2×2^{(E−bias)}$

题目描述

在本题中,我们采用**半精度浮点数**,其中 $m=16,k=5,n=10$ ,并计算浮点数所代表的实际数值。

输入格式

多组数据输入,以文件符 `EOF` 结尾。 每行一个二进制的半精度浮点数。

输出格式

对于每个半精度浮点数,用带分数的形式表示浮点数的精确值 对于特殊情况:正无穷请输出 `inf`,负无穷请输出 `-inf`,不是一个数字输出 `NaN` 带分数的基本形式为 `i+a/b` 或 `i-a/b` `i` 为带分数的整数部分,输出保证 `i` 的绝对值尽可能小 `a` 和 `b` 分别为约分后的分子和分母 如果没有整数部分则仅输出 `a/b` 如果没有分数部分则仅输出 `i` 对于为 $0$ 的情况直接输出 $0$ 。