float64、32 和 16 的 IEEE 754 标准使用有符号尾数和有偏差指数。作为一名设计硬件架构的学生,对我来说,对有效数和指数部分使用二进制补码更有意义。
例如,定义 32 位(半精度)浮点数,第一位表示符号,接下来的 8 位 - 指数(偏置 127),最后 23 位表示尾数。为了实现(负数)加法/乘法,我们需要将尾数转换为二进制补码并反之。由此产生的硬件相当复杂。
相反,请考虑前 8 位是否表示指数,后 24 位是否表示尾数,两者均采用二进制补码。位移、加法和乘法相对简单,硬件也不太复杂。此外,我们还有一个唯一的零表示有效数字(两个零表示有符号位)
我花了几个月的时间寻找这些设计决策的原因,并发现了这些:
- 2 的补码表示法更难比较。
确实如此,我们需要一个加法器(减法器)来比较 2 的补码。然而,对于诸如 GPU 和我自己的基于 FPGA 的 CNN 加速器等流水线架构,我们需要避免可变延迟。迭代地逐位比较有符号表示使得无法预先确定延迟。在我看来,在这种情况下,减法更好。
- 历史原因:处理 NAN 和 infs
也许我们可以为此分配一两个位。并将有效数设为 23 位。
- +0 和 -0 为零,因此 1/+0 = +inf 且 1/-0 = -inf
现在这是一个正当的理由。它并不真正适用于我的用例,但我想知道如果他们用额外的位来实现这一点是否会更好。
我的用例
我正在 FPGA 上构建 CNN 加速器。预定义乘法和加法延迟以及最小化硬件复杂性对我来说至关重要。我不执行除法,也不必担心 infs 和 NAN。
因此,我决定使用如上所述的二进制补码表示形式来使用浮点的自定义内部表示形式。有什么明显的缺点需要我注意吗?
这是一个经过深入研究的话题are使用 2 的补码浮点表示的系统;通常是 IEEE-754 之前的版本,尽管最近的版本也可用。有关此类系统特性的研究,请参阅本文:https://hal.archives-ouvertes.fr/hal-00157268/document https://hal.archives-ouvertes.fr/hal-00157268/document
Kahan 本人(IEEE754 标准的设计者)确实认为,单独的 +/-0 对于浮点通常使用的近似值很重要,其中浮点 0 结果本质上是正还是负很重要。看https://people.freebsd.org/~das/kahan86branch.pdf https://people.freebsd.org/%7Edas/kahan86branch.pdf了解详情。
所以,是的:完全有可能有 2 的补码浮点数;但标准选择了符号大小表示。无论你选择哪一个,有些操作会很容易,有些操作会比较困难;对比最明显。当然,如果您正在设计自己的硬件,没有什么可以阻止您选择最适合您需求的表示形式!特别是,您甚至可以使用所谓的 unum 和 posit ,其中指数和有效数部分不是固定大小,而是取决于您在范围内的位置。看这里:https://www.johndcook.com/blog/2018/04/11/anatomy-of-a-posit-number/ https://www.johndcook.com/blog/2018/04/11/anatomy-of-a-posit-number/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)