首页 > 解决方案 > 这个二进制乘法是如何完成的?

问题描述

我试图理解 Jason Gregory 的《游戏引擎架构》一书中关于 IEEE 754 格式的摘录。麻烦的部分如下:

您可以在此免费示例中找到此摘录所属的章节。

给定二进制乘法 0x00FFFFFF x 2^127,我预计第一个操作数的右侧会添加 127 个二进制零,但实际上只添加了 104 个二进制零 (127 - 23)。为什么要删除这 23 个零?

标签: floating-pointbit-manipulation

解决方案


书错了。有效数字的 24 位(1 由指数字段是零还是非零编码,23 明确存储在有效数字字段中)被正确解释为前导位,后跟小数点,后跟 23 位。因此,如果 24 位为 0xffffff,则数学有效数为 0x1.fffffe,当指数字段为 254(其编码指数值 127)时表示的值为 0x1.fffffe • 2 127

以下文本关于最小浮点值也是错误的。它呈现的二进制表示,0x00800000,是最小的正常值。还有一些较小的值,称为次正常值。IEEE-754 32位二进制浮点值中可表示的最小非零值的表示为0x00000001,其表示的值为2 -149

之后的文本对机器 epsilon 的定义不正确,断言它是满足 1+≠1 的最小浮点值。机器 epsilon 的正确定义是它是 1 与最小可表示值之间的差值更大比 1。这些定义不同,因为如果是正确的机器 epsilon,则x略大于 ½ 的值将满足 1+ x ≠ 1,因为在计算 1+ x期间会发生舍入,导致它向上舍入到 1+向下到 1。

该段还错误地说明了添加小于操作的值的方式,指出较小的值将被“砍掉”。最常见的是,浮点运算舍入到最接近的可表示值,尽管 IEEE-754 确实定义了其他舍入方法。


推荐阅读