题目压缩包(内含样例)
众所周知浮点类型是一种常用 (大嘘) 的数据类型。考虑一种有 $t$ 位有效数字,$w$ 位指数的浮点类型,则该浮点类型在存储时使用 $t + w + 1$ 个二进制位。我们从高到低列出这些位:
首先是一个符号位 $s$
之后是 $t$ 个有效数字位 $a_1, a_2, \cdots, a_t$
最后是 $w$ 个指数位 $b_{w - 1}, b_{w - 2}, \cdots, b_0$
如果一个浮点值中 $w$ 个指数位不都是 $0$,也不都是 $1$,则它是正规的,表示如下的实数值:
$$(-1)^s \left(1 + \sum_{k=1}^t 2^{-k} a_k \right) \times 2^E$$
对于正规浮点数:
$$E = 1 - 2^{w - 1} + \sum_{k=0}^{w-1} 2^k b_k$$
如果浮点值中 $w$ 个指数位都是 $0$,则它是非正规的,表示如下的实数值:
$$(-1)^s \sum_{k=1}^t 2^{2-2^{w-1}-k} a_k$$
显然,正规浮点值的绝对值大于等于 $2^{2-2^{w-1}}$,而非正规浮点数的绝对值小于 $2^{2-2^{w-1}}$。
请注意 $+0$ 和 $-0$ 是不同的浮点值,前者的所有二进制位都是 $0$,后者 $s = 1$,其余二进制位是 $0$。 但它们表示同一个实数,即 $0$。
如果浮点值中 $w$ 个指数位都是 $1$,则它是特殊的,表示如下的非实数值:
符号位为 $0$,$t$ 个有效数字位都是 $0$,则表示 $+\infty$
符号位为 $1$,$t$ 个有效数字位都是 $0$,则表示 $-\infty$
符号位为 $0$ 或 $1$,$a_1 = 1$,其他 $t - 1$ 个有效数字位取任何值,则表示
qNaN
符号位为 $0$ 或 $1$,$a_1 = 0$,其他 $t - 1$ 个有效数字位取任何值,则表示
sNaN
将 $+\infty$ 和 $-\infty$ 统称为无穷大值。本题不考虑sNaN
。
现在给定一个浮点类型的参数 $t$ 和 $w$,你需要计算在该类型的浮点值上进行的若干四则运算。如果参与运算的浮点值都表示实数 (即,不是特殊浮点值),则运算规则如下:
首先将两浮点值表示的实数按照实数四则运算的法则进行计算。对于除法,如果两操作数都是 $0$, 则生成
qNaN
作为结果,并不再进行后续步骤。如果被除数不是 $0$,但除数是 $0$, 则生成无穷大值作为结果,无穷大值的符号位是两操作数符号位的异或,并不再进行后续步骤。 对于其他实数四则运算,其结果一定存在且是实数,设这个结果为 $r$。设该浮点类型能表示的所有非负实数值的集合为 $\mathbb{F}$,令 $\mathbb{E} = {2^{(2^{w-1})}}$。 设 $d(f)$ 是使得 $2^k f$ 为整数的最小 (可能为负) 整数 $k$,例如 $d(4) = -2$。 特别地,规定 $d(0) = -2^{w-1}$。 在 $\mathbb{F} \cup \mathbb{E}$ 中寻找和 $|r|$ 最接近 (差的绝对值最小) 的数。如有并列,选择 $d(\cdot)$ 值较小的数。可以证明这样选出的符合条件的数是唯一的。将选出的数记作 $r'$。
显然 $\mathbb{F} \cap \mathbb{E} = \emptyset$。如果 $r' \in \mathbb{E}$, 则结果是 $\pm \infty$。否则,结果是 $\pm r'$。
确定结果的符号位。如果 $r \neq 0$,则符号位根据 $r$ 的符号确定。否则:
对于乘法或除法,结果的符号位是两操作数符号位的异或。
对于加法或减法,当两个 $-0$ 相加,或者一个 $-0$ 减去一个 $+0$ 时,结果的符号位是 $1$ (即结果为 $-0$),否则符号位是 $0$ (即结果为 $+0$)。
对于有特殊浮点值参与的四则运算,规则如下:
只要存在一个操作数为
qNaN
,结果就是qNaN
。无穷大值和实数值或符号相同的无穷大值相加,则得到该无穷大值本身。
无穷大值和符号相反的无穷大值相加得到
qNaN
。无穷大值减去实数值或符号相反的无穷大值,则得到该无穷大值本身。
无穷大值减去符号相同的无穷大值得到
qNaN
。实数值减去无穷大值,得到一个符号相反的无穷大值。
无穷大值和 $0$ 相乘得到
qNaN
。无穷大值和无穷大值或非 $0$ 实数值相乘得到无穷大值,结果的符号位是两操作数符号位的异或。
无穷大值除以无穷大值得到
qNaN
。无穷大值除以实数值得到无穷大值,结果的符号位是两操作数符号位的异或。
实数值除以无穷大值得到 $0$,结果的符号位是两操作数符号位的异或。