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 == y
和x - y == 0
.如果x
并且y
很小但是不同并且你使用突然的下溢,那么如果它们的差异小于最小截止值,它们的差异将为零,因此违反了等价.
随着逐渐下溢,两个微小但不同的正常数字之间的差异变为非正规数,但仍然不为零.等价性得以保留.
因此,不建议故意使用非正规,因为它们仅在特殊情况下被设计为备用机制.