16

因此,我正在尝试了解有关 IEEE 754 浮点数标准中定义的非规范化数字的更多信息。感谢 Google 搜索结果,我已经阅读了几篇文章,并且浏览了几篇 StackOverFlow 帖子。但是,我还有一些问题没有得到解答。

首先,回顾一下我对非规范化浮点数的理解:

具有较少位精度的数字,并且比规范化数字更小(在数量上)

本质上,非规范化浮点数能够表示可以用任何浮点值表示的最小(幅度)数。

这听起来正确吗?还有什么比这更重要的吗?

我读过:

在许多平台上使用非规范化数字会带来性能成本

对此有何评论?

我也在其中一篇文章中读到

一个人应该“避免规范化和非规范化数字之间的重叠”

对此有何评论?

在 IEEE 标准的某些演示文稿中,当呈现浮点范围时,会排除非规范化值,并且将表格标记为“有效范围”,几乎就像演讲者在想“我们知道非规范化数字可以代表最小可能的浮点数点值,但由于非规范化数字的某些缺点,我们选择将它们排除在更适合常见使用场景的范围之外”——好像非规范化数字不常用。

我想我只是一直觉得在大多数情况下使用非规范化数字并不是一件好事?

如果我必须自己回答这个问题,我会想:

使用非规范化数字很好,因为您可以表示可能的最小(数量级)数字——只要精度不重要,并且您不将它们与规范化数字混淆,并且应用程序的最终性能符合要求。

使用非规范化数字是一件坏事,因为大多数应用程序不需要这么小的表示 - 精度损失是有害的,而且你可以通过将它们与规范化数字混合起来太容易自取其辱,而且性能不值得付出代价大多数情况下。

对这两个答案有何评论?关于非规范化数字,我还可能遗漏或不了解什么?

4

1 回答 1

17

本质上,非规范化浮点数能够表示可以用任何浮点值表示的最小(幅度)数。

那是对的。

在许多平台上使用非规范化数字会带来性能成本

不同处理器的惩罚不同,但最高可达 2 个数量级。原因?与此建议相同:

一个人应该“避免规范化和非规范化数字之间的重叠”

这是关键:非正规是 IEEE-754 浮点格式中的定点“微格式”。在普通数字中,指数表示二进制点的位置。非正规数包含定点表示法中的最后 52 位,双精度数的指数为 2 -1074

因此,非规范化很慢,因为它们需要特殊处理。在实践中,它们很少发生,芯片制造商不喜欢在罕见的情况下花费太多宝贵的资源。

将非正规与法线混合很慢,因为您正在混合格式并且您需要在两者之间进行转换的额外步骤。

我想我只是一直觉得在大多数情况下使用非规范化数字并不是一件好事?

非规范化是为了一个主要目的而创建的:逐渐下溢。这是一种使微小数字之间的相对差异保持较小的方法。如果从最小的正常数直接到零(突然下溢),则相对变化是无限的。如果您在下溢上进行非规范化,则相对变化仍然不完全准确,但至少更合理。这种差异体现在计算中。

换一种说法。浮点数不是均匀分布的。2 的连续幂之间总是有相同数量的数字:2 52(对于双精度)。因此,如果没有非规范化,您总是会在 0 和最小浮点数之间出现差距,即 2 52乘以最小的两个数字之间的差异。非正规均匀地填补了这个空白。

作为关于突然下溢与逐渐下溢影响的示例,请查看数学上等价的x == yx - y == 0。如果xy很小但不同,并且您使用突然下溢,则如果它们的差小于最小截止值,则它们的差将为零,因此违反了等价性。

随着逐渐下溢,两个微小但不同的正常数之间的差异变为非正规数,仍然不为零。等价性被保留。

因此,不建议故意使用非规范化,因为它们仅被设计为特殊情况下的备用机制

于 2013-02-28T17:51:17.067 回答