format - IEEE 754:格式的基本原理:次正规数和正规数
问题描述
有人可以澄清一下:
- 为什么次正规数的格式究竟是
±(0.F) × 2^-126
而不是±(1.F) × 2^-127
? - 为什么正常数字的格式是:
±(1.F) × 2^exp
而不是说±(11.F) × 2^exp
,或者说,±(10.F) × 2^exp
?
解决方案
浮点格式使用符号(− 或 +)、指数(在e min到e max的某个范围内的整数,包括)和有效数字表示数字,该数字是基数b中的p位数字,其中b是格式和p的固定基数称为精度。我们将考虑一种二进制格式,其中b为 2。
设有效数的位数为f 0 , f -1 , f -2 ,… f 1−<em>p,所以有效数为 sum −p<i≤0 f i •<em> bi,其值表示为 (−1) s •<em>b e •sum -p<i≤0 f i •<em>b i,其中s是符号位,e是指数。
如果f 0为零,我们可以从总和中省略它,表示的值等于(-1) s •<em> be •sum -p<i≤-1 f i •<em>b i = ( - 1) s •<em>b e -1 •sum -p<i≤-1 f i •<em>b i +1 = (-1) s •<em>b e -1 •sum 1-p< i≤0 f i -1 •<em>b i。因此,当f 0为零且e不是e min,数字有两种表示形式。对它们都进行编码会很浪费,因此我们需要一种不对这两种表示进行编码的编码方案。
我们做到了这一点:
- 某个值E对指数e进行编码。s和f -1到f 1-<em>p的值直接存储为位。
- 如果E为零,则e为e min且f 0为零。
- 如果E不为零,则e为E −<em>bias 且f 0为 1,其中偏差为 1−<em>e min。
- (可以保留一个特殊的E值来表示无穷大和 NaN,这里不再讨论。)
这种表示和这种编码方案回答了以下问题:
为什么次正规数的格式是 ±(0. F ) × 2 − 126而不是 ±(1.F) × 2 −127?
±(1.F) × 2 −127形式的次正规数将不包括零,并且将包括不在该格式表示的数字中的数字,因为它们的非零数字低于最低的非所选集合中的零位。(第一段中描述的形式的最低位对应于b e min +(1−<em>p),而形式为 ±(1.F) × 2 -127的数字的最低位对应于b e min −1+(1−<em>p) .)
为什么正常数字的格式是:±(1.F) × 2 exp而不是,比如说,±(11.F) × 2 exp,或者,比如说,±(10.F) × 2 exp?
小数点(或“小数点”)在有效数字中的位置无关紧要,只要它是固定的。如本文所用,在第一个数字之后使用小数点描述的表示等效于在最后一个数字之后或任何其他位置使用小数点的表示,并对指数范围进行适当调整:同一组数字是表示和算术性质是相同的。因此,在考虑 1.F 和 11.F 之间的差异时,我们不在乎小数点在哪里。但是,我们确实关心表示了多少位。浮点格式使用具有固定位数的表示。11.F 比 1.F 多一个数字,我们没有理由对其进行编码。
至于 11.F 和 10.F 之间的差异,之所以存在正常/次正常的区别是因为如果第一位数字为零且指数不是最小值,则在算术上存在相同数字的两种表示。将一种形式指定为标准形式允许我们消除这些重复的表示。但是 11.F 和 10.F 代表不同的数字,所以没有重复要消除,也没有理由说其中一个是正常的,另一个不是。
推荐阅读
- python - python-vlc - 不支持编解码器“h264”(H264 - MPEG-4 AVC(第 10 部分))
- java - 在 keytool 中导入证书并不能解决 java 证书问题
- c# - C# + Selenium:StaleElementReferenceException
- python - 默认参数设置为空 dict 充当 NoneType
- package.json - 更新配置“automerge”无法正常工作
- python - 如何在 Keras 中使用 float16 微调 resnet50?
- c# - 有什么方法可以反序列化派生类而不在我的模型中创建对 Json.NET 的依赖关系?
- android - 如何根据构建类型和构建风格管理配置
- sockets - ssl握手只能通过客户端证书验证而不是服务器证书验证来建立吗?
- python - 在多个 GPU 上训练单个 pytorch 模型并修复某些层?