【问题标题】:Denormalized Numbers - IEEE 754 Floating Point非规范化数字 - IEEE 754 浮点
【发布时间】:2013-02-14 22:58:48
【问题描述】:

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

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

精度位数较少且较小的数字(在 幅度)比归一化数字

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

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

我读过:

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

有这方面的专家吗?

我也读过一篇文章

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

有这方面的专家吗?

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

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

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

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

使用非规范化数字是一件坏事,因为大多数应用程序不需要如此小的表示 - 精度损失是有害的,而且您可以通过将它们与规范化数字混合来太容易地打自己的脚,而性能不是在大多数情况下,物有所值。

对这两个答案有什么意见吗?关于非规范化数字,我还有什么遗漏或不了解的地方?

【问题讨论】:

标签: performance floating-point standards ieee-754


【解决方案1】:

本质上,非规范化的浮点数能够表示 可以用 SMALLEST(数量级)表示的数 任何浮点值。

没错。

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

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

  • 在我熟悉的任何处理器上混合次正常值和正常值不会比单独使用次正常值带来任何性能损失。
  • 虽然低于正常值的情况很少见,但在某些应用程序中它们出现的频率比预期的要高。当音频输入停止时,一种并不罕见的是回声效应(和其他信号处理过滤器)。如果没有新的输入来将值保持在正常范围内,过滤器中的残差值会随着时间的推移而减少并达到次正常范围。
  • 我喜欢x == yx - y == 0 的示例。对于 IEEE 浮点数(如果我们忽略非数和无穷大),减法是否具有此属性?我的意思是x - y == 0 仅当 x == y.
  • @JeppeStigNielsen 是的,它适用于所有 IEEE 浮点数,唯一的例外是 x,y = +inf,+infx,y = -inf,-inf。如果xy 是NaN,它就可以工作,因为在这种情况下x - y 是NaN,所以x - y == 0 是假的,而且x == y 根据定义也是假的。
  • 哇,谢谢!直到现在我才知道非正规数是什么。 +1
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 2012-01-06
  • 2014-10-18
  • 1970-01-01
  • 2013-07-24
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多