floating-point - 这个二进制乘法是如何完成的?
问题描述
我试图理解 Jason Gregory 的《游戏引擎架构》一书中关于 IEEE 754 格式的摘录。麻烦的部分如下:
您可以在此免费示例中找到此摘录所属的章节。
给定二进制乘法 0x00FFFFFF x 2^127,我预计第一个操作数的右侧会添加 127 个二进制零,但实际上只添加了 104 个二进制零 (127 - 23)。为什么要删除这 23 个零?
解决方案
书错了。有效数字的 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 确实定义了其他舍入方法。
推荐阅读
- reactjs - React Material-ui按钮禁用属性不起作用
- powershell - 使用 Powershell 将 CSV 目录中的列与标题相加
- javascript - 分配给布尔值的变量不会回显到 PHP 中的网页
- javascript - 使用 Sequalize 按连接表计数列排序
- docker - webdevops nginx - 从 url 中删除 .php 要求
- reporting-services - SSRS 聚合函数只能用于页眉
- javascript - 绘制多个对象时,什么时候创建一个新的顶点数组对象?
- python - 向颜色条图添加辅助独立轴
- javascript - Proxy() 块作用域 - Javascript
- sql - 如何避免这种联合选择