非规范化数字 - IEEE 754浮点数

dtm*_*and 14 floating-point performance standards ieee-754

因此,我试图了解更多关于浮点数的IEEE 754标准中定义的非规范化数字.由于Google搜索结果,我已经阅读了几篇文章,并且我已经阅读了几篇StackOverFlow帖子.但是我还有一些问题没有答案.

首先,回顾一下我对Denormalized float的理解:

具有较少精度位的数字,并且比标准化数字更小(数量级)

实质上,非规范化浮点数能够表示可以用任何浮点值表示的SMALLEST(幅度)数.

这听起来不对吗?还有什么呢?

我读过:

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

对此有何评论?

我也读过其中一篇文章

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

对此有何评论?

在IEEE标准的一些演示中,当呈现浮点范围时,排除非规格化值并将表标记为"有效范围",几乎就像演示者正在思考"我们知道非规范化数字CAN表示可能的最小浮动点值,但由于非规范化数字的某些缺点,我们选择将它们从更适合常见使用场景的范围中排除" - 好像非常规化数字不常用.

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

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

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

使用非规范化数字是一件坏事,因为大多数应用程序不需要如此小的表示 - 精确损失是有害的,并且你可以通过将它们与标准化数字混合来轻松地射击自己,并且性能不值得花费在多数情况下.

对这两个答案有何评论?还有哪些我可能会丢失或不理解非规范化数字?

Jef*_*Sax 15

实质上,非规范化浮点数能够表示可以用任何浮点值表示的SMALLEST(幅度)数.

那是正确的.

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

不同处理器的惩罚是不同的,但它可以达到2个数量级.原因?与此建议相同:

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

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

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

将法线与法线混合是很慢的,因为那时你正在混合格式,你还需要在两者之间进行转换.

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

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

换句话说.浮点数不是均匀分布的.在两个连续幂之间总是存在相同数量的数字:2 52(对于双精度).因此,如果没有非正规,您总是会得到0和最小浮点数之间的差距,该最小浮点数是最小两个数之间差值的2 52倍.非正规数均匀地填补了这个空白.

作为关于突然下降和逐渐下溢的影响的一个例子,请看数学等价x == yx - y == 0.如果x并且y很小但是不同并且你使用突然的下溢,那么如果它们的差异小于最小截止值,它们的差异将为零,因此违反了等价.

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

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

  • 虽然次正常值很少,但有些应用程序的出现频率高于预期.当音频输入停止时,不太罕见的是回声效果(和其他信号处理滤波器).如果没有新输入将值保持在正常范围内,则滤波器中的残余值会随着时间的推移而降低并达到低于正常范围. (2认同)