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$ 。