首页 文章

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

提问于
浏览
14

因此,我试图了解更多关于浮点数的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 回答

  • 14

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

    那是正确的 .

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

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

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

    这是关键: denormals are a fixed-point "micro-format" within the IEEE-754 floating-point format . 在正常数字中,指数表示二进制点的位置 . 非正规数包含定点表示法中的最后52位,双精度指数为2-1074 .

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

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

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

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

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

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

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

    所以, using denormals on purpose is not advised, because they were designed only as a backup mechanism in exceptional cases .

相关问题