因此,我试图了解更多关于浮点数的IEEE 754标准中定义的非规范化数字 . 由于Google搜索结果,我已经阅读了几篇文章,并且我已经阅读了几篇StackOverFlow帖子 . 但是我还有一些问题没有答案 .
首先,回顾一下我对Denormalized float的理解:
具有较少精度位的数字,并且比标准化数字更小(数量级)
实质上,非规范化浮点数能够表示可以用任何浮点值表示的SMALLEST(幅度)数 .
Does that sound correct? Anything more to it than that?
我读过:
使用非规范化数字会在许多平台上带来性能成本
Any comments on this?
我也读过其中一篇文章
应该“避免规范化和非规范化数字之间的重叠”
Any comments on this?
在IEEE标准的一些演示中,当呈现浮点范围时,排除非规格化值并将表标记为“有效范围”,几乎就像演示者正在思考“我们知道非规范化数字CAN表示可能的最小浮动点值,但由于非规范化数字的某些缺点,我们选择将它们从更适合常见使用场景的范围中排除“ - 好像非常规化数字不常用 .
I guess I just keep getting the impression that using denormalized numbers turns out to not be a good thing in most cases?
如果我必须自己回答这个问题,我会想:
使用非规格化数字是好的,因为您可以表示可能的最小(数量级)数字 - 只要精度不重要,并且您不将它们与标准化数字混合,并且应用程序的最终性能符合要求 .
使用非规范化数字是一件坏事,因为大多数应用程序不需要如此小的表示 - 精确损失是有害的,并且你可以通过将它们与标准化数字混合来轻松地射击自己,并且性能不值得花费在多数情况下 .
Any comments on these two answers? What else might I be missing or not understand about denormalized numbers?
1 回答
那是正确的 .
不同处理器的惩罚是不同的,但它可以达到2个数量级 . 原因?与此建议相同:
这是关键: denormals are a fixed-point "micro-format" within the IEEE-754 floating-point format . 在正常数字中,指数表示二进制点的位置 . 非正规数包含定点表示法中的最后52位,双精度指数为2-1074 .
因此,非正规数很慢,因为它们需要特殊处理 . 在实践中,它们很少发生,芯片制造商不喜欢在极少数情况下花费太多宝贵的资源 .
将法线与法线混合是很慢的,因为那时你正在混合格式,你还需要在两者之间进行转换 .
非正规用于一个主要目的: gradual underflow . 这是一种保持微小数字之间相对差异的方法 . 如果直接从最小的正常数到零(突然下溢),则相对变化是无限的 . 如果你在下溢时去非正规数,相对变化仍然不完全准确,但至少更合理 . 这种差异出现在计算中 .
换句话说 . 浮点数不是均匀分布的 . 在两个连续幂之间总是存在相同数量的数字:252(对于双精度) . 因此,如果没有非正规,您总是会得到0和最小浮点数之间的差距,该最小浮点数是最小两个数之差的252倍 . 非正规数均匀地填补了这个空白 .
作为关于突然下降和逐渐下溢的影响的示例,请查看数学上等效的
x == y
和x - y == 0
. 如果x
和y
很小但是不同而你使用突然下溢,那么如果它们的差值小于最小截止值,它们的差值将为零,因此违反了等价 .随着逐渐下溢,两个微小但不同的正常数字之间的差异得以实现是一个非常规,仍然不是零 . 等价性得以保留 .
所以, using denormals on purpose is not advised, because they were designed only as a backup mechanism in exceptional cases .